Thread.sleep()证明优于implicitlyWait

时间:2016-11-01 09:52:40

标签: eclipse selenium-webdriver

我的java selenium webdriver项目中有很多Thread.sleep()命令。我经常阅读使用sleep命令是一种不好的做法,而且在启动浏览器实例后,应该隐式声明等命令声明一次,它将处理整个脚本。这对我来说不适用于这个项目。

由于某些元素有很多NoSuchElementExceptions,我在每个构成问题的元素之前添加了一个sleep命令。脚本通过了。当我取消睡眠命令并隐式声明等待30秒时,脚本因WebdriverException / NoSuchElementException而失败,因为webdriver无法找到每个元素。睡眠命令在2或3秒内找到元素。 Thread.sleep()在这里证明是优越的吗?如果我必须使用ExplicitlyWait,那么我还必须声明它们中的很多,因为有许多元素需要预期的条件。有解决方法吗?

2 个答案:

答案 0 :(得分:3)

Thread.sleep() - 每次要等待时设置。一个“愚蠢”的等待。它等待指定的时间,不多也不少。如果你的元素在25ms内可用,它仍将等待你指定的10s,导致每次运行浪费时间。

隐式等待 - 设置一次并在WebDriver实例的整个生命周期中持续存在。它等待每次 .findElement()调用的指定时间。因此,如果您需要检查元素是否存在等,那么您的检查将等待隐式等待中指定的时间,这也会导致浪费时间。

明确等待WebDriverWait) - 每次要等待时设置。这只是FluentWait的特定实例。它可以使用ExpectedConditions自定义所有常见需求(可见,可点击等)。这是最好的做法。

流利的等待 - 每次您想要等待时设置。瑞士军刀等待。可以做任何事情......完全可以自定义。在非常具体的情况下非常有用,但通常WebDriverWait ExpectedConditions会涵盖大部分等待时间。

我如何使用等待......

我使用页面对象模型,并在构造函数中为页面加载时运行的每个页面对象,我使用WebDriverWait等待页面上的元素可用。一旦该元素可用,我就知道整页已加载。现在我可以从页面上删除我想要的任何元素。如果我改变了页面的状态,我还有另一个WebDriverWait等待出现一个新元素,表示动态页面更改已完成。现在我可以再次随意刮擦。

您真的不需要等待每次 .findElement()来电。等待页面加载或等待动态页面更改,如上所述,您只需要在非常具体的实例中等待...而不是在任何地方。

注意:Do not mix implicit and explicit waits。你会得到糟糕/奇怪的结果。

答案 1 :(得分:1)

使用显式等待您的元素进行定位。在抛出异常之前,它会等到条件或最长等待时间。

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20); // pass time in seconds as much you need
WebElement myElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("your element's id")));

注意: FluentWait也可能是另一个不错的选择。