Java 如何使用SeleniumWebDriver选择网页上的两个元素之一?

Java 如何使用SeleniumWebDriver选择网页上的两个元素之一?,java,selenium,Java,Selenium,我正在一个网页上运行一个测试,这个网页可能有也可能没有特定的元素。 程序如下:我填写表格,然后单击搜索按钮。当浏览器打开一个新的url时,我需要选择元素_1,但如果它不存在,我必须选择元素_2 WebElement element = driver.findElement(By.xpath("//....")) || driver.findElement(By.xpath("//...")); element.click(); //这不管用,还有别的办法吗?有没有可能不用试抓就可以了?这可能会

我正在一个网页上运行一个测试,这个网页可能有也可能没有特定的元素。 程序如下:我填写表格,然后单击搜索按钮。当浏览器打开一个新的url时,我需要选择元素_1,但如果它不存在,我必须选择元素_2

WebElement element = driver.findElement(By.xpath("//....")) || driver.findElement(By.xpath("//..."));
element.click();
//这不管用,还有别的办法吗?有没有可能不用试抓就可以了?

这可能会对你有所帮助

 WebElement element = null;

try{
    element = driver.findElement(By.xpath("//path1/...."));
}catch(NoSuchElementException ex){
    try{
        element = driver.findElement(By.xpath("//path2/...."));
    }catch(NoSuchElementException ex2){}
} 

if(element!=null) element.click();

您可以尝试这样的方法,是的,它使用的是try-and-catch块,但这是我们将遵循的过程,因为除了isDisplayed、isEnabled和isSelected之外,没有其他特殊方法isPresent,使用try-and-catch块处理异常有什么错

boolean isElement1Present = true;

try{       
      driver.findElement(By.xpath("xpathExpression1"));    
}catch (NoSuchElementException e){
    isElement1Present = false;
}

if(isElement1Present == false)
     driver.findElement(By.xpath("xpathExpression2"));
或者使用下面的方法避免尝试和捕捉块

List<WebElement> elements = driver.findElements(By.xpath("xpathExpression1"));   

if (elements.size() == 0) {
    System.out.println("Element is not present"); 
} else {
    System.out.println("Element is present");
}

使用driver.findElement执行隐式等待。因此,即使出现secondElement,测试也会等待一段时间。相反,在WebDriverWait中使用findElements可能是更好的解决方案

    WebDriverWait wait = new WebDriverWait(driver, 10);
    // Wait for one element to be available
    wait.until(new Predicate<WebDriver>() {
        @Override public boolean apply(WebDriver driver) {
            return driver.findElements(By.cssSelector("xpath1")).size() > 0
                    || driver.findElements(By.cssSelector("xpath2")).size() > 0;
        }
    });
    // Get the element
    WebElement e = null;
    if (driver.findElements(By.cssSelector("xpath1")).size() > 0)
        e = driver.findElements(By.cssSelector("xpath1")).get(0);
    else if (driver.findElements(By.cssSelector("xpath2")).size() > 0)
        e = driver.findElements(By.cssSelector("xpath1")).get(0);

    if (e != null)
        e.click();

其实没有明确的办法。你可以用WATIR。如果你对Ruby还满意的话,它确实提供了这样的代码。否则,您只需尝试捕获。

我认为更好的方法是使用CSS3选择器,它可以:

为python道歉:

element = WebDriverWait(driver, 2).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "tr.entry , div.not-found"))
)

假设网页在没有找到任何内容的情况下显示。或者用

@Code显示结果,你知道上述问题的答案吗?@Keyser,如果我使用if-esle,那么我需要创建一个新方法来验证元素的存在性并返回布尔值,比如:public boolean isPresent{…return present;}我希望有一个不同的解决方案你上面的代码不是给你错误Buras吗?因为我应该给出类似driver.findElementBy.xpath/。。。。不是布尔值,不能对其应用布尔运算或类似的操作@普拉蒂奇,你说得对。这给了我一个错误。我知道它不是布尔型的。我只是想写一些伪代码…来表达我的观点。好吧@Buras那么下面的代码应该适合你。试试看,让我知道这不会引发NosTouchElementException吗?您应该捕获特定类型的异常,它是NosTouchElementException,这样代码才能更好地工作。如果xpath表达式有问题,上面的一个可能会抛出RuntimeException,那么您将捕获该异常,并假设该元素不是present@CodeEnthusiastic快乐的但我猜这家伙对java非常了解,因为他正在研究selinium在until中使用ExpectedCondition和谓词之间有什么区别?我认为隐式等待在这种情况下是更好的选择,因为wait.until将只等待元素1或元素2出现,也就是说,如果在元素1之前加载元素2,你不认为它会假定elemen1不存在或者我在这里遗漏了什么吗?取决于需求。我假设第一个或第二个将可用。如果不是这样的话,隐式等待是一个更好的选择。您忘记将它分配给某个对象:p,另外,第二个元素也可能抛出异常。只是要彻底。