我正在尝试使用Selenium WebDriver在网页中抓取一些锚点。我能想到的方法是将锚点放在一个列表中,然后点击每个锚点并在每次点击后向后导航。这是我的代码:
WebDriver webDriver=new FirefoxDriver();
webDriver.get(SEARCH_URL);
WebElement form2=webDriver.findElement(By.id("frmMain"));
form2.submit();
System.out.println(webDriver.getCurrentUrl());
List<WebElement>doctorAnchors=webDriver.findElements(By.xpath("//td[@class='data']/a"));
int count=0;
for(WebElement anchr:doctorAnchors){
anchr.click();
System.out.println((count++)+" : "+webDriver.getPageSource().toString());
Thread.sleep(10000);
webDriver.navigate().back();
}
代码只是通过Anchors中的第一个元素,执行click,获取页面,但是当我向后导航时,它会给出:
Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up
Command duration or timeout: 169 milliseconds
我在相同的异常中经历了各种stackoverflow帖子,并意识到它可能是由页面中的一些javascript内容引起的,似乎也是正确的,因为页面网址是:http://www.somepage.com/dispatch
我是否去任何锚点。我可以像往常一样在驱动程序打开的Web浏览器中导航回来。但为什么webDriver.navigate().back()
失败了?点击链接后如何导航回来?有没有办法可以保存驱动程序的状态,点击后单击并恢复该状态?
答案 0 :(得分:3)
我在下面给出的是您的解决方案的示例。在这里,我已经调用了一个方法,getElementWithIndex
这样做..这有效!!
在此示例中,它捕获特定frame | class | id下的所有链接并逐个导航
driver.get("www.xyz.com");
WebElement element = driver.findElement(By.id(Value));
List<WebElement> elements = element.findElements(By.tagName("a"));
int sizeOfAllLinks = elements.size();
System.out.println(sizeOfAllLinks);
for(int i=0; i<sizeOfAllLinks ;i++)
{
System.out.println(elements.get(i).getAttribute("href"));
}
for (int index=0; index<sizeOfAllLinks; index++ )
{
getElementWithIndex(By.tagName("a"), index).click();
driver.navigate().back();
}
public WebElement getElementWithIndex(By by, int index)
{
WebElement element = driver.findElement(By.id(Value));
List<WebElement> elements = element.findElements(By.tagName("a"));
return elements.get(index);
}
答案 1 :(得分:3)
当您更改页面时,您将失去对该元素的引用,因为它不再位于DOM中。一个简单的方法是在返回页面后再次获得锚点。基本上得到锚的数量并做一段时间。在那段时间里,总是得到锚列表,并从该列表中获得所需的锚点。
答案 2 :(得分:0)
WebDriver webDriver=new FirefoxDriver();
webDriver.get(SEARCH_URL);
WebElement form2=webDriver.findElement(By.id("frmMain"));
form2.submit();
System.out.println(webDriver.getCurrentUrl());
List<WebElement>doctorAnchors=webDriver.findElements(By.xpath("//td[@class='data']/a"));
boolean x = false;
int c = doctorAnchors.size();
for(int i=0; i<c; I++){
if(x){
List<WebElement>doctorAnchors=webDriver.findElements(By.xpath("//td[@class='data']/a"));
}
curElement = doctorAnchors.get(i);
curElement .click();
System.out.println((count++)+" : "+webDriver.getPageSource().toString());
Thread.sleep(10000);
webDriver.navigate().back();
x = true;
doctorAnchors = new ArrayList<WebElement>();
}
我是这样实现的。 :)