Multithreading 多线程:chromedriver不在第二个窗口中打开url
线程函数中的Java代码:Multithreading 多线程:chromedriver不在第二个窗口中打开url,multithreading,selenium,google-chrome,selenium-chromedriver,Multithreading,Selenium,Google Chrome,Selenium Chromedriver,线程函数中的Java代码: System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver"); ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.addArguments("--no-sandbox"); chromeOptions.addArguments("--user-data-dir="+config.
System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--no-sandbox");
chromeOptions.addArguments("--user-data-dir="+config.chromeUserDir);
chromeOptions.addArguments("--profile-directory="+profile);
chromeOptions.addArguments("--start-maximized");
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get("https://www.google.com");
和创建对象,并使用以下代码在线程中启动
Driver d1 = new Driver(profile);
d1.start();
Driver d2 = new Driver(profile1);
d1.start();
已经创建了两个不同的配置文件,代码在单线程下运行良好,但在多线程下无法在两个单独的窗口中打开google网站。上面说,
Starting ChromeDriver 2.42.591071 (0b695ff80972cc1a65a5cd643186d2ae582cd4ac) on port 25692
Only local connections are allowed.
Starting ChromeDriver 2.42.591071 (0b695ff80972cc1a65a5cd643186d2ae582cd4ac) on port 25954
Only local connections are allowed.
Oct 14, 2018 2:10:46 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
Oct 14, 2018 2:10:46 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
Created new window in existing browser session.
它只在一个窗口中打开谷歌。由另一个线程打开的窗口保持空闲。有人能帮忙吗?问题分析
即使您尝试在两个配置文件中连续运行chrome驱动程序而不退出驱动程序,也可能会重现此问题
ChromeOptions ChromeOptions S1=新的ChromeOptions;
chromeOptions1.addArguments user data dir=C:/Users/My UserName/AppData/Local/Google/Chrome/user data/Default;
chromeOptions1.addArguments配置文件目录=配置文件1;
WebDriver driver1=新的ChromeDriverChromeOptions 1;
司机1。gethttps://www.google.com;
ChromeOptions ChromeOptions S2=新的ChromeOptions;
chromeOptions2.addArguments user data dir=C:/Users/My UserName/AppData/Local/Google/Chrome/user data/Default;
chromeOptions2.addArguments配置文件目录=配置文件2;
WebDriver driver2=新的ChromeDriverChromeOptions 2;
运行第一个实例时,浏览器启动,页面将被访问。运行第二个实例时,浏览器会启动,但页面不会打开。
driver.get行失败,第二个实例出现以下异常
线程主org.openqa.selenium.NoSuchSessionException中出现异常:会话id无效
驱动程序信息:chromedriver=70.0.3538.16 16ed95b41bb05e565b11fb66ac33c660b721f778,平台=Windows NT 10.0.17134 x86_64警告:服务器未提供任何堆栈跟踪信息
命令持续时间或超时:2.99秒
驱动程序信息:org.openqa.selenium.chrome.ChromeDriver
功能[{message=未知错误:Chrome无法启动:崩溃
未知错误:DevToolsActivePort文件不存在
从chrome位置C:\Program Files x86\Google\chrome\Application\chrome.exe启动的进程不再运行,因此ChromeDriver假定chrome已崩溃。
驱动程序信息:chromedriver=70.0.3538.16 16ed95b41bb05e565b11fb66ac33c660b721f778,平台=Windows NT 10.0.17134 x86_64,平台=ANY}]
当第一个实例启动时,用户数据目录被锁定,第二个实例出现错误,因为用户数据目录正在使用中
我们可以通过使用一个配置文件手动打开一个chrome实例,并使用chrome驱动程序尝试使用其他配置文件打开另一个chrome实例来模拟这个问题
解决方案
我们必须为每个配置文件使用不同的用户数据目录。我们不需要在chrome浏览器中手动创建配置文件,也不需要在chrome选项中提供-profile目录参数。但是您可以通过为每个chrome驱动程序实例提及不同的用户数据目录路径来维护会话和历史记录
ChromeOptions ChromeOptions=新的ChromeOptions;
chromeOptions.addArguments用户数据目录=C:/ChromeProfiles/FirstProfile;//第一个配置文件的自定义目录路径
WebDriver驱动程序=新的ChromeDriverchromeOptions;
驾驶员gethttps://www.google.com;
ChromeOptions ChromeOptions=新的ChromeOptions;
chromeOptions.addArguments用户数据目录=C:/ChromeProfiles/SecondProfile;//自定义目录路径第二个配置文件
WebDriver驱动程序=新的ChromeDriverchromeOptions;
驾驶员gethttps://www.google.com;
这是将维护会话和历史的两个配置文件,您正在寻找
此外,多线程也可以正常工作
类驱动程序扩展线程{
私有字符串配置文件;
公共驱动器字符串配置文件{
this.profile=profile;
}
公开募捐
{
System.out.println线程+
Thread.currentThread.getId+
正在运行;
ChromeOptions ChromeOptions=新的ChromeOptions;
chromeOptions.addArguments-no-sandbox;
chromeOptions.addArguments用户数据dir=C:/ChromeProfiles/+profile;
//addArguments配置文件目录=+配置文件;
chromeOptions.addArguments-start-maximized;
WebDriver驱动程序=新的ChromeDriverchromeOptions;
驾驶员gethttps://www.google.com;
}
}
公共类多线程驱动程序
{
公共静态无效字符串[]args
{
ChromeDriverManager.getInstance.setup;
驱动程序对象=新的驱动程序第一个配置文件;
object.start;
驱动程序对象1=新的驱动程序第二个配置文件;
目标1.启动;
}
}
问题分析
即使您尝试在两个配置文件中连续运行chrome驱动程序而不退出驱动程序,也可能会重现此问题
ChromeOptions ChromeOptions S1=新的ChromeOptions;
chromeOptions1.addArguments user data dir=C:/Users/My UserName/AppData/Local/Google/Chrome/user data/Default;
chromeOptions1.addArguments配置文件目录=配置文件1;
WebDriver driver1=新的ChromeDriverChromeOptions 1;
司机1。gethttps://www.google
.com,;
ChromeOptions ChromeOptions S2=新的ChromeOptions;
chromeOptions2.addArguments user data dir=C:/Users/My UserName/AppData/Local/Google/Chrome/user data/Default;
chromeOptions2.addArguments配置文件目录=配置文件2;
WebDriver driver2=新的ChromeDriverChromeOptions 2;
运行第一个实例时,浏览器启动,页面将被访问。运行第二个实例时,浏览器会启动,但页面不会打开。
driver.get行失败,第二个实例出现以下异常
线程主org.openqa.selenium.NoSuchSessionException中出现异常:会话id无效
驱动程序信息:chromedriver=70.0.3538.16 16ed95b41bb05e565b11fb66ac33c660b721f778,平台=Windows NT 10.0.17134 x86_64警告:服务器未提供任何堆栈跟踪信息
命令持续时间或超时:2.99秒
驱动程序信息:org.openqa.selenium.chrome.ChromeDriver
功能[{message=未知错误:Chrome无法启动:崩溃
未知错误:DevToolsActivePort文件不存在
从chrome位置C:\Program Files x86\Google\chrome\Application\chrome.exe启动的进程不再运行,因此ChromeDriver假定chrome已崩溃。
驱动程序信息:chromedriver=70.0.3538.16 16ed95b41bb05e565b11fb66ac33c660b721f778,平台=Windows NT 10.0.17134 x86_64,平台=ANY}]
当第一个实例启动时,用户数据目录被锁定,第二个实例出现错误,因为用户数据目录正在使用中
我们可以通过使用一个配置文件手动打开一个chrome实例,并使用chrome驱动程序尝试使用其他配置文件打开另一个chrome实例来模拟这个问题
解决方案
我们必须为每个配置文件使用不同的用户数据目录。我们不需要在chrome浏览器中手动创建配置文件,也不需要在chrome选项中提供-profile目录参数。但是您可以通过为每个chrome驱动程序实例提及不同的用户数据目录路径来维护会话和历史记录
ChromeOptions ChromeOptions=新的ChromeOptions;
chromeOptions.addArguments用户数据目录=C:/ChromeProfiles/FirstProfile;//第一个配置文件的自定义目录路径
WebDriver驱动程序=新的ChromeDriverchromeOptions;
驾驶员gethttps://www.google.com;
ChromeOptions ChromeOptions=新的ChromeOptions;
chromeOptions.addArguments用户数据目录=C:/ChromeProfiles/SecondProfile;//自定义目录路径第二个配置文件
WebDriver驱动程序=新的ChromeDriverchromeOptions;
驾驶员gethttps://www.google.com;
这是将维护会话和历史的两个配置文件,您正在寻找
此外,多线程也可以正常工作
类驱动程序扩展线程{
私有字符串配置文件;
公共驱动器字符串配置文件{
this.profile=profile;
}
公开募捐
{
System.out.println线程+
Thread.currentThread.getId+
正在运行;
ChromeOptions ChromeOptions=新的ChromeOptions;
chromeOptions.addArguments-no-sandbox;
chromeOptions.addArguments用户数据dir=C:/ChromeProfiles/+profile;
//addArguments配置文件目录=+配置文件;
chromeOptions.addArguments-start-maximized;
WebDriver驱动程序=新的ChromeDriverchromeOptions;
驾驶员gethttps://www.google.com;
}
}
公共类多线程驱动程序
{
公共静态无效字符串[]args
{
ChromeDriverManager.getInstance.setup;
驱动程序对象=新的驱动程序第一个配置文件;
object.start;
驱动程序对象1=新的驱动程序第二个配置文件;
目标1.启动;
}
}
因为用户数据目录在第一个实例运行时被锁定,所以您可以更改配置文件2的文件夹缓存。因为用户数据目录在第一个实例运行时被锁定,所以您可以更改配置文件2的文件夹缓存。您是否通过多次运行代码来测试此解决方案?已经为每个配置文件创建了~/.config/google chrome下的两个不同目录。我通过在home dir下创建不同的配置文件dir来尝试您的代码,不知何故,它曾经工作过一次,但后来甚至在为配置文件创建新dir之后也不工作。每次我想使用现有的chrome配置文件进行测试时。我可能有10个配置文件创建,我想在10个配置文件同时运行自动化。感谢分析。。。你的修正有效,但我无法对你的答案进行投票您是否通过多次运行代码来测试此解决方案?已经为每个配置文件创建了~/.config/google chrome下的两个不同目录。我通过在home dir下创建不同的配置文件dir来尝试您的代码,不知何故,它曾经工作过一次,但后来甚至在为配置文件创建新dir之后也不工作。每次我想使用现有的chrome配置文件进行测试时。我可能有10个配置文件创建,我想在10个配置文件同时运行自动化。感谢分析。。。你的修正有效,但我无法对你的答案进行投票你能更新一下吗
关于-user data dir=+config.chromeUserDir和-profile directory=+profile所指内容的问题?config.chromeUserDir是Linux上的~/.config/google chrome/,而-profile directory=+profile是我们在google chrome上创建配置文件时在~/.config/google chrome/下创建的配置文件1或配置文件2。你能用-user data dir=+config.chromeUserDir和-profile directory=+profile指的是什么?config.chromeUserDir是Linux上的~/.config/google chrome/,而-profile directory=+profile是我们在google chrome上创建profile时在~/.config/google chrome/下创建的profile 1或profile 2。