在什么情况下我需要使用Protractor ExpectedConditions等待元素

时间:2019-02-05 21:01:37

标签: protractor

我刚开始使用量角器,我想知道在什么情况下使用量角器时需要使用ExpectedConditions(下面的示例)。我认为量角器会自动确定AngularJS页面何时完全加载。

let EC = ExpectedConditions;
let condition = EC.presenceOf(element(by.id("something"))); 
browser.wait(condition, 10000);

谢谢埃里克

1 个答案:

答案 0 :(得分:2)

根据我与量角器的合作经验, ExpectedConditions 的使用取决于您要自动化的页面的行为。如果条件在指定时间内不符合要求,通常会因为失败而使用。

这些条件还将返回一个您可以按照自己的喜好处理的承诺。

我将为您提供一些方案,以便您了解在何处使用它们。

  1. alertIsPresent():这种情况将一直等待,直到出现警报为止。

例如:单击按钮后,将出现警报外观;但是,有一个API调用使弹出窗口花费的时间更长,并且动画效果也较小,因此我们想等待几秒钟,而不要超过此时间。

// will click on a button  
element(by.id('button')).click();  
// will wait for the condition  
let EC = ExpectedConditions;  
browser.wait(EC.alertIsPresent(), 5000);  

下面的代码在单击按钮后将等待5秒钟,以查看警报是否存在,否则将引发错误。

  1. invisibilityOf():此条件将一直等待,直到未显示指定的元素。

例如:对于页面中触发的每个单个操作,都会出现一个加载器。为此,我们要等到该加载程序消失后才能继续进行自动化过程。根据业务需求,此加载程序的时间不应超过10秒。

  

此加载器锁定了整个页面,因此其他元素在启动时不可交互。

// trigger random action on page so loader appears  
element(by.id('button2')).click();  
// will wait for the condition  
let EC = ExpectedConditions;  
browser.wait(EC.invisibilityOf(element(by.id('loader'))), 10000);  

单击按钮后,我们将给予10秒宽限期,以使装载程序消失,否则情况将引发错误。

  1. elementToBeClickable():这种情况将一直等到可以单击指定的元素。

例如:登录表单的按钮默认情况下处于禁用状态,因此除非我们填写用户名和密码文本字段,否则无法单击该按钮。填充文本字段后启用的按钮具有快速的动画效果,无论哪种方式,我们都希望在1秒钟内完成它,并检查是否能够单击它。

// complete both textfields required for the button to be enabled  
element(by.id('username')).sendKeys('User1234');  
element(by.id('password')).sendKeys('Protractor');  
// will wait for the condition and then will click the button
let EC = ExpectedConditions;  
browser.wait(EC.elementToBeClickable(element(by.id('loginButton'))), 1000);  
element(by.id('loginButton')).click();  

在完成两个文本字段之后,条件将等待1秒钟,以使元素可单击,如果可以,则继续下一行并单击它。另一方面,如果不这样做,将引发错误。

  1. presenceOf():在这种情况下,条件将检查 DOM (文档对象模型)中是否存在该元素,但不会检查该元素是否存在。元素是否可见。

例如:在带有单选按钮组的页面上,该组包含3种口味:巧克力,香草和草莓。根据您选择的内容,将显示不同的问题。开发人员提到问题始终在页面中,但是由于当前选择了哪个单选按钮,因此问题被隐藏了。在这种情况下,我们只想检查 DOM 中是否存在所有问题,是否通过选择单选按钮来显示它们。

// check all questions directly, without selecting any radio buttons  
let EC = ExpectedConditions; 
browser.wait(EC.presenceOf(element(by.id('question-1'))), 1000);  
browser.wait(EC.presenceOf(element(by.id('question-2'))), 1000);  
browser.wait(EC.presenceOf(element(by.id('question-3'))), 1000);  

这里的时间是无关紧要的;尽管如此,使用此条件,我们将能够检查问题,即使它们是隐藏的,也存在于 DOM 中。如果缺少一个错误,则会立即中断测试。


这些是我过去不得不处理的几个例子。条件的使用是视情况而定,在您要使用现有条件时,大多数情况下它们很有用,因为它们可以节省您自己建立条件的时间。

PD:更多信息可以在Protractor API中找到。