java - 可在 for 循环内运行

标签 java selenium for-loop web-scraping selenium-chromedriver

我想在线程的 for 循环内运行代码,因为它几乎会执行相同的操作,但对于不同的页面(使用 selenium webdriver)。我的问题是,我的计数器变量无法增加,因为它必须是最终的......

这是我的测试代码,但变量“tabCount”始终保持在 i 计数。

// scrape over all tabs and get data in threads
        for (int i = 0; i < tabs.size(); i++) {
            final int tabCount = i;

            Runnable r = () -> {
                webDriver.switchTo().window(tabs.get(tabCount));
                System.out.println(webDriver.getTitle());
            };

            threadPool.execute(r);
        }

        threadPool.shutdown();
        try {
            threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

任何人都可以帮助我在 chromedriver 的每个选项卡中并行执行相同的操作吗?

最佳答案

我认为你走错了地方。看看你的代码:

webDriver.switchTo().window(tabs.get(tabCount));
System.out.println(webDriver.getTitle());

您希望 webDriver 切换到另一个窗口。然后在该选项卡上执行某些操作。但是如果第一行和第二行之间存在线程上下文切换怎么办?!

如:

  • 线程 A:webDriver.switchTo()
  • 线程 B:执行 webDriver.switchTo()
  • 线程A:打印页面标题

显然这会导致竞争条件!当然,您可以添加某种锁定/同步,以便线程始终切换到选项卡并执行其工作,而另一个线程无法同时更新 webDriver 对象。但这基本上序列化了你的测试。

长话短说:webDriver 对象具有内部状态。您的方法完全忽略了这一事实,因此无法预测您的代码到底会做什么。

一个简单的修复方法是按照评论中的建议为每个线程实例化一个 WebDriver 实例。除此之外,想要了解如何以不同的方式做到这一点,以符合selenium如何“思考”并行测试的方式,请参阅here .

关于java - 可在 for 循环内运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55269337/

相关文章:

java - 如何将日期时间从一个时区转换为另一个时区

java - 当 JUnit 类具有多个导入时,如何从 Windows CMD 窗口运行 JUnit 测试?

Python - 安装了扩展的远程 Webdriver

java - 嵌套的 for 循环没有完成我要打印的序列

vb.net 逐行读取文件并复制该行的某些部分

r - 处理 R 中的重复性任务

java - 在自定义 jtable 中显示结果集

JavaFX 文本字段 CSS

java - 将文件转换为 xml,然后将其添加到 zip

python - 如何使用 Python 抓取网站数据?