在实时自动化中,在对每个元素执行操作之前,我们是否检查它们的存在(在测试中)?
只要有一个findElement
语句,就有可能出现NoTouchElementException。我的问题是我们是否每次都检查元素的存在?
是否每个findElement
语句都需要被try-catch
块包围?
您可能会发现AbstractWebDriverEventListener类的使用特别有用。此类实现接口WebDriverEventListener,该接口为WebDriver触发的事件定义之前
和之后的挂钩。
可以实现一个这样的前钩子前FindBy来检查元素的存在。例如:
public void beforeFindBy(By by, WebElement element, WebDriver driver) {
// Explicit wait to check for the presence of the element using the "by" locator
}
类似地,可以实现beforeClickOn之前的before钩子,以在对该元素执行click事件之前检查该元素是否可单击。
逐一回答您的问题:
有3个最广泛使用的预期条件,它们可以与WebDriver等等一起使用来验证元素的状态,如下所示:
定位元素的存在(通过定位器)定义如下:
public static ExpectedCondition<WebElement> presenceOfElementLocated(By locator)
Description : An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible.
VisibilityOfElement定位(通过定位器)定义如下:
public static ExpectedCondition<WebElement> visibilityOfElementLocated(By locator)
Description : An expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0.
ElementToBeClickable(通过定位器)定义如下:
public static ExpectedCondition<WebElement> elementToBeClickable(By locator)
Description : An expectation for checking an element is visible and enabled such that you can click it.
在这里,您将看到关于NoTouchElementExeption的详细讨论,selenium无法定位元素
是否每个findElement语句都需要被try-catch块包围:不,不一定。如果您的用例同时涉及肯定和否定场景的处理,那么try-catch{}
block就是perfecto
有两种情况需要说明:
对于第一种情况,我使用以下helper方法:
this.waitForElement = function(locator) {
browser.wait(function() {
return browser.isElementPresent(locator);
}, testData.Timeout.TWO_MINUTES);
};
这将等待与提供的定位器匹配的元素出现的任意时间(它存在于DOM中)。
对于第二种情况,我使用以下helper方法:
this.waitForElementIsVisible = function(el){
let EC = protractor.ExpectedConditions;
browser.wait(EC.visibilityOf(el), testData.Timeout.TWO_MINUTES, "Element did not become visible after 2 minutes");
};
这将使用一个WebElement
作为单个参数,并等待直到元素变得可见(它存在于DOM中,并且不通过css样式或其他方式隐藏)
作为奖励,我还发现这个助手方法对于测试表单中的错误状态非常有用:
this.waitForElementIsClickable = function(el){
let EC = protractor.ExpectedConditions;
browser.wait(EC.elementToBeClickable(el), testData.Timeout.TWO_MINUTES, "Element did not become clickable after 2 minutes");
};
将一个WebElement
作为第一个参数,并等待直到可以单击该WebElement。
注意,我在这些代码片段中使用了量角器和引用量角器。所以,除非您也使用量角器,否则很可能无法通过直接复制粘贴100%地工作。不过,调整它们以适应您的设置应该很容易。
问题内容: 在实时自动化中,在对每个元素执行某些操作之前,我们是否要检查每个元素的存在? 无论哪里有声明,都有机会出现 NoSuchElementException 。我的问题是我们是否每次都要检查元素的存在? 是否每个语句都必须用块包围? 问题答案: 您可能会发现使用AbstractWebDriverEventListener类特别有用。此类实现WebDriverEventListener接口,
本文向大家介绍检查Java ArrayList中元素的存在,包括了检查Java ArrayList中元素的存在的使用技巧和注意事项,需要的朋友参考一下 java.util.ArrayList.contains()方法可用于检查ArrayList中是否存在元素。此方法具有单个参数,即要测试其在ArrayList中是否存在的元素。如果该元素存在于ArrayList中,则返回true;如果不存在该元素,
这是代码: 这是我已经在python上尝试过的: 返回: 你知道吗?谢谢
问题内容: 我有一个看起来像元组的列表: 检查该元组中是否存在值的最佳方法是什么?例如,我想能够说: 并得到真 问题答案: 您正在寻找: 结合一个简单的生成器表达式,就可以完成任务。生成器表达式接受每个元组,如果包含则产生。然后在请求的第一个项目返回时返回(否则为)。因此,这就是您想要的。它也可以很好地读取- 如果有任何元组包含。 如果您要执行大量操作并且需要性能,那么可能值得设置所有值的集合以使
问题内容: 我想检查Selenium中是否存在一个元素,如果存在,请将其分配给一个名称。 现在,我有这样的东西: 但是,当不存在值为9的元素时,它将返回错误。有没有一种方法可以检查它是否存在,或者类似的东西? 问题答案: 有几种选择。我推荐这些。 1.创建方法或Web驱动程序扩展。 2.计算元素,如果有1个或更多元素,则获取它。 那你可以检查
问题内容: 我有一个问题-我正在使用Selenium(firefox)Web驱动程序打开网页,单击一些链接等,然后捕获屏幕截图。 我的脚本可以从CLI正常运行,但是通过cronjob运行时,它并没有通过第一个find_element()测试。我需要添加一些调试,或一些帮助我弄清为什么失败的东西。 基本上,我必须先单击“登录”锚点,然后才能进入登录页面。元素的构造为: 我正在通过LINK_TEXT方