Reddit.com NoSuchShadowRootException — но есть теневой корень

Я тестирую функциональность Reddit, используя Java/Selenium/TestNG.

Мне очень трудно найти элемент кнопки «Присоединиться» на r/SoftwareEngineering. Сегодня утром мне показалось, что все идентификаторы элементов и CSS-селекторы, которые у меня работали раньше, просто перестали работать. Я не менял никакого кода и ничего не менял в драйвере браузера, который использую. Итак, я начал сначала.

Теперь мне удалось войти в систему, использовать панель поиска и перейти к r/SoftwareEngineering. Я хочу присоединиться к сабвуферу с помощью кнопки «Присоединиться». Однако я не могу его найти. Оно гнездится в теневых корнях. Вчера мне помогли с использованием вложенных теневых корней для поиска элементов.

Автоматизация тестирования с использованием Selenium, TestNT, Java — Reddit.com — кнопка «Войти» во всплывающем окне

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

WebElement joinButton = driver.findElement(By.xpath("/html/body/shreddit-app/dsa-transparency-modal-provider/report-flow-provider/div/div[1]/div[1]/section/div/div[2]/shreddit-subreddit-header-buttons"));
SearchContext shadowRoot = joinButton.getShadowRoot();
joinButton = joinButton.findElement(By.xpath("//div/faceplate-tracker/shreddit-join-button//button"));

Но каким-то образом в следующий раз, когда я запустил тест, я получил исключение NoSuchShadowRootException, хотя явно имеется теневой корень.

<shreddit-join-button button-classes = "px-sm py-xs" subscribe-label = "Join" unsubscribe-label = "Joined" unsubscribe-button-type-override = "bordered" name = "SoftwareEngineering" subreddit-id = "t5_2qmng" buttonsize = "medium">
    #shadow-root (open) ==$0
    <!---->
    <button class = " button-primary button-medium button join-btn leading-none px-sm py-xs " data-post-click-location = "join">
     <!--?lit$173368049$-->
    "Join"
    </button>
</shreddit-join-button>

Любая помощь приветствуется!

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

Ответы 1

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

Я не уверен, откуда возникла ваша проблема, но я изначально написал свой код из зарегистрированной учетной записи. Когда я запустил сценарий, обнаружилось, что теневой корневой узел отсутствует. Возможно, вы не знаете, но Selenium, по крайней мере по умолчанию, запускает браузер без профиля, поэтому я не входил в систему, а HTML немного отличался. В любом случае, как только я понял, что обновил свой код с помощью браузера, запущенного Selenium, и получил код ниже. Я не нажимал кнопку «Присоединиться», но распечатал текст на кнопке, чтобы убедиться, что это действительно правильная кнопка.

String url = "https://www.reddit.com/r/SoftwareEngineering/";

driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get(url);

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement shadowHost1 = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("shreddit-app")));
shadowHost1.getShadowRoot();
WebElement shadowHost2 = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("dsa-transparency-modal-provider")));
shadowHost2.getShadowRoot();        
WebElement shadowHost3 = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("shreddit-subreddit-header-buttons")));
SearchContext shadowRoot4 = shadowHost3.getShadowRoot();
WebElement shadowHost5 = shadowRoot4.findElement(By.cssSelector("shreddit-join-button"));
SearchContext shadowRoot5 = shadowHost5.getShadowRoot();
WebElement joinButton = shadowRoot5.findElement(By.cssSelector("button"));
System.out.println(joinButton.getText());

Это сработало! Я тоже не уверен, откуда возникла эта проблема. Код у меня работал позавчера вечером, а вчера — нет. Это произошло с несколькими написанными мною тестами. Некоторые селекторы и идентификаторы изменились за одну ночь. Я не знаю, были ли страницы обновлены по счастливой случайности или что-то в этом роде, но я хоть убей не мог заставить эту кнопку присоединения работать без второй пары глаз.

Jeremy 09.04.2024 14:24

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