在Selenium 2中,我想确保驱动程序加载的页面上的元素不存在。我在这里包括我天真的实现。
WebElement deleteLink = null;
try {
deleteLink = driver.findElement(By.className("commentEdit"));
} catch (NoSuchElementException e) {
}
assertTrue(deleteLink != null);
是否有更优雅的方式基本上验证断言是否抛出NoSuchElementException?
答案 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断言库来期望某个值。
答案 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")));