在Selenium WebDriver中无限等待

时间:2014-07-14 17:20:07

标签: java selenium selenium-webdriver

我实际上有3个问题

  1. Selenium WebDriver如何实现此目的 driver.manage().timeouts().pageLoadTimeout(-1, TimeUnit.SECONDS)
  2. 因为我们无法给线程带来负值以进行无限次睡眠。

    2.我为此创造了无限睡眠的代码

    WebDriver driver=new FirefoxDriver(fb, fp);
    driver.get("http://www.google.com");
    String str="'Feeling Lucky'";
    driver.manage().timeouts().pageLoadTimeout(-1, TimeUnit.SECONDS)
    //driver.findElement(By.xpath(".//span[contains(text(),"+str+")]")).click();
    while(true)
    {
        try
        {
            driver.findElement(By.xpath(".//span[contains(text(),"+str+")]")).click();
            break;
        }
        catch(Exception e)
        {
            Thread.sleep(500);
        }
    }
    driver.quit();
    

    有没有更好的方法来实现无限等待。

    3.我使用driver.manage().timeouts().pageLoadTimeout(-1, TimeUnit.SECONDS)对webdriver实现进行无限等待测试。我做什么我只是在页面尝试加载时断开网络连接但是我得到了一个意外的结果,经过一段时间后驱动程序相当但它不应该是浏览器应该等待无限。

    我们在selenium webdriver文档中看到了这一点     / **      *设置在抛出错误之前等待页面加载完成的时间。      *如果超时为负,则页面加载可能是无限期的。      *      * @param time超时值。      * @param unit时间单位。      * @return A Timeouts界面。      * /     超时pageLoadTimeout(长时间,TimeUnit单位);

2 个答案:

答案 0 :(得分:1)

我建议您添加自己的findElement()方法,而不是试图欺骗Selenium。

<强>声明: 我全心全意地建议你做 NOT 这样做。等待是有原因的。如果你有一个无限的等待,那么你的测试将永远运行,如果你没有手动干预,如果出现问题。相反,我建议将其设置为非常高的数字,但不是无限的。

您可以执行以下操作:

WebElement findElement(By by) {
  int attempts = 0;
  while (attempts > 300)
    try {
      return driver.findElement(by);
    } catch (Exception e) {
      Thread.sleep(500);
      attempts++;
    }
  }
}

没有必要在那里拥有无限循环。

同样,我不建议做以上!我只是为您提供解决方案,因为它是您明确要求的。

你可以做的另一件事是,如果你真的想要设置一个大的等待:

driver.manage().timeouts().pageLoadTimeout(300, TimeUnit.SECONDS)

那是300秒......即使对我来说,这也是非常笨拙的,不应该被放入。网页不应该花300秒加载。如果确实如此,则还需要其他一些方法来修复;)

答案 1 :(得分:0)

嗨,如果您创建等待方法并保留在项目内部,则可以随时随地使用该等待方法,这是自定义的一种方法

 private static WebElement waitForElement(By locator,int timeout)
{
    WebElement element=new WebDriverWait(driver,timeout).until(ExpectedConditions.presenceOfElementLocated(locator));
    return element;
}

例如,如果您要等待元素ID,则可以按以下方式排列代码

**waitForElement(By.id(""),20);**

这里是20毫秒,您可以在这里随时使用并上网