我正在使用Selenium WebDriver测试Web应用程序,我想知道检查元素是否存在或显示的正确方法。我通常断言所有元素都存在于页面上,但它也会检查隐藏的元素,在这种情况下也需要检查元素是否仅在某些操作完成时才显示。例如,我单击一个链接,显示其他字段和标签,而之前它们是隐藏的。在这种情况下,我应该检查元素是否存在,以及是否在单击其他元素之前和之后显示它们。
我想知道哪种方法可以做到这一点。检查页面上的所有元素是否太多(假设我在页面中有一些按钮,文本字段,标签,链接等)?
为了讨论的目的,我想要包含一些代码片段。要检查页面上是否存在元素,请使用以下代码段:
public boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
要检查元素是否显示,请使用以下代码段:
public boolean isElementDisplay(By by) {
if (driver.findElement(by).isDisplayed()) {
return true;
} else
return false;
}
测试此应用程序的一个目的是检查元素是否存在并正确显示。我在这做对了吗?请告诉我你的观点。我最近开始与Selenium WebDriver合作,并且是我公司中唯一一个这样做的人...我没有任何人可以求助。任何答案都表示赞赏。
答案 0 :(得分:3)
它没有任何问题,除非你在一个首先不存在的元素上调用你的“checkIfDisplayed”方法,它将抛出异常。我会修改它:
public boolean checkIfDisplayed(By by) {
if (isElementPresent(by) {
if (driver.findElement(by).isDisplayed()) {
return true;
} else
return false;
} else
return false;
}
(这可能不是编译的代码,我是C#man,但你应该明白我的意思)
它可能会有轻微的性能影响,但总体而言,无论如何,你所做的事情都非常好。
答案 1 :(得分:2)
要检查元素的存在,我宁愿使用
public boolean isElementPresent(By by)
{
return driver.findElements(by).size() > 0
}
我真的不明白你的checkIfDisplayed函数背后的想法。它返回WebElemet的isDisplayed()方法返回的结果,而不添加任何新功能......
修改
到目前为止,Arran提供了最佳答案。只是稍微修改一下:
public boolean checkIfDisplayed(By by)
{
List<WebElemet> elements = driver.findElements(by);
return ((elements.size() > 0) && (elements[0].isDisplayed()));
}
但我相信最好是分别调用isElementPresent和isDisplayed。通过这种方式,您将知道测试失败的原因(如果它是由元素的存在或可见性引起的)
答案 2 :(得分:0)
我使用相同的方法(我的意思是相同的方法)。但了解两件事情很重要。 某些元素可以存在但不可见。 因此,为了验证元素是否存在,我们可以调用方法
public boolean isElementPresent(By locatorKey) {
try {
driver.findElement(locatorKey);
return true;
} catch (NoSuchElementException e) {
return false;
}
但isElementPresent方法的缺点是它可以指出DOM模型中的元素在页面上不可见,因此无法通过webDriver访问。因此,在这种情况下,额外的检查可以帮助我们:
driver.findElement(By.xpath(....)).isDisplayed()
希望事情现在明白了)
答案 3 :(得分:0)
我说你的第一种方法看起来很好。
如果findElement-call没有给你结果,那么第二个将给你带来麻烦。
如果找到了元素,您应该添加一个检查,然后检查它是否显示:
try {
final WebElement elem = driver.findElement(by);
elem.isDisplayed();
return true;
} catch (NoSuchElementException nse) {
return false;
}
另请注意:您忽略了多个元素与by实例给出的条件匹配的可能性。请参阅findElemts() method。
答案 4 :(得分:0)
您还可以根据您的要求结合两种方法,如下所示,
if(driver.findElements(By.LOCATOR).size()>0)
{
if(driver.findElement(By.LOCATOR).isDisplayed())
{ print "Element is present and displayed"; }
else
{ print "Element is present but not displayed"; }
}
else
{ print "Element is not present"; }