В selenium java: невозможно переключиться на модальный role="dialog", отображаемый на странице

Открываю страницу здесь: страница

Я не могу нажать на диалоговое окно cookie!

Я также не вижу iframe или окна оповещения. Я пробовал getWindowHandles, но безуспешно.

Это мой тест на селен:

package org.leder;


import dev.failsafe.internal.util.Assert;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.Iterator;
import java.util.Set;

public class MainTest {

    public static final String ALDI_ONLINESHOP_GUTES_FÜR_ALLE = "ALDI ONLINESHOP - Gutes für alle";

    @Test
    public void loginLogoutTest() {
        WebDriver driver = new ChromeDriver();

        Wait<WebDriver> wait = new WebDriverWait(driver, Duration.ofSeconds(15));

        driver.get("https://aldi-onlineshop.de");

        String title = driver.getTitle();

        System.out.println(title);

        Assert.isTrue(title.equals(ALDI_ONLINESHOP_GUTES_FÜR_ALLE), "Title is valid");

        wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("data-testid='uc-default-wall'")));


        String parent = driver.getWindowHandle();

        Set<String> s = driver.getWindowHandles();


        // Now iterate using Iterator
        Iterator<String> I1 = s.iterator();

        driver.switchTo().window(I1.next());


        WebElement submitButton = driver.findElement(By.cssSelector("data-testid='uc-accept-all-button'"));


        submitButton.click();

        //switch to the parent window
        driver.switchTo().window(parent);

        WebElement loginMenu = driver.findElement(By.cssSelector("[data-attr-value='My Account']"));

        loginMenu.click();



        driver.quit();
    }
}

Я ожидаю, что будет выбран модальный диалог и будет нажата кнопка. Я получаю сообщение об ошибке в значении CSS модального диалога:

org.openqa.selenium.JavascriptException: javascript error: {"status":32,"value":"An invalid or illegal selector was specified"}
  (Session info: chrome=123.0.6312.122)
Build info: version: '4.20.0', revision: '866c76ca80'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '6.6.26-1-MANJARO', java.version: '17.0.10'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Command: [4ffbffb982d379cb84581e3add5c448d, findElement {value=data-testid='uc-default-wall', using=css selector}]
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 123.0.6312.122, chrome: {chromedriverVersion: 123.0.6312.122 (31f8248cdd9..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:40857}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(), se:cdp: ws://localhost:40857/devtoo..., se:cdpVersion: 123.0.6312.122, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}
Session ID: 4ffbffb982d379cb84581e3add5c448d

и это

driver.switchTo().alert().accept();

дает это

org.openqa.selenium.NoAlertPresentException: no such alert

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что два ваших селектора CSS недействительны. Вот причина ошибки, например.

data-testid='uc-default-wall'
data-testid='uc-accept-all-button'

следует заключать в скобки, например.

[data-testid='uc-default-wall']
[data-testid='uc-accept-all-button']

Ваш последний селектор CSS имеет правильный синтаксис.


Предложения...

  1. Не называйте переменные в соответствии с тем, что они содержат, например.

    public static final String ALDI_ONLINESHOP_GUTES_FÜR_ALLE = "ALDI ONLINESHOP - Gutes für alle";
    

    Вместо этого назовите его в честь того, что он представляет, например, заголовка домашней страницы, например.

    public static final String HOME_PAGE_TITLE = "ALDI ONLINESHOP - Gutes für alle";
    
  2. Не используйте Assert.isTrue(), чтобы проверить, верны ли два значения. Он предназначен для проверки boolean, например.

    boolean isTrue = true;
    Assert.assertTrue(isTrue, "It's true");
    

    При сравнении двух значений, как в данном случае при сравнении двух строк, вместо этого используйте Assert.assertEquals(), например.

    Assert.assertEquals(driver.getTitle(), home_page_title, "Title is valid");
    

    Таким образом, если заголовок страницы изменится, вы получите сообщение типа

    Title is valid expected [ALDI ONLINESHOP - The old title] but found [ALDI ONLINESHOP - Gutes für alle]
    

    вместо

    Title is valid expected [true] but found [false]
    

    что бесполезно.

Спасибо! Я заключил селекторы CSS в квадратные скобки. На странице я все еще получаю unable to locate element для двух селекторов CSS. Почему?

Leder 11.05.2024 08:22

Ядро этой страницы находится внутри теневого корня. Selenium рассматривает его как своего рода IFRAME. См. это для получения дополнительной информации.

JeffC 11.05.2024 16:29

Пожалуйста, уточните: что такое CSS-селектор теневого хоста? Я не могу выбрать контейнер с помощью селектора CSS "[data-testid='uc-buttons-container']" или контейнер с помощью селектора CSS "#uc-center-container"

Leder 13.05.2024 12:05

Это элемент непосредственно над #shadow-root, то есть <div id = "usercentrics-root" data-created-at = "1715608050251" style = "">, который имеет идентификатор, то есть By.id("usercentrics-root").

JeffC 13.05.2024 15:50

Другие вопросы по теме