Selenium:显式/无条件等待,即“仅等待”

mu0hgdu0  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(200)

事实证明,WebDriverWait类不允许“无条件等待”:你总是需要指定等待的条件。然而,例如,当建立一个项目和开发第一个测试时,无条件等待是一个有用的特性。通常不鼓励使用Thread.sleep()。对于“只是等待”的问题,有更好的解决方案吗?
我现在使用的是最新的Selenium/WebDriver版本-2.44.0

njthzxwz

njthzxwz1#

如果你只是需要等待,那么Sleep就可以了。
不使用Sleep的意义不在于睡眠本身,而在于你所描述的 * 只是等待 只是等待 * 是你不应该做的。试着改变你的想法,找到一些你可以附加等待的事件。让它有条件。
在Web测试中,您通常不需要 * 等待 *。您需要等待页面加载、动画完成、表单发送、元素可点击、用户登录、脚本执行、数据处理......这就是不鼓励使用Sleep的原因,但如果您没有要等待的单个事件,只需等待,那么使用Sleep是完全可以的。

q3aa0525

q3aa05252#

Qwerty's answer是正确的,因为其原理是,套用:
如果你真的可以等待某个重要的事情在浏览器中发生,就不要“只是等待”。换句话说,你是在等待一个特定的事件,而不是“只是等待”。
好吧,为了便于讨论,我们假设你正处于一个绝对没有任何事件可以等待的情况下。我有很多使用Selenium的测试套件,我从来没有遇到过这种情况,但我不是无所不知的。可能会有我没有预见到的情况。但是,Thread.sleep()可能会给予你你想要的东西:
1.如果你在一个远程配置服务上运行你的浏览器,比如酱料Labs或Browser Stack,他们可能会认为你的脚本已经死了,并关闭浏览器。(Sauce Labs肯定会这样做。我从来没有用过Browser Stack,但我也希望如此。
1.如果在你等待的时候发生了一个网络问题,它会导致一个测试失败,直到你的Thread.sleep()调用完成,你才会知道。如果你使用像我上面提到的那些服务,这也会发生。我的测试套件偶尔会发生这种情况。
1.或者,如果您在本地进行测试:浏览器崩溃或进入无限循环。我没有遇到过崩溃,但我遇到过无限循环。同样,如果你使用Thread.sleep(),你不会知道这个问题,直到你完成等待。
当然,你想等的时间越长,问题就越大。如果你只想等一秒钟......那么你应该可以使用Thread.sleep()。否则,如果我被逼到绝境,* 不得不 *“只是等待”,我 * 仍然 * 使用Selenium的等待设施,我会这样做:

try: 
    WebDriverWait(driver, timeout).until(
        lambda driver: driver.execute_script("return false"))
except TimeoutException:
    pass # Do nothing

这是Python代码,但原理在Selenium支持的任何语言中都是相同的:等待执行在浏览器端发生的测试是很重要的,因为这样做而不是使用Thread.sleep()这样的东西的全部意义是为了与浏览器联系,以便我们尽可能早地发现问题。WebDriverWait的工作方式,它会经常轮询浏览器(在Python实现中,每0.5秒一次是默认的)测试可以是find_element方法,它搜索一个不存在的元素。由于它永远不会返回true值,因此等待将超时。(执行空脚本也可以,因为它将返回undefined,这将转换为一个错误值,但是return false看起来是故意的,而空脚本看起来是错误的。)然后,您只需忽略由于超时而引发的异常。如果你经常这样做,你甚至可以把整个事情 Package 在一个实用函数中。

31moq8wy

31moq8wy3#

如果你想保持 selenium 积分,你可以用途:

Sleeper.SYSTEM_SLEEPER.sleep(Duration.ofSeconds(3))

我可以看到一个用例,当你想放慢速度看看浏览器中发生了什么。所以我把它条件化:

Sleeper.SYSTEM_SLEEPER.sleep(Duration.ofMillis(slowDownFactor * 100))

slowDownFactor默认为0,或者在开发配置文件中更大(在我的例子中,Spring配置文件,通过:

@Value("${debug.slowDownFactor:0}") private int slowDownFactor;

相关问题