Открываю страницу здесь: страница
Я не могу нажать на диалоговое окно 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




Проблема в том, что два ваших селектора CSS недействительны. Вот причина ошибки, например.
data-testid='uc-default-wall'
data-testid='uc-accept-all-button'
следует заключать в скобки, например.
[data-testid='uc-default-wall']
[data-testid='uc-accept-all-button']
Ваш последний селектор CSS имеет правильный синтаксис.
Предложения...
Не называйте переменные в соответствии с тем, что они содержат, например.
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";
Не используйте 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]
что бесполезно.
Ядро этой страницы находится внутри теневого корня. Selenium рассматривает его как своего рода IFRAME. См. это для получения дополнительной информации.
Пожалуйста, уточните: что такое CSS-селектор теневого хоста? Я не могу выбрать контейнер с помощью селектора CSS "[data-testid='uc-buttons-container']" или контейнер с помощью селектора CSS "#uc-center-container"
Это элемент непосредственно над #shadow-root, то есть <div id = "usercentrics-root" data-created-at = "1715608050251" style = "">, который имеет идентификатор, то есть By.id("usercentrics-root").
Спасибо! Я заключил селекторы CSS в квадратные скобки. На странице я все еще получаю
unable to locate elementдля двух селекторов CSS. Почему?