Java Selenium-在元素上迭代
我的目标是:Java Selenium-在元素上迭代,java,selenium,google-chrome,Java,Selenium,Google Chrome,我的目标是: 迭代网页中的WebElements 单击所有已建立的元素并在同一会话中打开链接 使用其他逻辑解析新页面 返回到prev页面并继续循环所有prev匹配的id 我有以下代码: List<WebElement> links = driver.findElements(By.cssSelector("div[data-sigil='touchable']")); // this will display list of all images exist on page f
- 迭代网页中的WebElements
- 单击所有已建立的元素并在同一会话中打开链接
- 使用其他逻辑解析新页面
- 返回到prev页面并继续循环所有prev匹配的id
List<WebElement> links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));
// this will display list of all images exist on page
for(WebElement ele:links)
{
System.out.println("test->"+ele.getAttribute("id"));
ele.click();
Thread.sleep(500);
System.out.println("URI->"+driver.getCurrentUrl());
js.executeScript("window.history.go(-1)");
}
return "ok";
所以基本上我不能继续循环。
“点击进入新标签”并管理不同的Selenium驱动程序会话有什么有用的技术吗
非常感谢您的建议。我认为您需要创建
js
对象,如下所示
原因是您“丢失”了对JavascriptExecutor的引用
List<WebElement> links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));
// this will display list of all images exist on page
for(WebElement ele:links){
System.out.println("test->"+ele.getAttribute("id"));
ele.click();
Thread.sleep(500);
System.out.println("URI->"+driver.getCurrentUrl());
// Re initialise js executor
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.history.go(-1)");
}
return "ok";
List links=driver.findElements(由.cssSelector(“div[data sigil='touchable']);
//这将显示页面上存在的所有图像的列表
for(WebElement元素:链接){
System.out.println(“test->”+ele.getAttribute(“id”);
ele.click();
睡眠(500);
System.out.println(“URI->”+driver.getCurrentUrl());
//重新初始化js执行器
JavascriptExecutor js=(JavascriptExecutor)驱动程序;
js.executeScript(“window.history.go(-1)”;
}
返回“ok”;
发生的情况是,当您转到另一页时,列表中的所有元素都会过时。当您再次返回页面时,这些元素不会附加到页面。每次加载页面时都需要查找元素
试试这个:
List<WebElement> links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));
// this will display list of all images exist on page
String address;
for(int i=0; i<links.size(); i++){
address = driver.getCurrentUrl();
links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));
System.out.println("size: "+links.size());
WebElement ele = links.get(i);
System.out.println("test->"+ele.getAttribute("id"));
ele.click();
Thread.sleep(500);
System.out.println("URI->"+driver.getCurrentUrl());
//js.executeScript("window.history.go(-1)");
//driver.navigate().back();
driver.get(address);
}
List links=driver.findElements(由.cssSelector(“div[data sigil='touchable']);
//这将显示页面上存在的所有图像的列表
字符串地址;
对于(int i=0;我相信您的js
变量是一个WebElement,并且由于页面已更改而已更改,您需要重新查找element.thx,但是如何标记已处理的webelements ID?这是一个不同的问题。您需要找到每个链接的唯一性(如url),将其添加到字典或列表中,然后查找整个列表并删除字典/列表中的列表。我认为在运行以下行时(根据OP)js.executeScript(“window.history.go(-1)”不会发生错误
for
循环试图迭代到链接中的下一个项目时,我怀疑是它。谢谢,我得到了这个错误:ava.lang.IndexOutOfBoundsException:Index:2,大小:0在java.util.ArrayList.rangeCheck(未知源代码)在java.util.ArrayList.get(未知源代码)athello,即使使用driver.get()返回相同的错误。我应该在哪里检查显式等待?很抱歉,我对此有点困惑-由于它返回的大小为0,我假设它没有等待页面加载。我已编辑了答案。您可以再试一次吗?还有,是否有机会更改重新加载时的元素数?如果它更改,则解决方案为w我不工作。嗨,同样的错误,但我在想:有没有办法打开一个新选项卡?或者在selenium中打开一个新会话?就像我得到了所有元素id一样,单击它并在一个新会话中打开,然后执行这些操作并杀死它。thxHi,我已经用驱动程序进行了编辑。get()
code。您能使用这个并告诉我它是否有效吗?同时请检查列表的大小是否保持不变。
List<WebElement> links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));
// this will display list of all images exist on page
String address;
for(int i=0; i<links.size(); i++){
address = driver.getCurrentUrl();
links = driver.findElements(By.cssSelector("div[data-sigil='touchable']"));
System.out.println("size: "+links.size());
WebElement ele = links.get(i);
System.out.println("test->"+ele.getAttribute("id"));
ele.click();
Thread.sleep(500);
System.out.println("URI->"+driver.getCurrentUrl());
//js.executeScript("window.history.go(-1)");
//driver.navigate().back();
driver.get(address);
}