21

我正在使用下面的代码来检查我的网页上的元素

private boolean isElementPresent(By by) {
try {       
      driver.findElement(by);
      return true;
    } catch (NoSuchElementException e) {
        return false;
    }
    catch (Exception e)
    {       
        return false;
    }

  }

如果特定区域出现在结果中,我需要检查我的程序,如下所示

isElementPresent(By.xpath(".//*[@id='header']")));

如果存在此功能,则此功能将快速完成,但如果不存在上述功能,则它会运行很长时间。

有人可以帮我解决这个问题,以便可以快速执行此检查吗?

4

2 回答 2

42

在这里你错过了一些东西,这就是为什么它在等待如果没有元素。findElement 将等待一个元素隐式指定的时间。因此需要在该方法中将该时间设置为零。

isElementPresent(WebDriver driver, By by) {  
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);  
    try {  
        driver.findElement(by);  
        return true;  
    } catch (NoSuchElementException e) {  
        return false;  
    } finally {  
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);  
    }  
}

这里发生了 4 件重要的事情。为了:

  1. 将implicity_wait 设置为0,这样WebDriver 就不会隐式等待。

  2. 找到元素时返回 True。

  3. 当我们发现该元素不存在时捕获 NoSuchElementException 并返回 False,而不是用异常停止测试。

  4. 操作完成后将 implicitly_wait 设置回 30,以便 WebDriver 将来隐式等待。

于 2013-04-18T09:20:13.677 回答
0

显然,发送异常的时间很长,因为您的 DOM 很大,而且 xpath 不是获取元素的最快方法。但是,如果您想使用 xpath,请尝试放置最佳路径并避免使用子字符串检查的那种功能。

您的实际 xpath :.//*[@id='header']需要很长时间,因为您检查了 DOM 的所有标签。因此,如果放置您要查找的标签,例如:您想要捕获输入。你的 xpath 应该这样开始,//input[@id='1234']它会比查看所有标签更短。

于 2013-04-18T06:53:06.230 回答