Я тестирую функциональность Reddit, используя Java/Selenium/TestNG.
Мне очень трудно найти элемент кнопки «Присоединиться» на r/SoftwareEngineering. Сегодня утром мне показалось, что все идентификаторы элементов и CSS-селекторы, которые у меня работали раньше, просто перестали работать. Я не менял никакого кода и ничего не менял в драйвере браузера, который использую. Итак, я начал сначала.
Теперь мне удалось войти в систему, использовать панель поиска и перейти к r/SoftwareEngineering. Я хочу присоединиться к сабвуферу с помощью кнопки «Присоединиться». Однако я не могу его найти. Оно гнездится в теневых корнях. Вчера мне помогли с использованием вложенных теневых корней для поиска элементов.
Теперь кажется, что элементы теневого корня просто исчезают случайным образом. То есть мне удалось найти теневой корень изначально, используя следующий код:
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>
Любая помощь приветствуется!




Я не уверен, откуда возникла ваша проблема, но я изначально написал свой код из зарегистрированной учетной записи. Когда я запустил сценарий, обнаружилось, что теневой корневой узел отсутствует. Возможно, вы не знаете, но 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());
Это сработало! Я тоже не уверен, откуда возникла эта проблема. Код у меня работал позавчера вечером, а вчера — нет. Это произошло с несколькими написанными мною тестами. Некоторые селекторы и идентификаторы изменились за одну ночь. Я не знаю, были ли страницы обновлены по счастливой случайности или что-то в этом роде, но я хоть убей не мог заставить эту кнопку присоединения работать без второй пары глаз.