- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
当隐式等待少于显式等待时,就会发生误解:
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);
});
});
最佳答案
那是个好问题。许多优秀的QA自动化专家为此大吃一惊。
隐式等待
这是对每个driver.findElement(...)
的特殊隐藏自动等待。
如果在页面DOM结构中找不到元素,则原始Web驱动程序(js,python,java)将引发NoSuchElementException。无论您使用哪种定位器,这种等待都会在每个driver.findElement
之前完成。当隐式等待超时时,NoSuchElementException将被抛出findElement
函数之外。
启用隐式等待
默认情况下,隐式等待超时设置为0
。 browser.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()
driver.findElement(By.xpath('//*[@name='qwer']'))
关于javascript - Protractor 的隐式等待与显式等待如何相互作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628226/
我有一个表,其中包含3行数据和3个删除按钮。我想删除所有数据行,因此想在我的页面对象中编写一个方法来做到这一点……这应该很简单,但我无法使其正常工作。我正在这样尝试: this.rows = elem
我们有一个应用程序,在本地进行测试会显示无效的SSL证书警告。通常,我只添加一个异常并继续处理。但是, Protractor 有无视这一点吗? 我已经看到了 Selenium 中的一些功能,其中可以忽
我有一个关于我的代码和不同行为的问题,具体取决于使用的 Protractor 版本。 我的测试使用 Protractor 版本 2.5.1。但要从最新发展中获得所有好处,我 试图移动到版本 3.x。
我有一个项目已经运行了很长时间。 最近(几周)系统测试失败了。 经过大量调查,我们得出结论, Protractor 无法识别和关闭警报。 曾经工作的代码 exports.removeFaq = fun
我能够成功运行 Protractor 脚本。下面是我用来运行 Protractor 脚本的 protractor.config.js 文件。 var Jasmine2Reporter = requir
在 Protractor 中,如何处理重复的内容,比如一张表格?例如,给定以下代码,它会踢出一个包含 3 列的表:Index , Name和 Delete-Button在每一行中: {{$in
我为 Protractor 编写了一个自定义定位器,可以找到 anchor元素由他们 ui-sref值(value)。在我的规范中,我刚刚使用了 by.addLocator添加自定义定位器,但我认为发
我遇到过 Protractor 的页面对象的不同类型的语法,我想知道它们的背景是什么以及建议采用哪种方式。 这是 Protractor 教程中的官方 PageObject 语法。我最喜欢它,因为它清晰
Protractor 中有两个 it() 测试用例 it('it1',function(){ }); it('it2',function(){ }); 完成 it1 后, Protractor 中的驱
我目前正在运行一套 Protractor 测试。我有一个 config.js 仅设置为运行具有“功能”的 Chrome。见下文。 capabilities: { } browserNa
我试图断言名称显示在表的列中。我写了一个 inResults将遍历列的文本以查看名称是否存在的函数。这是我正在尝试的: 页面对象: this.names = element.all(by.repeat
我可以使用检索浏览器日志 browser.manage().logs().get('browser').then(function(browserLog) { logger.info('log:
我按照文档中有关如何安装 Protractor 和 Selenium 的说明进行操作,但无法启动。 install -g protractor webdriver-manager update 之后我
我在 Protractor 中使用 --suites config 运行多个案例。我必须为每种情况重新启动我的 web 应用程序,但我的应用程序有一个警报,每当页面重新加载或关闭时,都会弹出该警报以进
我想知道如何在测试套件中按顺序运行测试用例。 例如,加载 URL、登录系统等。 最佳答案 检查 protractor.conf.js example . 您可以指定一个按字母顺序加载文件的 glob,
row1Col1 row1Col2 row1Co
如何从包含特定文本的转发器中搜索元素? 我试过这样的事情: element(by.repeater('item in array')).all(by.cssContainingText('.xyz',
只是想知道是否可以将 cli args 指定为 Protractor --multiCapabilities.0.browserName chrome --multiCapabilities.1.br
是否可以在 Protractor 中的任何套件运行之前运行一些测试或逻辑流程? 例如,我想将我的 Protractor 测试分解成一系列套件来测试我的应用程序的不同方面。假设 Jenkins 将在部署
我是 Protractor 的新手,我正在尝试使用 Protractor 设置单选按钮值。我在互联网和 SO 上搜索了徒劳的答案。 html: No Yes
我是一名优秀的程序员,十分优秀!