如何验证Selenium 2中不存在元素

时间:2011-06-15 05:07:15

标签: selenium selenium-webdriver

在Selenium 2中,我想确保驱动程序加载的页面上的元素不存在。我在这里包括我天真的实现。

    WebElement deleteLink = null;
    try {
        deleteLink = driver.findElement(By.className("commentEdit"));
    } catch (NoSuchElementException e) {

    }
    assertTrue(deleteLink != null);

是否有更优雅的方式基本上验证断言是否抛出NoSuchElementException?

9 个答案:

答案 0 :(得分:30)

如果您正在使用junit进行测试,并且这是您测试的唯一内容,则可以使测试期望使用

进行测试
@Test (expected=NoSuchElementException.class)
public void someTest() {
    driver.findElement(By.className("commentEdit"));
}

或者您可以使用返回元素列表的findElements方法,如果没有找到,则使用空列表(不会抛出NoSuchElementException):

...
List<WebElement> deleteLinks = driver.findElements(By.className("commentEdit"));
assertTrue(deleteLinks.isEmpty());
...

....
assertTrue(driver.findElements(By.className("commentEdit")).isEmpty());
....

答案 1 :(得分:5)

您可以使用:

#subscription

var pusher = new Pusher('<%= Pusher.key %>');
var channel = pusher.subscribe('test_channel');
channel.bind('greet', function(data) {
  $("#data.greeting").load(location.href + " #data.greeting");
 });

#trigger

<%= Pusher['test_channel'].trigger('greet', {  :greeting => "present"}) %>

如果它不存在则返回true。

答案 2 :(得分:2)

我拆分了页面类,所以我不必多次定义元素。我的nunit和mbunit测试类调用那些页面类。我还没有尝试过这个,但这就是我在考虑做到这一点所以我可以像使用WatiN一样使用.exists()。

扩展类:

public static class ExtensionMethods
{
   public static IWebElement ElementById(this IWebDriver driver, string id)
   {
      IWebElement e = null;
      try 
      {
         e = driver.FindElement(By.Id(id));
      }
      catch (NoSuchElement){}
      return e;
   }
   public static bool Exists(this IWebElement e) 
   {
      if (e == null)
         return false;  
      return true;
   }
}

页面类:

public IWebElement SaveButton { get { try { return driver.ElementById("ctl00_m_m_body_body_cp2_btnSave")); } }

测试类:

MyPageClass myPageClass = new MyPageClass(driver);
if (myPageClass.SaveButton.Exists())
{
   Console.WriteLine("element doesn't exist");
}

答案 3 :(得分:1)

您可以使用driver.findElements(&#34;您的元素&#34;)检索元素列表,然后搜索元素。如果列表中没有包含您自己想要的行为的元素:)

答案 4 :(得分:1)

最佳解决方案

  protected boolean isElementPresent(WebElement el){
        try{
            el.isDisplayed();
            return true;
        }
        catch(NoSuchElementException e){
            return false;
        }
    }

答案 5 :(得分:0)

如果您使用的是Javascript API,则可以使用WebElement.findElements()。此方法将返回一个Promise,其中包含找到的元素的数组。您可以检查数组的长度,以确保没有找到任何项目。

driver.findElements(By.css('.selector')).then(function(elements) {
  expect(elements.length).to.equal(0)
})

我在Promise的回调中使用Chai断言库来期望某个值。

参考:https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_WebElement.html

答案 6 :(得分:0)

public boolean exist(WebElement el){
   try {
      el.isDisplayed();
      return true;
   }catch (NoSuchElementException e){
      return false;
   }
}

if(exist(By.id("Locator details"))==false)

WebElement el= driver.findElementby(By.locator("locator details")
public boolean exists(WebElement el)
 try{
  if (el!=null){
   if (el.isDisplayed()){
     return true;

    }
   }
 }catch (NoSuchElementException e){
   return false;
 }
}

答案 7 :(得分:0)

使用 webdriver find_element_xxx() 会在我的代码中引发异常,并给我们带来隐式/显式 webdriver 等待的等待时间

我会去检查 DOM 元素

webdriver.execute_script("return document.querySelector('your css class')")

附上

在我们的 QA 主要姊妹网站 here

上也发现了类似的讨论

全面检查可见性+存在性

    # check NOT visible the :aftermeet and :viewintro
    #                   !                .      .                       !       !offsetWidth to check visible in pure js ref. https://stackoverflow.com/a/20281623/248616
    css='yourcss'; e=wd.execute_script(f"return document.querySelector('{css}').offsetWidth > 0") ; assert not e

    # check NOT exists :viewintro
    css='yourcss'; e=wd.execute_script(f"return document.querySelector('{css}')") ; assert not e

答案 8 :(得分:-3)

使用assertFalse:)

assertFalse(isElementPresent(By.className("commentEdit")));