执行foreach循环时可以遍历另一页吗?

时间:2018-08-25 07:19:29

标签: selenium selenium-webdriver

页面上有表格,我确实需要逐行检索信息。那是由for-each处理的。在同一页面上执行以获取信息的工作正常。


但是,我们可以处理特定Row的Detail页面吗?这里“测试1”有其自己的详细信息页面。详细页面上有一些需要处理的操作。我们如何管理它并恢复到实际执行。

到目前为止,我正在处理for-each循环,并获取StaleElementReferenceException,它是正确的,因为webElement丢失了其实际的ListElement<WebElement>

List<WebElement> findList = driver.findElements(By.xpath("//a[@class='*****']));

    for (WebElement webElement : findList) {
     ...
    //detail page is access by clicking webElement
    webElement.click();

    findList = driver.findElements(By.xpath("//a[@class='*****']));
    }

如果有任何办法,请提出建议。谢谢。

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

List<WebElement> findList = driver.findElements(By.xpath("//a[@class='*****']));
for(int i = 1 ; i<=findList.size() ; i++){

   driver.findElement(By.xpath("(//a[@class='***'])[" + i + "]")).click();
   // extract some data from next page which is invoked by clicking on Test1 hyperlink.
}  

以此方式,每次您寻找//a[@class='***'][i]网络元素i时(从1一直到终点)。

P.S:无论是否指示 Test1 超链接,您都需要在devtool //a[@class='***'][1]中进行检查。

希望这会有所帮助。

答案 1 :(得分:0)

尝试收集所有页面的URL,然后打开它们。

答案 2 :(得分:0)

我可以想到两种情况:

  1. 点击链接,例如Test1打开一个新标签:

    • 在这种情况下,您可以只切换到循环内的新选项卡,完成此选项卡上的操作,最后关闭第二个选项卡/切换到第一个选项卡,然后再继续下一个版本。这也不应该导致StaleElementException。
  2. 点击链接,例如Test1重定向到同一选项卡中的其他一些URL:

    • 对于循环的每个迭代,单击目标链接,在新页面上执行一些操作。在继续下一个迭代之前,再次导航到包含表的页面并再次查找所有行元素。现在,对于下一次迭代,您将不会获得StaleElementException。您将需要使用for循环,以便可以将索引维护在外部,而不是foreach变体。
  

findList = driver.findElements(By.xpath(“ // a [@class ='*****']))

我建议您使用第一个选项,因为这样比较干净,您可以执行换档并单击链接,例如Test1强制其在新选项卡中打开,而不是在同一页面中重定向。您可以使用Selenium中提供的“ Actions api ”执行Shift +单击。