Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Selenium-在元素上迭代_Java_Selenium_Google Chrome - Fatal编程技术网

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);
        }