硒-遍历元素

时间:2019-04-18 07:47:54

标签: java selenium google-chrome

我的目标是:

  • 迭代网页中的WebElements
  • 单击所有已创建的元素并在同一会话中打开链接
  • 使用其他逻辑解析新页面
  • 返回上一页并继续循环所有上一个匹配的ID

我有此代码:

import { PubSub } from 'graphql-subscriptions';

const channels = [{
  id: 1,
  name: 'soccer',
}, {
  id: 2,
  name: 'baseball',
}];

let nextId = 3;
const CHANNEL_ADDED_TOPIC = 'newChannel';
const pubsub = new PubSub();

export const resolvers = {
  Query: {
    channels: () => {
      return channels;
    },
    channel: (root, { id }) => {
      return channels.find(channel => channel.id === id);
    },
  },
  Mutation: {
    addChannel: (root, args) => {
      const newChannel = { id: String(nextId++), messages: [], name: args.name };
      channels.push(newChannel);
      pubsub.publish(CHANNEL_ADDED_TOPIC, { channelAdded: newChannel });
      return newChannel;
    }
  },
  Subscription: {
    channelAdded: {
      subscribe: () => pubsub.asyncIterator(CHANNEL_ADDED_TOPIC)
    }
  }
};

哪个工作正常并且可以找到正确的元素id,“ ele.click()”实际上正在工作,但是执行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"; 时我总是失败

这是我的错误消息:

js.executeScript("window.history.go(-1)")

所以基本上我无法继续循环。 “单击进入新选项卡”并管理不同的Selenium驱动程序会话是否有用?

非常感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

我认为您需要像这样创建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";

答案 1 :(得分:1)

正在发生的事情是,当您转到另一个页面时,它会使列表中的所有元素陈旧。当您再次回到页面时,这些元素未附加到页面。每次加载页面时都需要查找元素。

尝试一下:

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

修改:

尝试driver.get(),因为它等待页面加载。或者,您也可以单击后直接添加其他睡眠。