Selenium 动作多线程

Selenium actions multithreading

我想打开多个 Selenium WebDriver 并在不同的线程中处理它们。问题是Selenium Action class如何共享键盘/鼠标资源?

public class InterruptInput implements Runnable {

    public static void main(String[] args) {
        // two instances of action will run simultaneously
        new Thread(new InterruptInput()).start();
        new Thread(new InterruptInput()).start();
    }

    @Override
    public void run() {
        // not sure if the same can be replicated using ChromeDriver
        WebDriver driver = new FirefoxDriver();
        Actions act1 = new Actions(driver);
        act1.moveToElement(searchBar)
                .click()
                .sendKeys("G")
                .pause(1000)
                .sendKeys("O")
                .pause(1000)
                .sendKeys("O")
                .pause(1000)
                .sendKeys("G")
                .pause(1000)
                .sendKeys("L")
                .pause(1000)
                .sendKeys("E")
                .pause(1000)
                .perform();
    }
}

观察到的结果是:

  1. 将打开两个浏览器。每个人都会在 7 秒内在搜索栏中输入 GOOGLE。没有干扰。
  2. 如果我手动单击同一页面上的某处,并将搜索栏移出焦点,输入将被中断。
  3. 如果我在其中一个浏览器中手动打开一个新标签,或者切换到操作系统中的其他应用程序,GOOGLE 将在后台完成输入。

这是如何实现的?这是否意味着我可以打开尽可能多的 WebDriver,而不用担心堵塞 I/O。这与主动接管键盘和鼠标控制的 Java 的 Robot class 有何不同?作为参考,我使用的是 Windows 10。不确定这是否取决于平台。

我的基本目的是,我正在编写一个简单的应用程序,允许用户(我)抓取一些网站,同时显然允许用户在计算机上做其他工作。

当您使用 Actions class 时,您没有使用真正的输入设备。您唯一共享的是代码中的内容 - WebDriver 每个线程都是新的对象,因此没有干扰。

因此,通过执行“鼠标移动”,您向 webdriver 发送命令,该命令将事件发送到浏览器,如果您使用真正的鼠标或键盘,它会接收到该事件。真正的鼠标指针不会移动