[英]fastest way to locate elements selenium+java
在测试期间,我需要检查我的网站上是否有无效的工具提示和其他错误消息,以确保一切正常。 问题是硒似乎要花很长时间才能找到这些元素,并且它们被设置在计时器上,因此它们有时有时间在硒找到它们之前消失,我们正在谈论一个3秒的计时器。
现在我发现它们是这样的:
List<WebElement> error = driver.findElements(By.cssSelector("div.alert .error"));
if (error.size() == 0) {return true;}
else {return false;}
这将查找给定时间在网站上显示的所有错误消息,有时这会导致跟上进度。 工具提示是使用javascript创建和销毁的,因此不会隐藏然后显示。 有什么想法吗?
编辑:
由于该网站是单页页面,因此找到合适的页面要花费大量的元素,但是当我寻找一个实际可见的项目时它很快,因此可以最大程度地减少搜索量,我这样做是:
WebElement messages = driver.findElement(By.id("the-div-the-message-is-created-in"));
List<WebElement> error = messages.findElements(By.cssSelector("div.alert .error"));
if (error.size() == 0) {return true;}
else {return false;}
尽管它似乎并没有更快地验证元素的存在。
我在我建立的每个框架中都放了一些东西,这非常有效。.这是从此处找到的框架的摘录。 您可以在这里下载 ...
在对对象执行任何操作之前,我先实现了一种伪等待类型的方法。 自己尝试。 非常有效。
这些是AutomationTest类的方法
/**
* Checks if the element is present or not.<br>
* @param by
* @return <i>this method is not meant to be used fluently.</i><br><br.
* Returns <code>true</code> if the element is present. and <code>false</code> if it's not.
*/
public boolean isPresent(By by) {
if (driver.findElements(by).size() > 0) return true;
return false;
}
/**
* Private method that acts as an arbiter of implicit timeouts of sorts.. sort of like a Wait For Ajax method.
*/
private WebElement waitForElement(By by) {
int attempts = 0;
int size = driver.findElements(by).size();
while (size == 0) {
size = driver.findElements(by).size();
if (attempts == MAX_ATTEMPTS) fail(String.format("Could not find %s after %d seconds",
by.toString(),
MAX_ATTEMPTS));
attempts++;
try {
Thread.sleep(1000); // sleep for 1 second.
} catch (Exception x) {
fail("Failed due to an exception during Thread.sleep!");
x.printStackTrace();
}
}
if (size > 0) System.err.println("WARN: There are more than 1 " + by.toString() + " 's!");
return driver.findElement(by);
}
自己组合这些方法,就可以了。
在性能方面,我不能对您这么强调。. 使用CSS 。 它更快,更干净。 你自己看。
考虑以下,
<div id="something">
<div class="someClass">
<a href='http://google.com/search?'>Search Google</a>
</div>
</div>
让我们找到<a>
。
CSS:
div#something div.someClass > a[href^='http://google']
XPATH:
//div[@id='something']/div[contains(@class, 'someClass')]/a[starts-with(@href, 'http://google')]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.