来自当前节点的Xpath在java中使用firefox webdriver

时间:2015-02-27 11:13:19

标签: java selenium xpath selenium-webdriver

因此,在使用findElement(By.xpath("..."))

时,我遇到了一个小的perforemence问题

首先,我找到一个包含大约20 ul个孩子的li元素。 然后在每个孩子身上使用i,通过使用以下内容将内部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; 

之前和之后。

我从所选节点中提取内部xpaths的方式有什么问题吗?

1 个答案:

答案 0 :(得分:3)

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注入 它自己的xpath引擎,用于兼容其API。因此,我们失去了 使用WebDriver固有的本机浏览器功能的优势 促进。
  • 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")   );