【问题标题】:How to chose either of 2 elements on a Webpage using Selenium WebDriver?如何使用 Selenium WebDriver 在网页上选择 2 个元素中的任何一个?
【发布时间】:2013-03-07 18:25:12
【问题描述】:

我正在对可能包含或不包含特定元素的网页进行测试。 程序如下:我填写了表格,然后点击“搜索”按钮。当浏览器打开一个新的url时,我需要选择一个element_1,但如果它不存在我必须选择element_2。

WebElement element = driver.findElement(By.xpath("//....")) || driver.findElement(By.xpath("//..."));
element.click();

//这样不行,有没有别的办法?可以不用try and catch吗?

【问题讨论】:

  • @Code Enthusiastic,你知道上面问题的答案吗?
  • @Keyser,如果我使用 if-esle,那么我需要创建一个新方法来验证元素是否存在并返回布尔值,例如:public boolean isPresent {... return present; } 我希望有一个不同的解决方案
  • 您上面的代码不是给您错误 Buras 吗?因为我应该给出driver.findElement(By.xpath("//....")) is not boolean, you can not apply boolean operation to it 之类的错误!
  • @Pratic,你是对的。它给了我一个错误。我知道它不是布尔值。我只是想写一个伪代码……来表达我的意思。
  • ok @Buras 那么我认为下面的代码应该对你有用。试试看,让我知道。 :)

标签: java selenium


【解决方案1】:

使用 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();

【讨论】:

  • 在 until 中使用 ExpectedCondition 和 Predicate 有什么区别?
  • 我认为在这种情况下隐式等待是更好的选择,因为 wait.until 只会等到 element1 或 element 2 出现,也就是说,如果 element2 在 element1 之前加载,你不觉得吗会假设 elemen1 不存在还是我在这里遗漏了什么?
  • 取决于要求。我假设第一个或第二个都可用。如果不是这样,隐式等待是更好的选择。
【解决方案2】:

你可以尝试这样的事情,是的,它使用 try 和 catch 块,但这是一个过程,因为除了 isDisplayed()、isEnabled() 和 isSelected() 之外没有特殊的方法 isPresent() 和无论如何,使用 try 和 catch 块处理异常有什么问题?

boolean isElement1Present = true;

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

if(isElement1Present == false)
     driver.findElement(By.xpath("xpathExpression2"));

或者使用下面的代码可以避免 try 和 catch 块。

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");
}

【讨论】:

  • 您忘记将其分配给某物 :p,另外,第二个元素也可能引发异常。只是彻底。
【解决方案3】:

这可能对你有帮助

 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();

【讨论】:

  • 这不会抛出 NoSuchElementException 吗?
  • 您应该捕获特定类型的异常,即 NoSuchElementException,以便您的代码更好地工作。如果 xpath 表达式有问题,上面的可能会抛出 RuntimeException 然后你正在捕获该异常并假设该元素不存在
  • @CodeEnthusiastic 开心吗?但我猜这个人非常了解java,因为他正在研究selinium。 :)
【解决方案4】:

其实没有明确的办法。您可以使用WATIR。如果您对Ruby 没问题,它确实提供了这样的代码。否则,您只需尝试并抓住。

【讨论】:

    【解决方案5】:

    我认为这里更好的方法是使用 CSS3 选择器,它可以 group selectors by using a comma:

    为蟒蛇道歉:

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

    假设网页将显示&lt;div class="not-found"&gt;,以防万一没有找到。或者用&lt;tr class="entry"&gt;显示结果

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多