获取元素文本时的陈旧元素错误

时间:2017-09-07 12:16:43

标签: selenium webdriver

我想得到li(second)元素的文本如下。代码能够找到元素但是在获取gettext时抛出错误。请帮忙。

WebElement element = driver.findElement(By.xpath("//div[contains(@id,'location_group')]/div/ul/li[2]"));

element.getText();

错误

  

陈旧元素引用:元素未附加到页面文档

HTML

<div id=location_group>
  <div>
    <ul class="og-tooltip js-og-tooltip" style="display: none; opacity: 100;">
      <li class="title_text">Organization Group</li>
      <li class="value_text" style="background: rgb(204, 136, 136); border: 2px solid red;">Global / Aricent / gemsecure </li>
      <li>&nbsp;</li>
      <li class="title_text">Group ID</li>
      <li class="value_text">gemsecure</li>
    </ul>
  </div>
</div>

4 个答案:

答案 0 :(得分:0)

我建议您使用xPath。我想我已经尝试了Java硒库中的每个解决方案,因此我的网站上有棘手的选择-一旦用户选择了一个选项,就会重新加载这些选项(例如,选定的值有时会消失,有时加载的不同选项取决于特定的选择)。 许多过时的元素异常。 我用过的:


    private WebElement getDesiredOptionByVisibleText(WebDriver driver, String selectId, String text) {
        List<WebElement> options = driver.findElements(By.xpath("//select[@id='" + selectId 
+ "']/option[contains(text(),'" + text + "')]"));
        if (options == null || options.size() == 0) {
            return null;
        } else {
            return options.get(0);
        }
    }

尤其是在等待时使用此方法,例如我的等待:


    private void waitUntilDesiredOptionVisible(WebDriver driver, String selectId) {
        getFluentWait(driver).until(d -> (getDesiredOptionByVisibleText(driver, selectId, value) != null));
    }

    public static FluentWait<WebDriver> getFluentWait(WebDriver driver) {
        return new FluentWait<>(driver)
            .withTimeout(Duration.ofSeconds(60))
            .pollingEvery(Duration.ofMillis(100));
    }

最后但并非最不重要的一点是点击该选项。

    private void selectByVisibleTextRegex(WebDriver driver, String selectId) {
        WebElement option = getDesiredOptionByVisibleText(driver, selectId, value);
        if (option == null) {
            throw new NoSuchElementException(String.format("Cannot locate element with text like: %s.", value));
        }
        option.click();
    }

答案 1 :(得分:-1)

因为这个元素用一个带有display的ul包装:none selenium不能与它交互。 尝试的选项:

element.getAttribute("innerHTML");

或者您可以使用 JavascriptExecutor

 JavascriptExecutor executor = (JavascriptExecutor)driver;
 String text= executor.executeScript("document.document.getElementsByClassName('value_text')[0].innerHTML");

另一个选择是使用querySelector / querySelectorAll,它比getElementsByClassName

具有更广泛的支持

答案 2 :(得分:-1)

可能你必须等待父元素可见然后与它交互

WebElement elementUL = driver.findElement(By.xpath("//div[contains(@id,'location_group')]/div/ul"));
WebDriverWait wait=new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOf(elementUL));

WebElement element = driver.findElement(By.xpath("//div[contains(@id,'location_group')]/div/ul/li[2]"));

element.getText();

答案 3 :(得分:-1)

放置明确的等待WebDriverWait并等待元素可见

WebElement ele = driver.findElement(By.xpath("Your locator "));
WebDriverWait wait=new WebDriverWait(driver, 25);
wait.until(ExpectedConditions.visibilityOf(ele));

然后getText()