因此,我在使用 findElement(By.xpath("...")) 时遇到了一个小性能问题
首先,我找到一个 ul
元素,其中包含大约 20 个 li
子元素。
通过在每个子项上使用 then,我使用以下命令找到信息的内部 xpath
:
List<WebElement> addrBookNames = driver.findElements(By.xpath("//ul[@class='displayAddressUL']"));
for(WebElement addr : addrBookNames)
{
String fullName = addr.findElement(By.xpath("li[@class='AddressFullName']/b")).getText();
String addressLine = addr.findElement(By.xpath("li[@class='AddressAddressLine']")).getText();
String city = addr.findElement(By.xpath("li[@class='AddressCity']")).getText();
String county = addr.findElement(By.xpath("li[@class='country']")).getText();
String phoneNumber = addr.findElement(By.xpath("li[@class='phone']")).getText();
}
上面的代码大约需要 5 秒,使用以下命令检查:
double stime = System.currentTimeMillis();
double TotalTime = System.currentTimeMillis() - stime;
之前和之后。
我从所选节点提取内部 xpath
的方式有什么问题吗?
最佳答案
1) 我会尝试作为替代 CSS 选择器方法并创建 5 个 WebElement 列表(已经在搜索字段的分割表示中):
List<WebElement> fullNames = driver.findELements(By.cssSelector("ul.displayAddressUL li.AddressFullName>b"));
List<WebElement> addressLines= driver.findELements(By.cssSelector("ul.displayAddressUL li.AddressAddressLine"));
List<WebElement> cities= driver.findELements(By.cssSelector("ul.displayAddressUL li.AddressCity"));
List<WebElement> countries=driver.findELements(By.cssSelector("ul.displayAddressUL li.country"));
List<WebElement> phoneNums=driver.findELements(By.cssSelector("ul.displayAddressUL li.phone"));
for (int i=0;i<fullNames.size(); i++){
String fullName= fullNames.get(i).getText();
String addressLine =addressLines.get(i).getText();
String city = cities.get(i).getText();
String county = countries.get(i).getText();
String phoneNumber = phoneNums.get(i).getText();
}
我还想补充一点: CSS 选择器的性能远优于 Xpath,并且在 Selenium 社区中有详细记录。原因如下:
- Xpath 引擎在每个浏览器中都不同,因此要使它们 不一致
- IE 没有原生 xpath 引擎,因此 selenium 注入(inject) 它自己的 xpath 引擎用于与其 API 兼容。因此我们失去了 使用 WebDriver 固有的 native 浏览器功能的优势 促进。
- Xpath 往往会变得复杂,因此很难在我的文档中阅读。 然而,在某些情况下,您需要使用 xpath,例如,搜索父元素或搜索 元素通过其文本(我不推荐后者)。
有关性能比较的更多详细信息,您可以获取here
2)我会推荐的另一种替代方法,如上所述 here
尝试使用HtmlUnitDriver
,这肯定会提高你的性能;
或者:
使用Javascipt执行器包装的纯js进行文本提取,例如:
String elem_css_selector="blablabla...";
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x = $(\""+elem_css_selector+"\");");
stringBuilder.append("return x.text().toString();") ;
String resultingText= (String) js.executeScript(stringBuilder.toString());
Assert.assertTrue(resultingText.trim().equals("Expected Text") );
关于java - 在java中使用firefox webdriver从当前节点获取Xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28763750/