Eclipse 证明Thread.sleep()优于隐式Wait

Eclipse 证明Thread.sleep()优于隐式Wait,eclipse,selenium-webdriver,Eclipse,Selenium Webdriver,我的java selenium webdriver项目中有很多Thread.sleep()命令。我经常读到,使用sleep命令是一种不好的做法,应该在启动浏览器实例后隐式地声明一次wait命令,它将处理整个脚本。在这个项目上这对我不起作用 由于对某些元素抛出了很多NoTouchElementException,所以我在每个元素前面添加了一个sleep命令,这会造成问题。剧本通过了。当我关闭sleep命令并隐式声明wait 30秒时,脚本失败,出现WebdriverException/NoSuch

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


由于对某些元素抛出了很多NoTouchElementException,所以我在每个元素前面添加了一个sleep命令,这会造成问题。剧本通过了。当我关闭sleep命令并隐式声明wait 30秒时,脚本失败,出现WebdriverException/NoSuchElementException,因为webdriver无法找到这些元素中的每一个。Sleep命令在2或3秒内找到元素。Thread.sleep()在这里更高级吗?如果我必须使用ExplicitlyWait,那么我也必须声明很多,因为有许多元素需要预期的条件。有解决办法吗

使用显式等待元素定位。在抛出异常之前,它将等待条件或提供的最大等待时间

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可能也是一个不错的选择。

使用显式等待元素定位。在抛出异常之前,它将等待条件或提供的最大等待时间

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也可能是另一个很好的选择。

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

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

显式等待
WebDriverWait
)-每次需要等待时进行设置。这只是
FluentWait
的一个特定实例。可使用
ExpectedConditions
定制所有常见需求(可见、可点击等)。这是最好的做法

Fluent wait-设置每次需要等待的时间。瑞士军刀。我能做任何事。。。是完全可定制的。在非常特定的情况下可能很有用,但通常情况下,
WebDriverWait
ExpectedConditions
将满足您的大多数等待需求

我如何使用等待…

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

您真的不需要等待每次调用
.findElement()
。等待页面加载或等待动态页面更改,如我上面所述,您只需要在非常特定的实例中等待。。。不是到处都是

注:。您将得到糟糕的/奇怪的结果。

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

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

显式等待
WebDriverWait
)-每次需要等待时进行设置。这只是
FluentWait
的一个特定实例。可使用
ExpectedConditions
定制所有常见需求(可见、可点击等)。这是最好的做法

Fluent wait-设置每次需要等待的时间。瑞士军刀。我能做任何事。。。是完全可定制的。在非常特定的情况下可能很有用,但通常情况下,
WebDriverWait
ExpectedConditions
将满足您的大多数等待需求

我如何使用等待…

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

您真的不需要等待每次调用
.findElement()
。等待页面加载或等待动态页面更改,如我上面所述,您只需要在非常特定的实例中等待。。。不是到处都是


注:。你会得到糟糕/怪异的结果。

显式等待的问题是,它只适用于个别情况。我不能为所有相关元素声明它,因为它与Thread.sleep()非常相似,因此必须在脚本中多次声明它。对吗?显式等待的问题在于它是针对个别情况的。我不能为所有相关元素声明它,所以simi