没有等待元素

时间:2017-04-20 20:16:05

标签: selenium xpath

我有一个有几行的表。这些行中的一些可能具有特定元素而其他行可能不具有。肯定有些人愿意,有些人不会。

我找到了行并将其放入WebElement中。现在看看元素是否在那里我做了以下(假设xp =" .// someelement)

 List<WebElement> eles = row.findElements(By.xpath(xp)); 
 if (eles.size() == 0) {
    // element is not there
 } else {
   // element is there
 }

当元素存在时,这很好。如果不是,则需要30秒或一分钟才能发现它不在那里。如果经常打电话,这确实会减慢测试速度。我能做到

 try {
    WebElement ele = row.findElement(by.xpath(xp));
 } catch (Exception ex) {
   // element is not there
 }

使用更详细的例外。这也很好,但同样的问题。它等了一分钟或半分钟。

有没有办法更快地检查元素是否存在?如果它是相对于driver(driver.findElementBy())而不是一个元素(row.findElementBy()),我想我可能知道如何去做。

这是Java。

2 个答案:

答案 0 :(得分:0)

在您的第一个示例中,您有一个元素列表,但您没有尝试找到一个元素;但是有几个(比如一行而不是一行)。第二个元素是找到(或试图找到)一个特定的项目(比如说1行)。因此,理想情况下,你应该在评论中说某些元素不适合eles。然而,时间问题可能是隐含或明确的等待。请阅读here了解更多信息。

我更喜欢检查元素集合的第一种方式(因此你可以将它瞄准xpath并查找所有包含的标签(或者根本没有)。理想情况下你应该进行明确的等待。

这是等待的方法,它将根据轮询时间内是否存在元素(例如10秒)返回true /或false;值得注意的是,如果发现元素早于10秒限制存在,则循环将中断并返回true。当然你可以玩timeOut来达到预期的效果;不要快速(比如2秒),否则你冒着测试的风险偶尔失败,因为桌子还没有加载:

public boolean waitForElement(String elementXpath, int timeOut) {

    try{                    
    WebDriverWait wait = new WebDriverWait(driver, timeOut); 
    boolean elementPresent=wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(elementXpath)).isDisplayed());

    System.out.printf("%nElement is present [T/F]..? ")+elementPresent;
    }        
    catch(TimeoutException e1){e1.printStackTrace();elementPresent=false;}          

    return elementPresent;   
 }

我猜你已经使用了30秒的明确等待所有的findElement尝试,因此存在差异。

希望以上有所帮助,

祝你好运!

答案 1 :(得分:0)

另一种选择是使用WebDriverWait(显式等待)而不是隐式等。

这基本上使得你的测试只会在你告诉他们时等待很长时间,否则如果他们找不到你正在寻找的元素,他们会立即失败。

改编自slide52 of tourdedave's slideshare

// Use this class whenever you have to access the driver
// And you should only have to setDriver in a BeforeMethod when setting up.
// This method shows how to do it with a single browser
// This could be converted quite easily to threadlocals for parallel test runs 
public class DriverManager {
private final WebDriver driver;
public static WebDriver getDriver() {
  return driver;
}
public static setDriver(WebDriver driver) {
  DriverManager.driver = driver;
}
public class WaitUntil {
public static Boolean displayed(By locator, Integer... timeout) {
    try {
        waitFor(ExpectedConditions.visibilityOfElementLocated(locator),
        (timeout.length = 0 : null ? timeout[0];    
    } catch (TimeoutException exception) {
        return false;
    }
    return true;
}
// add additional methods you want to wait for
// Look at the source of the ExpectedConditions class to see how to create 
// your own
// e.g. presence of element
// number of results from locator changes
// element done moving
// url changes, etc.


private static void waitFor(ExpectedCondition<WebElement> condition, Integer timeout) {
    timeout = timeout != null ? timeout[0] : 5; //default timeout if no value given
    WebDriverWait wait = new WebDriverWait(driver, timeout);
    wait.until(condition);
}

}

然后在任何课程中你都可以 通过submitButtonBy = By.cssSelector(&#34; .submit); 使用WaitUntil.displayed(submitButtonBy); 它将等待5秒钟。如果你想等10: 使用WaitUntil.displayed(submitButtonBy,10);

使用一堆这样的方法创建一个类很好的事情是添加额外的异常很容易,所以你可以选择返回false,如果有一个陈旧的元素或其他东西,而不是处理页面类或测试类中的try catch。