Драйвер Selenim Chrome не может найти вложенные теги ‹li›

Я пытаюсь найти вложенный тег nl, который не может быть получен из запроса by.xpath.

Вот моя соответствующая строка кода на java.

driver.findElement(By.xpath("//div[@id='navbarNav']/following-sibling::ul[1]/li[2]")).click();

`Я хочу сопоставить:

<a class="sub-nav-link style-scope app-shell active" href="#/trend-analysis/tag-search">Trend Analysis

Ошибка:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@id='navbarNav']/following-sibling::ul[1]"}
  (Session info: headless chrome=85.0.4183.102)
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.14.0', revision: 'aacccce0', time: '2018-08-02T20:13:22.693Z'
System info: host: 'root', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-118-generic', java.version: '1.8.0_265'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 85.0.4183.102, chrome: {chromedriverVersion: 85.0.4183.87 (cd6713ebf92fa..., userDataDir: /tmp/.com.google.Chrome.qnBVf1}, goog:chromeOptions: {debuggerAddress: localhost:35357}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:virtualAuthenticators: true}
Session ID: 99a0f9193871a6e94151d885c331875d
*** Element info: {Using=xpath, value=//div[@id='navbarNav']/following-sibling::ul[1]}
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
        at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
        at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
        at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
        at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:548)
        at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:322)
        at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:424)
        at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
        at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:314)
        at GettingStarted.main(GettingStarted.java:96)

Соответствующий HTML:

<div class="collapse navbar-collapse style-scope app-shell" id="navbarNav">
                <ul class="app-nav navbar-nav mr-auto style-scope app-shell">
                    <li class="nav-item style-scope app-shell">
                        <a class="nav-link p-3 px-4 style-scope app-shell" href="/#/dashboard">Dashboard</a>
                    </li>
                    <li class="nav-item style-scope app-shell">
                        <a class="nav-link py-3 px-4 style-scope app-shell active" href="/#/trend-analysis/tag-search">TrendAnalysis</a>
                        <ul class="sub-nav d-flex flex-row flex-nowrap list-unstyled style-scope app-shell">
                            <li class="sub-nav-item style-scope app-shell">
                                <a class="sub-nav-link style-scope app-shell active" href="#/trend-analysis/tag-search">
                                    Trend Analysis
                                </a>
                            </li>
                            <li class="sub-nav-item style-scope app-shell">
                                <a class="sub-nav-link style-scope app-shell" href="#/trend-analysis/value-based-search">
                                    Value-Based Search
                                </a>
                            </li>
                  .....

Я потратил целую неделю на устранение проблемы, но безрезультатно, любезно помогите, спасибо.

Я тестировал код с помощью

WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='navbarNav']/ul")));

driver.findElement(By.xpath("//div[@id='navbarNav']//li/a[contains(@href,'tag-search')]")).click();

Обновлять:

Exception in thread "main" org.openqa.selenium.TimeoutException: Expected condition failed: waiting for element to be clickable: By.xpath: //div[@id='navbarNav']/ul (tried for 30 second(s) with 500 milliseconds interval)
Build info: version: '3.14.0', revision: 'aacccce0', time: '2018-08-02T20:13:22.693Z'
System info: host: 'root', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-118-generic', java.version: '1.8.0_265'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 85.0.4183.102, chrome: {chromedriverVersion: 85.0.4183.87 (cd6713ebf92fa..., userDataDir: /tmp/.com.google.Chrome.7m6LU4}, goog:chromeOptions: {debuggerAddress: localhost:38779}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:virtualAuthenticators: true}
Session ID: 6e2d32881f709e2e0d727d8cc45813c4
        at org.openqa.selenium.support.ui.WebDriverWait.timeoutException(WebDriverWait.java:113)
        at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:283)
        at GettingStarted.main(GettingStarted.java:103)

Обновление 2:

когда я запускаю код с помощью:

driver.findElement(By.xpath("//div[@id='navbarNav']//li/a[contains(@href,'tag-search')]")).click();

Я получил:

Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: element not interactable
  (Session info: headless chrome=85.0.4183.102)

person user316389    schedule 25.09.2020    source источник


Ответы (3)


Подождите, прежде чем щелкнуть элемент.

String myElement = "(//div[@id='navbarNav']//li/a[contains(@href,'tag-search')])[1]";    
WebDriverWait wait = new WebDriverWait(driver, 30);
 wait.until(ExpectedConditions.elementToBeClickable(By.xpath(myElement)));

or

wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(myElement)));

or

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(myElement)));

Вам также необходимо настроить таргетинг на правильный элемент привязки с помощью xpath.

driver.findElement(By.xpath(myElement)).click()
person Sureshmani Kalirajan    schedule 25.09.2020
comment
Я обновил свои вопросы с новой ошибкой из вашего предложения. - person user316389; 25.09.2020
comment
Спасибо, но у меня такая же ошибка waiting for element to be clickable - person user316389; 25.09.2020
comment
Попробуйте использовать другое ExpectedConditions, например, availabilityOfElementLocated (). - person Sureshmani Kalirajan; 25.09.2020
comment
Кроме того, еще одна проблема - tag-search не является уникальным, поскольку первое вхождение tag-search находится в /html/body/app-shell/nav/div/ul[1]/li[2]/a, а второе - в /html/body/app-shell/nav/div/ul[1]/li[2]/ul/li[1]/a, я считаю, что именно поэтому он не соответствует ему ... мне нужно ограничить его совпадение первым. - person user316389; 25.09.2020
comment
Обновлен xpath, чтобы получить первое появление. - person Sureshmani Kalirajan; 25.09.2020

Проверьте с помощью Threads.sleep (10), что либо с этим временем элемент доступен для щелчка, либо нет, если элемент не является интерактивным, это должен быть неправильный xpath, который вы делаете.

Но если он щелкает, то используйте 2 ожидания рядом, например:

String myElement = "(//div[@id='navbarNav']//li/a[contains(@href,'tag-search')])[1]";    
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(myElement)));
wait.until(ExpectedConditions.elementToBeClickable(By.xpath(myElement)));
driver.findElement(By.xpath(myElement)).click()
person taimoor pasha    schedule 25.09.2020
comment
Исключение в потоке main org.openqa.selenium.TimeoutException: ожидаемое условие не выполнено: ожидание кликабельности элемента: By.xpath: (// div [@ id = 'navbarNav'] // li / a [contains (@href, 'tag-search')]) [1] (пробовали в течение 30 секунд с интервалом 500 миллисекунд) - person user316389; 26.09.2020
comment
Вы пытались с помощью Threads.sleep проверить, щелкает ли элемент, который вы передаете, или нет? @USE - person taimoor pasha; 26.09.2020

Чтобы click() в элементе с текстом как Анализ тенденций, вы можете использовать любой из следующих Стратегии поиска:

  • linkText:

    driver.findElement(By.linkText("Trend Analysis")).click();
    
  • partialLinkText:

    driver.findElement(By.partialLinkText("Trend Analysis")).click();
    
  • cssSelector:

    driver.findElement(By.cssSelector("div#navbarNav li.sub-nav-item.style-scope.app-shell>a[href$='tag-search']")).click();
    
  • xpath:

    driver.findElement(By.xpath("//div[@id='navbarNav']//li[@class='sub-nav-item style-scope app-shell']/a[contains(@href, 'tag-search')][contains(., 'Trend Analysis')]")).click();
    

В идеале, чтобы click() для элемента, который вам нужно вызвать WebDriverWait для elementToBeClickable(), и вы можете использовать любое из следующих Стратегии поиска:

  • linkText:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Trend Analysis"))).click();
    
  • partialLinkText:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.partialLinkText("Trend Analysis"))).click();
    
  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div#navbarNav li.sub-nav-item.style-scope.app-shell>a[href$='tag-search']"))).click();
    
  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='navbarNav']//li[@class='sub-nav-item style-scope app-shell']/a[contains(@href, 'tag-search')][contains(., 'Trend Analysis')]"))).click();
    
person DebanjanB    schedule 25.09.2020
comment
Кажется, я пробовал большую часть примера, который вы поделились выше, и мой код не работает с org.openqa.selenium.TimeoutException: Expected condition failed: waiting for element to be clickable: By.linkText: Trend Analysis (tried for 20 second(s) with 500 milliseconds interval) для ExpectedConditions и org.openqa.selenium.ElementNotInteractableException: element not interactable при использовании функции findElement. - person user316389; 26.09.2020