在实时自动化中,在对它们执行某些操作之前,我们是否检查每个元素的存在(在测试中)?
只要有findElement
语句,就有可能 NoSuchElementException 。我的问题是我们是否每次检查元素是否存在?
每个findElement
语句是否需要被try-catch
块包围?
答案 0 :(得分:1)
有两种情况需要考虑:
对于第一种情况,我使用以下辅助方法:
this.waitForElement = function(locator) {
browser.wait(function() {
return browser.isElementPresent(locator);
}, testData.Timeout.TWO_MINUTES);
};
这将等待与提供的定位器匹配的元素出现的任意时间(它存在于DOM中)。
对于第二种情况,我使用这种辅助方法:
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。
注意,我使用的是量角器,并在这些片段中引用了Protractor。因此,除非您使用量角器,否则通过直接复制+粘贴可能无法100%运行。应该很容易调整它们以适应您的设置。
答案 1 :(得分:1)
您可能会发现使用课程AbstractWebDriverEventListener特别有用。此类实现接口WebDriverEventListener,该接口为WebDriver触发的事件定义before
和after
挂钩。
可以实现钩子beforeFindBy之前的一个来检查元素的存在。例如:
public void beforeFindBy(By by, WebElement element, WebDriver driver) {
// Explicit wait to check for the presence of the element using the "by" locator
}
类似地,可以实现before hook beforeClickOn以在对该元素执行click事件之前检查该元素是否可被点击。
答案 2 :(得分:1)
让我试着逐一回答你的问题:
In real-time automation, do we check for the presence of every element(in test) before performing some action on them
:是根据最佳做法,每当用户被重定向到新页面时,您需要根据所需操作确保元素的状态 。 有3个最广泛使用的ExpectedConditions可以与WebDriverWait结合使用,以验证元素的状态如下:
presenceOfElementLocated(By locator)定义如下:
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.
visibilityOfElementLocated(By locator)定义如下:
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(By locator)定义如下:
public static ExpectedCondition<WebElement> elementToBeClickable(By locator)
Description : An expectation for checking an element is visible and enabled such that you can click it.
Wherever there is a findElement statement, there is a chance of NoSuchElementException
:否,完全没有。如果你构建了一个合适的Locator Strategy,那么你就不会面对NoSuchElementException
。
您可以在此处找到有关NoSuchElementExeption, selenium unable to locate element
Does every findElement statement need to be surrounded by try-catch block
:否,并非总是如此。如果 usecase 涉及处理肯定和否定方案,则try-catch {}
阻止是完美的。
答案 3 :(得分:0)
检查Web元素是否存在的最直接,最简单的方法是使用findElements()(注意复数)返回一个数组,即
if (driver.findElements(By.xpath("//a")).isEmpty())
// no links exist
可以使用相同的方法检查单个元素,它不必是数组。返回的.size()为零意味着没有匹配,因此所需的元素不在DOM中。
有些人会争辩说,一个更好的方法是将.findElement包装在一个方法中,该方法会执行try / catch并相应地记录/响应各种结果,例如找不到元素或陈旧元素等。
我在我的测试中使用这两种方法,并使用我自己的.findElements逻辑存在函数,但在其他场景中使用包装器。
答案 4 :(得分:0)
简短答案:否。 更长的答案:一种方法是等到“页面完成”指示符使用明确的等待。这将表明您可以安全找到所需的Element。如果这些元素之一不可用,则测试将失败,表明找不到元素。 在测试中根据需要使用Explicit等待(当您期望页面/ DOM更改时)。
但是,对此问题还是有一些看法的答案。在整个过程的每个步骤中检查/等待元素都存在,这确实花费了运行时间,并且可能会延长测试的时间,而该测试可能会更快地失败。