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

use*_*857 8 selenium webdriver

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

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

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

当隐藏高级搜索时,IMG src以"/Styles/_Images/advanced_button.jpg"结尾,当高级搜索可见时,IMG src以"/Styles/_Images/basic_button.png"结尾

当我打开页面时,有时会显示高级搜索选项,有时则不会.我想要搜索的值出现在"高级"部分中,因此为了使我的脚本正常工作,我添加了一个IF语句.

<input type="text" value="" maxlength="30" size="30" name="guiSystemID">
Run Code Online (Sandbox Code Playgroud)

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

我创建了以下IF语句.

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

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

有没有人有任何建议,我怎么能评估该字段是否出现而没有脚本失败,因为它找不到该字段.

提前致谢

西蒙

小智 24

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

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

if(driver.findElement(By.xpath(noRecordId)).isDisplayed() )                                                                                                         
{         
  /**Do this*/     
}    
else    
{     
  /**Do this*/    
}
Run Code Online (Sandbox Code Playgroud)

当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*/     
  }       
}         
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)


tim*_*fer 6

过去我用 .isDisplayed() 得到了混合结果。由于有多种方法可以在 DOM 上隐藏元素,我认为这归结为 isDisplayed() 的灵活性问题。我倾向于想出我自己的解决方案。我将分享我所做的一些事情,然后为您的场景提出建议。

除非我有一些非常具体的东西,否则我倾向于使用包装器方法来执行许多可见性检查。这是概念,我将把实际的实现方法留给你。对于此处的一般示例,假设“定位器”是您选择的定位方法(CSS、XPath、名称、ID 等)。

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

boolean isPresent = driver.findElements(locator).size() > 0;
Run Code Online (Sandbox Code Playgroud)

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

Dimension d = driver.findElement(locator).getSize();
boolean isVisible = (d.getHeight() > 0 && d.getWidth() > 0);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

boolean isHidden = driver.findElement(locator).getAttribute("class").contains("hidden");
Run Code Online (Sandbox Code Playgroud)

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

boolean isAdvanced = driver.findElement(locator).getAttribute("src").contains("advanced_button.jpg");
Run Code Online (Sandbox Code Playgroud)

通过这些方法中的任何一种,一旦您获得布尔值,您就可以相应地开始您的 if/then 逻辑。

我很抱歉在这个问题上啰嗦了很久,但希望它可以帮助你走上正确的道路。

  • 虽然我同意你对 `isDisplayed` 可能带来的“奇怪”的看法,但你实际上是在复制它已经在做的事情。Selenium 毕竟是开源的,使用的 JS 代码在 [here](https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L557)。这与您所做的完全相同(即检查高度和宽度、显示样式等)。您还可以查看 WebDriver 规范,其中 [详细说明这些步骤](http://www.w3.org/TR/webdriver/#determining-visibility)。就个人而言,归结为没有“一刀切”的检查方式。 (2认同)