当我向前移动并回到父页面时,我面临着识别对象的问题。
以下是该方案。我想点击主页上的每个链接并打印页面标题并导航回主页。
以下是我试过的代码。它可以正常点击第一个链接并返回主页。此时,需要识别列表对象,不包括已访问过的链接。怎么做?
在QTP中,我们有RefreshObject和Init来执行此操作。 WebDriver中是否有类似的方法?
WebDriver driver = new FirefoxDriver();
driver.get("http://www.googl.com/");
driver.manage().window().maximize();
List<WebElement> objWEs = driver.findElements(By.tagName("a"));
for(WebElement e:objWEs)
{
if(!e.getText().isEmpty())
{
e.click();
System.out.println(driver.getTitle());
driver.navigate().back();
}
}
driver.close();
答案 0 :(得分:1)
只要您导航到另一个网页,或者甚至切换到同一网页中的iframe
,您在内存中的任何WebElement
对象都可能会过时&#34;陈旧& #34;
一个可选的解决方案是列出所有元素ID,然后迭代该列表:
Set<String> linkIds = new HashSet<String>();
List<WebElement> links = driver.findElements(By.tagName("a"));
for (WebElement link : links)
{
if(!link.getText().isEmpty())
linkIds.add(link.getAttribute("id"));
}
for (String linkId : linkIds)
{
driver.findElement(By.id(linkId)).click();
System.out.println(driver.getTitle());
driver.navigate().back();
}
但请注意,以上所有内容均假设每个链接都有唯一的ID,并且当您导航回网页时,所有链接都会保留在网页中。如果您访问的特定网页不是这种情况,则需要采用其他方法。
当您导入和导出网页时,假设链接保持相同的顺序,您可以迭代链接ID,而不是迭代链接ID。但这有点效率较低,因为您必须在每次迭代开始时检索所有链接的完整列表。
for (int i=0; true; i++)
{
List<WebElement> links = driver.findElements(By.tagName("a"));
if (i >= links.size())
break;
links.get(i).click();
System.out.println(driver.getTitle());
driver.navigate().back();
}
当您导航回网页时,上面的代码应该,即使链接不按相同的顺序。但是,在这种情况下,你很可能会错过其中一些。
答案 1 :(得分:0)
以下是我上述问题的完整代码。
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(1, TimeUnit.MINUTES);
driver.get("http://www.googl.com/");
driver.manage().window().maximize();
for (int i=0; true; i++)
{
List<WebElement> links = driver.findElements(By.tagName("a"));
if (i >= links.size())
break;
WebElement ele=links.get(i);
if(!ele.getText().isEmpty())
{
ele.click();
System.out.println(driver.getTitle());
driver.navigate().back();
}
}
driver.close();