Selenium刷新任何页面,直到元素可见Java

时间:2019-02-06 10:14:50

标签: javascript java selenium-webdriver

我希望硒等待3分钟,然后刷新页面直到找到一个元素(“下载”按钮)。我尝试使用下面的代码,但是它不起作用。

注意:我正在上传一个zip文件,有时需要几秒钟的时间才能上传,有时需要3分钟。当文件在几秒钟内上传后,下面的代码可以正常工作。 zip文件需要较长时间上传时,此功能不起作用。

有人可以在这方面帮助我。

boolean displayed = false;
do {
  try {
    displayed = driver1.findElement(By.xpath("//*[@id=\"app\"]/main/div[1]/div/div/div/div[2]/table/tbody/tr[1]/td[4]/a")).isDisplayed();
  } catch (NoSuchElementException e) {
    System.out.println(e);
    driver1.navigate().refresh();
  }
} while (!displayed);

driver1.findElement(By.xpath("//*[@id=\"app\"]/main/div[1]/div/div/div/div[2]/table/tbody/tr[1]/td[4]/a")).click();

2 个答案:

答案 0 :(得分:0)

您可以使用元素列表的大小,而不是使用.isDisplayed()方法,如果该大小大于0,则单击该元素。
例如:

    boolean displayed = false;
    List<WebElement> element = driver.findElements(By.xpath("//*[@id=\"app\"]/main/div[1]/div/div/div/div[2]/table/tbody/tr[1]/td[4]/a"));
    while (!displayed) {
        if (element.size() > 0) {
            // Element is found so set the boolean as true
            displayed = true;
            // Click on the element
            element.get(0).click();
        } else {
            // Adding a static sleep of 10 seconds, this else condition can be removed also
            Thread.sleep(10000);
        }
    }

答案 1 :(得分:0)

您提到过,就像“直到找到一个元素(下载按钮)”一样。因此需要在此处满足条件...因此,我们可以使用硒提供的一种等待功能

我们有3种硒等待类型,1)隐式等待2)显式等待,3)流利等待。

1)使用隐式等待,代码可以是:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

用法::如果我们希望WebDriver在查找一个或多个元素(如果它们不立即可用)时轮询DOM一定时间。默认设置为0。设置后,将在WebDriver对象实例的生存期内设置隐式等待。

但这不是一个好习惯,我个人不建议

2)使用显式等待,代码可以是:

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("download_button_id")));

用法::显式等待是您定义的代码,用于等待特定条件发生后再继续执行代码。默认情况下,WebDriverWait每500毫秒调用ExpectedCondition,直到成功返回。如果元素需要很长时间才能加载。另外,用于检查元素的属性(状态,可点击性等)。

3)使用Fluent等待,代码可以是:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    .withTimeout(30, SECONDS)
    .pollingEvery(5, SECONDS)
    .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() 
{
  public WebElement apply(WebDriver driver) {
  return driver.findElement(By.id("foo"));
}
});

用法: 流利等待是另一种显式等待,您可以定义轮询并忽略异常,以在找不到元素的情况下继续执行脚本。 当您尝试测试每x秒/分钟后可能出现的元素的存在时(仅举一个例子,这是我对可以在何处使用这种东西的猜测)

选择合适的选项,您可能需要流利的等待时间