【问题标题】:Selenium to refresh any page until element is visible JavaSelenium 刷新任何页面,直到元素可见 Java
【发布时间】:2019-02-06 19:52:49
【问题描述】:

我希望 selenium 等待 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();

【问题讨论】:

  • “它不工作” - 它以什么方式不工作?

标签: javascript java selenium-webdriver


【解决方案1】:

不使用 .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);
        }
    }

【讨论】:

    【解决方案2】:

    你提到过,比如“直到找到一个元素(下载按钮)”......所以这里需要满足条件......因此我们可以使用 selenium 提供的等待功能之一

    我们在 selenium 中有三种等待类型,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,代码可以:

    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"));
    }
    });
    

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

    选择合适的,在你的情况下,流利的等待可能是合适的

    【讨论】:

    • 非常感谢您解释不同类型的等待。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2021-12-26
    • 1970-01-01
    • 2014-09-26
    • 2017-06-30
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多