Java 如何使用Selenium 2查找两种潜在元素?

Java 如何使用Selenium 2查找两种潜在元素?,java,selenium-webdriver,testng,Java,Selenium Webdriver,Testng,这里是超级新手 我正在测试一个页面,该页面要么返回tweet列表,要么如果没有可用的tweet,则返回一个无结果页面。所以我有两个可能可以接受的结果。我试图在Selenium 2中编写一个断言来测试任何一个元素,但如果两个元素都没有出现,则返回一个错误 我正在使用页面对象模型,并编写了以下内容: Assert.assertTrue((iu.twitterUsername().isDisplayed()) || (iu.noData().isDisplayed()), "Page is not l

这里是超级新手

我正在测试一个页面,该页面要么返回tweet列表,要么如果没有可用的tweet,则返回一个无结果页面。所以我有两个可能可以接受的结果。我试图在Selenium 2中编写一个断言来测试任何一个元素,但如果两个元素都没有出现,则返回一个错误

我正在使用页面对象模型,并编写了以下内容:

Assert.assertTrue((iu.twitterUsername().isDisplayed()) || (iu.noData().isDisplayed()), "Page is not loading")
但是,当显示“无数据”页面时,在OR语句的第一部分中找不到元素。我认为“isDisplayed”的目的是检查元素是否存在。为什么我得到一个元素未找到错误?显然它不在那里,我想进入我的OR声明的第二部分

当有两个可能的可接受结果时,有没有更好的方法来编写此文件?

WebElement.isDisplayed()方法不会告诉您是否存在元素;它告诉您它是否显示在页面上(而不是隐藏)

您可以使用WebDriver.findElement()方法来测试元素是否已加载;如果没有,它将抛出一个NoTouchElementException。您的方法可能如下所示:

public static boolean isElementLoaded(WebDriver driver, By findBy) {
    try {
        driver.findElement(findBy));
    } catch (NoSuchElementException e) {
        return false;
    } 
    return true;     
}
您可以使用如下内容更改WebDriver等待元素加载的时间,将其更改为5秒:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

或者,您可以创建一个方法,该方法将轮询元素,直到达到超时。

它应该尽可能简单

WebDriver driver = new FirefoxDriver();
WebElement element = driver.findElement(By.id(id));
假设您在查找元素之前正在做一些事情,我建议使用WebDriverWait,如果在分配的时间内找不到元素,则抛出并捕获异常

WebDriverWait wait = new WebDriverWait(driver, 10);
try {
   wait.until(ExpectedConditions.elementToBeSelected(By.id(id)));
} catch (ElementNotFound e) {};
element = driver.findElement(By.id(id));

谢谢你的帮助。也许我用错了方法。我想使用selenium 2查找一个元素,如果它不在页面上,让testng断言抛出一个失败。然而,在testng可以运行断言之前,我得到了NoSuchelementException。是否有更好的方法验证页面上是否存在元素?我试过你的链接,但没用。@Joe我想你这里缺少一些基本的东西
findElement()
findElements()
(只有这些方法)用于确定页面上是否存在元素。如果某个元素不在页面上,
findElement()
会抛出一个
NoTouchElementException
。这就是API的工作方式,没有办法。如果您不想在元素不在页面上时捕获异常,可以使用
findelelements()
,它返回一个空列表,这意味着如果返回列表的
size()
为0,则元素不存在。我已删除该链接,因为我认为它在这种情况下不再有用;如果希望在元素出现之前进行轮询,可以使用WebDriverWait。我还在上面添加了一个示例方法,演示如何捕获异常并返回一个布尔值,我认为这就是您最终要做的。@JimEvans这就是我最后要做的。我使用FindElements,然后断言size()>0。谢谢你的帮助@codemiller,我现在在使用FindElement时使用try-catch块,这样我就可以抛出自己的错误。因为我使用testng,所以我使用了一个类似的try-catch块,然后是assert.fail。谢谢你的帮助!