Текст xPath содержит веб-драйвер Selenium

Oct 27 2020

Я пытаюсь выбрать элемент на основе его текстового содержимого. Для этого я использую XPath.

Я просто озадачен, как это должно работать?

WebElement link = obj.driver.findElement(By.xpath("//div[contains(text(), 'Notifications')]")); 

Я даже скопирую HTML-код:

<div class="linkWrap noCount">Notifications&nbsp;<span class="count _5wk0 hidden_elem uiSideNavCountText">(<span class="countValue fsm">0</span><span class="maxCountIndicator"></span>)</span></div>

В элементе div есть слова «Уведомления» внутри. Так почему это не работает?

Перейдите на эту страницу в Facebook: https://www.facebook.com/settings

Используйте это расширение Chrome, чтобы выделить любую область через xPath.

Ответы

DMart Oct 27 2020 at 18:12

Перед словом Уведомления стоит пробел:

WebElement link = obj.driver.findElement(By.xpath("//div[contains(text(), 'Notifications')]"));    

Вы также должны добавить элемент wait for, прежде чем пытаться найти элемент:

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(text(), 'Notifications')]"));

WebElement link = obj.driver.findElement(By.xpath("//div[contains(text(), 'Notifications')]")); 
JackTrowbridge Oct 29 2020 at 20:21

Я нашел проблему с помощью замечательных людей в этом сообществе.

Итак, мой элемент был в iFrame.

Чтобы получить доступ к элементу, я должен сначала получить доступ к iFrame

WebElement iframe = obj.driver.findElement(By.xpath("//iframe[@tabindex='-1']"));
    
obj.driver.switchTo().frame(iframe);