当我使用sleep()而不是显式等待时,可以获得元素的内容

时间:2019-05-28 06:45:16

标签: selenium selenium-webdriver sleep webdriverwait

我正在尝试获取元素的内容。在获取内容声明之前,我已经实现了20秒的明确等待。但是我无法获取内容。如果我使用sleep()2秒钟,则可以获取元素的内容。我尝试的代码是:

WebDriverWait wait1 = new WebDriverWait(driver,20);
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("XPath")));
String value = driver.findElement(By.xpath("xpath")).getAttribute("text-content");
System.out.println("Value is : " + value);

Output - Value is : 

sleep()的代码:

WebDriverWait wait1 = new WebDriverWait(driver,20);
Thread.sleep(2000);
String value = driver.findElement(By.xpath("xpath")).getAttribute("text-content");
System.out.println("Value is : " + value);

Output - Value is : $0.00

如果我也使用隐式等待,则无法获得该值。建议不要使用sleep()。使用显式等待始终是最佳实践。为什么我没有通过显式等待来获取元素的内容?

3 个答案:

答案 0 :(得分:1)

相关的HTML可以帮助我们以更好的方式调试问题。但是,由于所需文本包含 $ 字符,因此一种更好的方法是诱使 WebDriverWait 进行期望,以检查元素中是否存在给定文本< / em>,则可以使用以下任一解决方案:

  • textToBePresentInElementLocated

    System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.textToBePresentInElementLocated(By.xpath("xpath"), "$")).getAttribute("text-content"));
    
  • textToBePresentInElementValue

    System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.textToBePresentInElementValue(By.xpath("xpath"), "$")).getAttribute("text-content"));
    

答案 1 :(得分:0)

您得到什么错误?似乎该元素无法正确加载。可能会发生一些动画,例如弹出窗口关闭,表格加载等。通常,如果您知道这些动画需要多长时间,就可以进入睡眠状态。

您也可以尝试fluentwait,但是如果正在进行动画,则可能仍然会出现异常,例如驱动程序无法单击某个元素。

FluentWait:

Wait<WebDriver> fluentWait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(timeout))
    .pollingEvery(Duration.ofMillis(500))
    .ignoring(NoSuchElementException.class)
    .ignoring(StaleElementReferenceException.class);

答案 2 :(得分:0)

可以尝试一下吗?

Wait<WebDriver> wait = new FluentWait<WebDriver>((WebDriver) driver).withTimeout(20, TimeUnit.SECONDS).pollingEvery(1, TimeUnit.SECONDS);
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("XPath"))));
String value = driver.findElement(By.xpath("xpath")).getAttribute("text-content");
System.out.println("Value is : " + value);