Selenium Webdriver - 在if语句中使用isDisplayed()不起作用

时间:2014-07-25 01:37:37

标签: selenium webdriver

我正在创建一个脚本,其中包括搜索记录然后更新记录。在搜索屏幕上,用户可以选择查看高级搜索选项。要切换显示或隐藏高级搜索,请使用一个按钮进行控制。

<a title="Searches" href="javascript:expandFilters()"><img border="0" align="absmiddle" alt="Advanced" src="****MASKED URL****"></a>

显示或隐藏高级搜索时搜索按钮的属性之间的唯一区别是img src:

当隐藏高级搜索时,IMG src以&#34; /Styles/_Images/advanced_button.jpg"结束,当高级搜索可见时,IMG src以&#34; / Styles / _Images / basic_button结束.PNG&#34;

当我打开页面时,有时会显示高级搜索选项,有时它们不是。我要搜索的值显示在“高级”部分中,因此为了使我的脚本正常工作,我添加了一个IF语句。

<input type="text" value="" maxlength="30" size="30" name="guiSystemID">

IF语句查找我需要输入数据的字段,如果该字段不存在则表示高级选项不可见我需要单击按钮以展开搜索选项。 / p>

我创建了以下IF语句。

     if (!driver.findElement(By.name("guiSystemID")).isDisplayed()) {
         driver.findElement(By.cssSelector("img[alt='Advanced']")).click();
     }

当我运行脚本并展开高级搜索时,脚本会成功运行。但是,当我运行脚本并且未展开高级搜索时,脚本会失败,告诉我它无法找到对象&#34; guiSystemID&#34;。这是令人沮丧的,因为如果它找不到它,那么我希望脚本继续,进入IF语句的True路径。

有没有人有任何关于我如何评估该字段是否出现而没有脚本失败的建议,因为它无法找到该字段。

提前致谢

西蒙

2 个答案:

答案 0 :(得分:22)

我可能会迟到回答这个问题,但它可能会帮助其他人寻找相同的内容。

我最近在使用isDisplayed()时遇到了类似的问题。我的代码是这样的

if(driver.findElement(By.xpath(noRecordId)).isDisplayed() )                                                                                                         
{         
  /**Do this*/     
}    
else    
{     
  /**Do this*/    
}

当isDisplayed尝试查找的元素存在时,此代码非常有效。但是当元素不存在时,它会继续查找,因此抛出异常“NosuchElementFound”。所以我无法测试其他部分。

我想出了一种方法来解决这个问题(使用try和catch块围绕{if,else},说出这样的话。

public void deleteSubVar() throws Exception  
{         
  try   
  {    
    if(driver.findElement(By.xpath(noRecordId)).isDisplayed() )     
    {      
      /**when the element is found do this*/     
    }    
  }      
  catch(Exception e)     
  {       
   /**include the else part here*/     
  }       
}         

希望这有帮助:)

答案 1 :(得分:3)

过去,我的.isDisplayed()结果好坏参半。由于有各种方法可以隐藏DOM上的元素,我认为它归结为isDisplayed()的灵活性问题。我倾向于想出自己的解决方案。我会分享一些我做的事情,然后为你的场景做个推荐。

除非我有一些非常具体的内容,否则我倾向于使用一个包装器方法来执行大量可见性检查。这是概念,我将把实际的实现方法留给您。对于这里的一般示例,假设“locator”是您选择的位置方法(CSS,XPath,Name,ID等)。

第一个也是最简单的检查是查看元素是否存在于DOM上。如果它不存在,它肯定是不可见的。

boolean isPresent = driver.findElements(locator).size() > 0;

然后,如果返回true,我将检查元素的尺寸:

Dimension d = driver.findElement(locator).getSize();
boolean isVisible = (d.getHeight() > 0 && d.getWidth() > 0);

现在,如果元素实际上具有大于零的高度和宽度,则维度有时会返回误报,但是,例如,另一个元素覆盖目标元素,使其显示为隐藏在页面上(在至少,我过去曾经遇到过这种情况。因此,作为最终检查(如果维度检查返回true),我查看元素的style属性(如果已定义)并相应地设置布尔值:

String elementStyle = driver.findElement(locator).getAttribute("style");
boolean isVisible = !(elementStyle.equals("display: none;") || elementStyle.equals("visibility: hidden;"));

这些适用于我遇到的大多数元素可见性场景,但有时您的前端开发人员会做一些不同的事情需要自己处理。

一个简单的场景是当有一个定义元素可见性的CSS类时。它可以被命名为任何东西,所以让我们假设“隐藏”是我们需要寻找的东西。在这种情况下,对'class'属性的简单检查应产生合适的结果(如果上述任何方法都不能这样做):

boolean isHidden = driver.findElement(locator).getAttribute("class").contains("hidden");

现在,根据您的具体情况,根据您上面给出的信息,我建议根据“src”属性的评估设置一个布尔值。这将是上面的CSS类检查的类似方法,但在稍微不同的上下文中使用,因为我们确切地知道两个状态之间的属性发生了什么变化。请注意,如果元素有两种状态(高级和基本,如您所述),这只会以这种方式工作。如果有更多的状态,我会考虑设置枚举值或类似的东西。因此,假设元素代表高级或基本:

boolean isAdvanced = driver.findElement(locator).getAttribute("src").contains("advanced_button.jpg");

从这些方法中,只要你有了布尔值,就可以相应地开始你的if / then逻辑。

我很抱歉对此感到啰嗦,但希望它能帮助你走上正确的道路。