List.get(index)扩展xpath为另一个List <webelement>

时间:2019-02-08 21:56:50

标签: java selenium-webdriver xpath

我需要使用另一个List的值初始化List,并使用循环中的索引

我已经尝试过以下代码段:

List <WebElement> row = driver.findElements(By.xpath("//*[@id='row']"));
for (int x=0; x<row.size(); x++){
String value = row.get(x).findElements(xpath to extend that element).get(x).getText() //just a sample manipulation

// THEN HERE'S THE PROBLEM
//I NEED TO EXTEND AGAIN THE LIST TO ANOTHER LIST
List <WebElement> another_row = row.get(x).findElements('//*[@class='house active' or @class='house']//*[contains(@id,'room')]')
//another for loop for another_row 
}

问题是row.get(x)部分无法正常工作。我将第一个列表中的所有节点都添加到新列表中。

编辑:我的问题有点像this,但在List <WebElement>和循环中

2 个答案:

答案 0 :(得分:2)

您可以通过获取父xpath,然后将该父xpath传递到要获取的子元素的xpath来实现。

List<WebElement> parentElements = driver.findElements(By.xpath("xpath of the parent element"));
List<WebElement> childElements = parentElements.get(0).findElements(By.xpath("xpath of the child element"));

如果您的情况是将第一个列表中的所有节点都添加到新的子列表中,则可以使用xpath中的索引直接获取父节点的第一个元素,例如:

WebElement parentElement = driver.findElement(By.xpath("(//*[@id='row'])[1]"));

您还可以像这样设置元素的索引:

int i = 1;
WebElement parentElement = driver.findElement(By.xpath("(//*[@id='row'])["+i+"]"));

现在,通过此父元素,您可以获取子列表元素,例如:

List<WebElement> childElements = parentElement.findElements(By.xpath("xpath of the child element"));

答案 1 :(得分:1)

由于您试图从上一个WebElement中查找元素,因此建议您搜索嵌套元素。以//开始XPath的意思是“当前页面上的任何地方”。这很可能不是您想要的。

在嵌套XPath的开头添加一个点,因此.//的意思是“相对于上一个元素的任何位置”。这很可能是您想要的。

official documentation中也对此进行了解释:

  

使用xpath时,请注意webdriver遵循标准约定:前缀为“ //”的搜索将搜索整个文档,而不仅仅是该当前节点的子代。使用“ .//”将搜索限制为该WebElement的子级。