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();
}
}
观察到的结果是:
- 将打开两个浏览器。每个人都会在 7 秒内在搜索栏中输入 GOOGLE。没有干扰。
- 如果我手动单击同一页面上的某处,并将搜索栏移出焦点,输入将被中断。
- 如果我在其中一个浏览器中手动打开一个新标签,或者切换到操作系统中的其他应用程序,GOOGLE 将在后台完成输入。
这是如何实现的?这是否意味着我可以打开尽可能多的 WebDriver
,而不用担心堵塞 I/O。这与主动接管键盘和鼠标控制的 Java 的 Robot
class 有何不同?作为参考,我使用的是 Windows 10。不确定这是否取决于平台。
我的基本目的是,我正在编写一个简单的应用程序,允许用户(我)抓取一些网站,同时显然允许用户在计算机上做其他工作。
当您使用 Actions
class 时,您没有使用真正的输入设备。您唯一共享的是代码中的内容 - WebDriver
每个线程都是新的对象,因此没有干扰。
因此,通过执行“鼠标移动”,您向 webdriver 发送命令,该命令将事件发送到浏览器,如果您使用真正的鼠标或键盘,它会接收到该事件。真正的鼠标指针不会移动
我想打开多个 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();
}
}
观察到的结果是:
- 将打开两个浏览器。每个人都会在 7 秒内在搜索栏中输入 GOOGLE。没有干扰。
- 如果我手动单击同一页面上的某处,并将搜索栏移出焦点,输入将被中断。
- 如果我在其中一个浏览器中手动打开一个新标签,或者切换到操作系统中的其他应用程序,GOOGLE 将在后台完成输入。
这是如何实现的?这是否意味着我可以打开尽可能多的 WebDriver
,而不用担心堵塞 I/O。这与主动接管键盘和鼠标控制的 Java 的 Robot
class 有何不同?作为参考,我使用的是 Windows 10。不确定这是否取决于平台。
我的基本目的是,我正在编写一个简单的应用程序,允许用户(我)抓取一些网站,同时显然允许用户在计算机上做其他工作。
当您使用 Actions
class 时,您没有使用真正的输入设备。您唯一共享的是代码中的内容 - WebDriver
每个线程都是新的对象,因此没有干扰。
因此,通过执行“鼠标移动”,您向 webdriver 发送命令,该命令将事件发送到浏览器,如果您使用真正的鼠标或键盘,它会接收到该事件。真正的鼠标指针不会移动