gpt4 book ai didi

javascript - Protractor 的隐式等待与显式等待如何相互作用?

转载 作者:数据小太阳 更新时间:2023-10-29 04:02:18 25 4
gpt4 key购买 nike

当隐式等待少于显式等待时,就会发生误解:

var timeOut = 5000;
var search = element(by.xpath(`//*[@name='qwer']`));
browser.manage().timeouts().implicitlyWait(4000);
browser.ignoreSynchronization = true;

describe('Protractor Test', function () {
beforeEach(function () {
browser.get('https://www.google.com.ua');
});
it('EC', function () {
console.log('START');
// browser.sleep(timeOut);
browser.wait(protractor.ExpectedConditions.presenceOf(search), timeOut);
});
});

总时间:8.613秒。隐式设置第二个较低的值:3000,结果为6.865秒。它是如何工作的?
预先感谢!

最佳答案

那是个好问题。许多优秀的QA自动化专家为此大吃一惊。

隐式等待

这是对每个driver.findElement(...)的特殊隐藏自动等待。
如果在页面DOM结构中找不到元素,则原始Web驱动程序(js,python,java)将引发NoSuchElementException。无论您使用哪种定位器,这种等待都会在每个driver.findElement之前完成。当隐式等待超时时,NoSuchElementException将被抛出findElement函数之外。

启用隐式等待

默认情况下,隐式等待超时设置为0browser.manage().timeouts().implicitlyWait(3000)使Webdriver自动尝试/捕获此异常,然后重试以查找此元素。如果经过了3秒(超时),并且DOM中仍不存在element-只有这样,您会收到NoSuchElementException。

好时:

您的页面会修改DOM结构(占网站的99.999%),并且某些元素仍不在DOM中,但会在1-3秒内显示。为了不进行显式等待,并减少代码量-您可以尝试设置隐式等待超时。

不好的时候:
您要测试DOM中不存在该元素。这种等待是在每个.findElement调用之前添加的,因此,当您尝试这样声明时:
expect($('NON-EXIST-ELEMENT').isPresent()).toBeFalsy()
您的implicitWait仍在这里工作。首先,您将等待3秒钟,直到元素出现,然后将引发异常,并被isPresent()函数捕获,在这种情况下,该异常将返回false(实际上是我们断言的)。因此,您还要等待3秒!设置implicitWait(0)并在断言元素不存在后将其重新设置是合理的(这可能确实很烦人)。

结论
当您了解隐式等待的工作原理时,它就很好。我建议不要将隐式等待设置为超过1-5秒(您应该为每个网站定义自己的值)。同样,如果您计划声明许多不存在的元素-将隐式等待重置为0,然后将其重新设置。

显式等待

您应该自己调用这种等待,但是它比隐式等待要灵活得多。在protractorjs中,当您需要等待时,必须调用browser.wait()。它接受谓词函数(该函数将仅返回true/false,无异常)。 Webdriver将轮询此功能,直到发生超时(您将其指定为第二个参数)为止。您也可以指定要抛出的错误消息作为第三个参数。

显然,在Web自动化中,您通常会等待一些元素条件。为此,人们创建了谓词函数集合。此函数调用ExpectedConditions,并将为传递给它们的元素返回true/false。
browser.wait(ExpectedConditions.visibilityOf($('NON-EXISTING-ELEMENT')), 3000, 'error message')
好时:
当您必须等待元素的一些棘手条件时。您可以轻松定义自己要等待的条件,指定自定义超时等等。
在操作可能尚未准备就绪的元素之前使用。

不好的时候:
当您尝试通过结合browser.sleep()来帮助您时,隐式等待和显式等待一起使用。 browser.sleep()默认情况下是错误的,在99%的情况下,您可以使用提供的条件用browser.wait()替换它,或者编写自己的条件。

当您设置了隐式等待,并尝试调用显式等待时,会发生更多有趣的事情。
想象:browser.manage().timeouts().implicitlyWait(10000)browser.wait(EC.stalenessOf($('NON-EXIST-ELEMENT')), 5000) //waiting for 5 seconds for element to disappear
这里会发生什么:
Wait函数为您的元素调用stalenessOf()函数。在里面,driver.findElement()被调用。隐式等待不要让此函数立即引发错误,并且将网页池化10秒钟,直到发生隐式等待超时,并且我们收到NoSuchElementException。发生异常,执行返回到等待功能,已经过去了10秒钟!等待被TimeOutException终止,因为它只计划了5秒钟。等待时间比预期的要长得多,我们遇到了错误。

另外请记住,JS是异步的,由于事件循环,不能保证确切的等待时间。通常,这会使等待时间不准确-5200毫秒而不是5000(例如)。这是完全不同的故事:)

您的示例中发生了什么

隐式超时-4000毫秒。

显式超时-5000毫秒。

  • 等待开始。首次调用谓词功能-presenceOf()
  • 内部谓词调用原始webdriverjs函数-driver.findElement(By.xpath('//*[@name='qwer']'))
  • 因为设置了隐式等待,所以我们在抛出错误之前正在等待它。
  • 4000毫秒的隐式元素等待时间过去了。只有现在,我们才将错误返回给谓词函数。
  • 谓词函数捕获错误,并返回false而不是
  • 由于显式等待超时之前还有1000毫秒-再次调用谓词函数。
  • 隐式等待再次开始。 4000毫秒后-将错误返回给谓词函数
  • 谓词返回假
  • Wait函数为假,我们的显式等待时间不够-在理想情况下-大约需要8000毫秒,但还要注意异步调用,因此实时性会更高
  • 等待引发错误-jasminejs捕获错误,并且测试
  • 失败

    我希望这个能帮上忙!

    关于javascript - Protractor 的隐式等待与显式等待如何相互作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628226/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com