2017-11-17 140 views
0

我目前有一个使用WebdriverIO的测试脚本,点击一个按钮并等待弹出窗口显示。测试的目的是确保元素在点击后显示,但由于它是异步的,我必须等到它显示出来。如何在等待元素可见性时避免重复呼叫

但是,如果我等到元素显示,我的断言将总是通过,如果waitForVisible成功。如果它不成功,它总是会在waitForVisible命令上抛出一个异常,并且断言永远不会执行。

下面是代码示例:

browser.click(btnElement) 
browser.waitForVisible(popupElement) 
expect(browser.isVisible(popupElement)).to.be.true 

是否有不同的方法来告诉指望声明重试/等到元素可见这样的说法是不是没用?

+0

只是删除断言...正如你所说,这是多余的。 – JeffC

+0

但是没有断言的测试有什么好处? –

回答

3

您似乎混淆了assertions的目的,或者滥用了它们,特别是在您的示例中。您应该只使用断言,当你有确定性要验证事情WebElementtextattribute元素等)包含了预期类型的值(您返回到您的assert,或expect声明为最终验证=>输出是所需的一个)。

断言验证静态值,它们不轮询DOM。这就是为什么你有像.waitForVisible(),waitForText(),或更重要的是.waitUntil()(它提供了更多的灵活性)的工具。

诚然,通过ChaiJS提供可能有一个令人困惑的词汇的expect断言式(expect可能被断章取义的:它期待的WebElement的是可见的)。只需使用它们来验证不同命令的输出,而不是使用WebElements或其他动态/更改元素的状态。


话虽这么说,作为一个最佳实践,你应该始终包裹您的命令(例如:.click())为.waitUntil()块和保证WebElement为你准备好即将在行动执行:

  • 是否呈现在DOM中由前端逻辑? (使用.isExisting()
  • 是不是可见在DOM中? (你*不能点击在viewport中不可见的元素)
  • 是不是可点击? (或者您想对其执行的其他操作...)

最后,一个习惯动作(在我们的例子.click())应该是这样的:

browser.waitUntil(() => { 
    browser.isExisting(locator); 
}, timeout, "Oups! An error occured.\nReason: element ('" + locator + "') does not exist"); 
browser.waitUntil(() => { 
    browser.isVisible(locator); 
}, timeout, "Oups! An error occured.\nReason: element ('" + locator + "') is not visible"); 
browser.waitUntil(() => { 
    browser.click(locator); 
}, timeout, "Oups! An error occured.\nReason: element ('" + locator + "') could not be clicked"); 

你可以用整个事情变成custom-command并使用它瓦特/ E您想。告别片状测试! :)

*硒是一种以用户为中心网络的自动化工具,从而为如果用户将(用户不能在元素不可见,用户单击所有操作都进行不能同时点击多个元素,或通过输入整个单词或整个段落等来填写input字段)

+0

如果我正确理解你,你说你应该只使用断言/期望来验证值?但我看到很多人使用断言来检查元素是否可见/可点击。如果点击此按钮创建一个内容未知的弹出框(通过CMS?),那么我无法知道该值,但我仍然可以验证它是否显示。是的,即使它是空的,它也会通过,但没有其他办法可以让我知道弹出窗口中将提供哪些内容。如果我只能断言已知的值,我该如何为此写一个测试? –

+0

你的回答没有多大意义。你为什么需要断言你肯定会通过的东西?这是断言的重点,以确保它在没有通过或错误时通过。我不知道* static * value是什么意思......如果这个值永远不会改变,那么断言它是没有意义的。这就像有一个断言,“pi”仍然等于“3.14.”......你永远不会那样做。总是将命令封装在等待中并不是一个最佳实践。请发布说明这样的链接。 – JeffC

+0

那倒票@JeffC **:)**这是一个d!$%移动的男人!态度非常非常令人失望。 – iamdanchiv

0

我不知道WebdriverIO,但我会认为它有类似的东西到try-catch。把你的等待包裹在try-catch。如果成功,则为Assert.pass()或等效。如果超时,将抛出异常,因此在您的catch中超时放置Assert.fail()或等效。


我从来没有用过ChaiJS但我确实看看the documentation,发现一对夫妇的事情,你应该能够使用。

assert.isOk(false, 'this will fail'); 

这是从文档,应该是相当于什么我熟悉,Assert.Fail()。人们会认为,一个轻微的调整。下面将相当于Assert.Pass()

assert.isOk(true, 'this will pass?'); 

如果不出于某种原因,你可以使用下面的文档。

assert.isNotOk(false, 'this will pass'); 
+0

这几乎总结了我对你的答案的看法:** [这里](https://imgur.com/a/Sc5wn)**。作为一个专业技巧,先进的技巧,当你*出售一个想法,解决方案,概念*或*辩论某人*时,**从来没有**开始说你对你将要制定的目标一无所知关于的声明。看到这里的悖论杰夫? – iamdanchiv

+0

@iamdanchiv我使用C#和Java Selenium。 WebdriverIO是Selenium的语言绑定,我不编程。这个概念仍然适用,不是吗?这是一种扩展到其他语言的编程概念。 – JeffC

+0

@JeffC我们已经实现了try-catch,但不幸的是我们没有看到ChaiJS使用通过/失败函数。也许我在文档中错过了它。 –