我正在尝试使用URL启动chrome,浏览器启动,之后它什么都不做。
我在1分钟后看到以下错误:
Unable to open browser with url: 'https://www.google.com' (Root cause: org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist
(Driver info: chromedriver=2.39.562718 (9a2698cba08cf5a471a29d30c8b3e12becabb0e9),platform=Windows NT 10.0.15063 x86_64) (WARNING: The server did not provide any stacktrace information)
我的配置:
Chrome:66 Chrome浏览器:2.39.56
P.S在Firefox中一切正常
答案 0 :(得分:33)
此错误消息......
org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist
...表示 ChromeDriver 无法启动/生成新的 WebBrowser ,即 Chrome浏览器会话。
您的代码试验和所有二进制文件的版本信息会给我们一些关于出错的提示。
然而,根据Add --disable-dev-shm-usage to default launch flags似乎添加参数 --disable-dev-shm-usage
将暂时解决问题。
如果您希望启动/跨越新的 Chrome浏览器会话,您可以使用以下解决方案:
System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized"); // open Browser in maximized mode
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("--no-sandbox"); // Bypass OS security model
WebDriver driver = new ChromeDriver(options);
driver.get("https://google.com");
根据base_switches.cc disable-dev-shm-usage
似乎仅在 Linux OS 上有效:
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
// The /dev/shm partition is too small in certain VM environments, causing
// Chrome to fail or crash (see http://crbug.com/715363). Use this flag to
// work-around this issue (a temporary directory will always be used to create
// anonymous shared memory files).
const char kDisableDevShmUsage[] = "disable-dev-shm-usage";
#endif
在讨论中Add an option to use /tmp instead of /dev/shm大卫提到:
我认为这将取决于/ dev / shm和/ tmp的安装方式。 如果他们都作为tmpfs安装我假设没有任何区别。 如果由于某种原因,/ tmp未映射为tmpfs(我认为默认情况下由systemd映射为tmpfs),Chrome共享内存管理总是在创建匿名共享文件时将文件映射到内存中,所以即使在这种情况下也不应该差别很大。我想你可以在启用标志的情况下强制进行遥测测试,看看它是怎么回事。
至于为什么不默认使用,它是由共享内存团队推迟的,我想有意义的是它应该默认使用/ dev / shm作为共享内存。
最终所有这一切都应该转向使用memfd_create,但我认为这不会很快发生,因为它需要显着重构Chrome内存管理。
答案 1 :(得分:26)
我在2018-06-04周一开始看到这个问题。我们的测试每个工作日运行。似乎唯一改变的是google-chrome版本(已经更新到当前版本)JVM和Selenium是Linux盒子上的最新版本(Java 1.8.0_151,selenium 3.12.0,google-chrome 67.0.3396.62,以及xvfb的运行)。
特别添加参数" - no-sandbox "和" - 禁用-dev-shm-usage "停止了错误。
我将调查这些问题以查找有关效果的更多信息,以及触发google-chrome更新的其他问题。
reset_color()
答案 2 :(得分:16)
We were having the same issues on our jenkins slaves (linux machine) and tried all the options above.
The only thing helped is setting the argument
chrome_options.add_argument('--headless')
But when we investigated further, noticed that XVFB screen doesn't started property and thats causing this error. After we fix XVFB screen, it resolved the issue.
答案 3 :(得分:12)
我在python中遇到了同样的问题。以上帮助。这是我在python中使用的 -
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('/path/to/your_chrome_driver_dir/chromedriver',chrome_options=chrome_options)
答案 4 :(得分:8)
就我而言,在以下环境中:
3.7.5
C:\Windows
中的Google Chrome版本80和相应的ChromeDriver 3.141.0
我需要将参数--no-sandbox
和--remote-debugging-port=9222
添加到ChromeOptions
对象,并且以管理员用户的身份运行代码,方法是以Powershell / cmd作为管理员
这是相关的代码段:
options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('--disable-infobars')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')
options.add_argument('--remote-debugging-port=9222')
driver = webdriver.Chrome(options=options)
答案 5 :(得分:7)
<强>更新强>
我能够解决问题,现在我可以使用所需的URL访问chrome。
尝试提供的解决方案的结果:
我尝试了上面提供的所有设置,但我无法解决问题
有关此问题的说明:
根据我的观察,当chrome无法在scoped_dirXXXXX文件夹中找到它的引用时,会导致DevToolsActivePort文件不存在。
解决问题的步骤
添加以下代码以调用chrome
System.setProperty("webdriver.chrome.driver","pathto\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("useAutomationExtension", false);
WebDriver driver = new ChromeDriver(options);
driver.get(url);
使用上述步骤,我能够解决问题。
感谢您的回答。
答案 6 :(得分:7)
我首先在单独下载chromedriver然后使用sudo apt install chromium-browser
的情况下,在使用Python Selenium的Ubuntu 20上遇到了这个问题,即使它们是同一版本,也一直在发生。
我的解决方法是使用位于
处的repo软件包随附的提供的chrome驱动程序/snap/bin/chromium.chromedriver
driver = webdriver.Chrome(chrome_options=options, executable_path='/snap/bin/chromium.chromedriver')
答案 7 :(得分:5)
我最近也遇到了同样的问题,经过反复试验,它对我也很有效。
必须位于顶部:
options.addArguments("--no-sandbox"); //has to be the very first option
BaseSeleniumTests.java
public abstract class BaseSeleniumTests {
private static final String CHROMEDRIVER_EXE = "chromedriver.exe";
private static final String IEDRIVER_EXE = "IEDriverServer.exe";
private static final String FFDRIVER_EXE = "geckodriver.exe";
protected WebDriver driver;
@Before
public void setUp() {
loadChromeDriver();
}
@After
public void tearDown() {
if (driver != null) {
driver.close();
driver.quit();
}
}
private void loadChromeDriver() {
ClassLoader classLoader = getClass().getClassLoader();
String filePath = classLoader.getResource(CHROMEDRIVER_EXE).getFile();
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
ChromeDriverService service = new ChromeDriverService.Builder()
.usingDriverExecutable(new File(filePath))
.build();
ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox"); // Bypass OS security model, MUST BE THE VERY FIRST OPTION
options.addArguments("--headless");
options.setExperimentalOption("useAutomationExtension", false);
options.addArguments("start-maximized"); // open Browser in maximized mode
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.merge(capabilities);
this.driver = new ChromeDriver(service, options);
}
}
GoogleSearchPageTraditionalSeleniumTests.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class GoogleSearchPageTraditionalSeleniumTests extends BaseSeleniumTests {
@Test
public void getSearchPage() {
this.driver.get("https://www.google.com");
WebElement element = this.driver.findElement(By.name("q"));
assertNotNull(element);
}
}
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
答案 8 :(得分:3)
就我而言,这是 ubuntu 服务器上 CI 代理帐户的问题,我使用自定义 --user-data-dir
解决了这个问题chrome_options.add_argument('--user-data-dir=~/.config/google-chrome')
我的 CI 代理使用的帐户没有必要的权限,有趣的是一切都在 root 帐户上运行
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument('--user-data-dir=~/.config/google-chrome')
driver = webdriver.Chrome(options=chrome_options)
url = 'https://www.google.com'
driver.get(url)
get_url = driver.current_url
print(get_url)
答案 9 :(得分:2)
如this other answer中所述:
此错误消息...表示ChromeDriver无法启动/产生新的WebBrowser,即Chrome浏览器会话。
在可能的原因中,我想提到一个事实,如果您通过Xvfb运行无头铬,则可能需要export
DISPLAY
变量:就我而言,我有--disable-dev-shm-usage
和--no-sandbox
选项(建议),一切运行正常,但在运行最新版本(在撰写本文时)的Ubuntu 18.04的新安装中此错误开始发生,并且唯一可能的解决方法是执行export DISPLAY=":20"
(以前使用Xvfb :20&
启动Xvfb)。
答案 10 :(得分:2)
就我而言,它是在尝试使用默认用户个人资料时发生的:
...
options.addArguments("user-data-dir=D:\\MyHomeDirectory\\Google\\Chrome\\User Data");
...
这触发了chrome重用已经在后台运行的进程,这样,由chromedriver.exe启动的进程就被简单地终止了。
解决方案:杀死所有在后台运行的chrome.exe进程。
答案 11 :(得分:1)
将conf.js中的功能更新为
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['todo-spec.js'],
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['--disable-gpu', '--no-sandbox', '--disable-extensions', '--disable-dev-shm-usage']
}
},
};
答案 12 :(得分:1)
对于 Ubuntu 20,它确实帮助我使用我的系统 Chromium 驱动程序而不是下载的驱动程序:
# chromium which
/snap/bin/chromium
driver = webdriver.Chrome('/snap/bin/chromium.chromedriver',
options=chrome_options)
对于下载的 webdriver 看起来需要设置远程调试端口 --remote-debugging-port=9222,如答案之一(由 Soheil Pourbafrani 提供):>
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--remote-debugging-port=9222")
driver = webdriver.Chrome('<path_to>/chromedriver', options=chrome_options)
答案 13 :(得分:1)
古老的问题,但类似的问题几乎使我精神错乱,所以分享了我的解决方案。其他建议都没有解决我的问题。
当我将Docker映像Chrome安装从旧版本更新为Chrome 86时,出现此错误。我的设置不完全相同,但我们是通过Selenium Webdriver实例化Chrome的。
解决方案是将选项作为goog:chromeOptions
哈希而不是chromeOptions
哈希传递。我真的不知道这是Selenium,Chrome,Chromedriver还是其他更新,但是将来可能会有一些可怜的人在此答案中找到安慰。
答案 14 :(得分:1)
我遇到了同样的问题,我正在使用UBUNTU,PYTHON和OPERA浏览器。就我而言,问题是由我使用的Operadriver版本过旧引起的。
解决方案: 1.确保安装了最新的Opera浏览器版本(请勿使用Opera beta或Opera开发人员),然后转到官方Opera网站并从那里下载最新的Opera_stable版本。
unzip operadriver_linux64.zip
sudo mv operadriver /usr/bin/operadriver
sudo chown root:root /usr/bin/operadriver
sudo chmod +x /usr/bin/operadriver
就我而言,最新的是80.0.3987
此外,我还安装了chromedriver(但由于我在测试之前就安装了chromedriver,所以我不知道这是必需的)以便安装chromedriver,请按照上一步:v
享受并感谢我!
示例硒代码
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Opera()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.quit()
答案 15 :(得分:1)
我使用在Ubuntu 18 LTS linux上运行的Jenkins运行硒测试。在出现这样的参数“ headless”(和其他一些参数)之前,我一直遇到这个错误:
ChromeOptions options = new ChromeOptions();
options.addArguments("headless"); // headless -> no browser window. needed for jenkins
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("--no-sandbox"); // Bypass OS security model
ChromeDriver driver = new ChromeDriver(options);
driver.get("www.google.com");
答案 16 :(得分:0)
似乎有许多可能的原因导致此错误。在我们的例子中,发生错误是因为我们在代码中包含以下两行:
System.setProperty("webdriver.chrome.driver", chromeDriverPath);
chromeOptions.setBinary(chromeDriverPath);
通过删除第二行来解决。
答案 17 :(得分:0)
答案 18 :(得分:0)
就我而言,当我更改 google-chrome
和 chromedriver
版本时,错误已修复:)
#google-chrome version
[root@localhost ~]# /usr/bin/google-chrome --version
Google Chrome 83.0.4103.106
#chromedriver version
[root@localhost ~]# /usr/local/bin/chromedriver -v
ChromeDriver 83.0.4103.14 (be04594a2b8411758b860104bc0a1033417178be-refs/branch-heads/4103@{#119})
ps:selenium 版本是 3.9.1
答案 19 :(得分:0)
我遇到了同样的问题,但在我的情况下,以前将chrome安装在用户temp文件夹中,然后将其重新安装到Program文件中。因此,此处提供的任何解决方案都无济于事。但是,如果提供chrome.exe的路径,那么所有方法都可以工作:
chromeOptions.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
我希望这对某人有帮助=)
答案 20 :(得分:0)
我遇到了同样的错误,我发现原因是我的电脑磁盘已满。删除一些不必要的文件后,错误消失了。
答案 21 :(得分:0)
我的问题是 php-webdriver 中的一个错误。我的代码是:
$chromeOptions = new ChromeOptions();
$chromeOptions->addArguments([
'--headless',
'--no-sandbox',
'--disable-gpu',
'--disable-dev-shm-usage',
'--no-proxy-server'
]);
$chromeOptions->setExperimentalOption('detach', true);
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(
ChromeOptions::CAPABILITY,
$chromeOptions
);
如您所见,一切都与其他可能的原因一致。
但实际上功能并没有传递给 chromedriver。我不得不将设置 chrome 选项功能更改为:
$capabilities->setCapability(
ChromeOptions::CAPABILITY_W3C, // <<< Have to use W3C capabilities with recent versions of Chromedriver.
$chromeOptions->toArray() // <<<<< bug in php-webdriver 1.9, object not getting serialized automatically like with the deprecated capability ChromeOptions::CAPABILITY
);
我的设置是:
$ chromedriver --version
ChromeDriver 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f143-refs/branch-heads/3945@{#614})
$ java -jar selenium-server-standalone-3.141.59.jar --version
Selenium server version: 3.141.59, revision: e82be7d358
制作了一个错误报告和一个 PR 来修复 php-webdriver 中的这个错误
答案 22 :(得分:0)
我使用的是铬,但是我创建了一个名为chrome
的shell脚本,只是为了方便我从dmenu
打开浏览器。
#!/bin/bash
/usr/bin/chromium
Chrome驱动程序在PATH中查找chrome并执行该操作。结果我遇到了同样的错误。
org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: exited normally.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /home/s1n7ax/.local/share/s1n7ax/bin/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 's1n7ax', ip: '127.0.1.16', os.name: 'Linux', os.arch: 'amd64', os.version: '5.4.70-1-lts', java.version: '11.0.8'
Driver info: driver.version: ChromeDriver
remote stacktrace: #0 0x56030c96dd99 <unknown>
我刚刚删除了shell脚本,并添加了指向Chrome的软链接。现在一切正常。
答案 23 :(得分:0)
有同样的问题。我正在Google云VM上运行硒脚本。
options.addArguments("--headless");
以上一行解决了我的问题。我删除了其他可选参数。我认为其他答案中提到的其余代码行对解决云VM上的问题没有任何影响。
答案 24 :(得分:0)
TL; DR::如果您使用的是VirtualBox共享文件夹,请不要在此处创建Chrome配置文件!
我在Debian 10下遇到了这个错误,但是在Ubuntu 18.04下却没有发生。
在Selenium测试中,我想安装一个扩展程序,并使用以下Chrome选项:
chromeOptions.addArguments(
`load-extension=${this.extensionDir}`,
`user-data-dir=${this.profileDir}`,
`disable-gpu`,
`no-sandbox`,
`disable-setuid-sandbox`,
`disable-dev-shm-usage`,
);
问题是我试图在非标准目录下创建Chrome配置文件,该目录是VirtualBox共享文件夹的一部分。尽管使用了完全相同的Chrome和Chromedriver版本,但在Debian下却无法正常工作。
解决方案是在其他位置(例如~/chrome-profile
)选择配置文件目录。
答案 25 :(得分:0)
在我的情况下,端口号错误。检查启动Selenium服务器时的端口号是否与脚本中的端口号相同。
答案 26 :(得分:0)
没有解决方案适合我。但这是一种解决方法:
maxcounter=5
for counter in range(maxcounter):
try:
driver = webdriver.Chrome(chrome_options=options,
service_log_path=logfile,
service_args=["--verbose", "--log-path=%s" % logfile])
break
except WebDriverException as e:
print("RETRYING INITIALIZATION OF WEBDRIVER! Error: %s" % str(e))
time.sleep(10)
if counter==maxcounter-1:
raise WebDriverException("Maximum number of selenium-firefox-webdriver-retries exceeded.")
答案 27 :(得分:0)
当chromedriver无法找出chrome正在使用的调试端口时,就会发生这种情况。
一个可能的原因是HKEY_CURRENT_USER\Software\Policies\Google\Chrome\UserDataDir的开放缺陷
但是在我的最后一个案例中,这是其他一些未知原因。
幸运的是,手动设置了端口号:
final String[] args = { "--remote-debugging-port=9222" };
options.addArguments(args);
WebDriver driver = new ChromeDriver(options);
答案 28 :(得分:0)
仅将错误的参数传递给Chrome即可收到此错误。例如,如果我将"headless"
作为arg传递给C#ChromeDriver,它将很好地启动。如果我犯了一个错误并使用了错误的语法"--headless"
,则会收到DevToolsActivePort file doesn't exist
错误。
答案 29 :(得分:0)
在我的情况下,我处于Kubernetes环境中,在这里我无法使用默认的TMPDIR,因为它将用垃圾填满temp目录。
所以我用它来使用另一个tmpdir:
driver = new ChromeDriver(new ChromeDriverService.Builder()
.withEnvironment(ImmutableMap.of("TMPDIR", customTmpPath))
.build(), options);
但是现在我已将所有内容升级到最新版本,这似乎不再起作用。我将需要找到一种新的方法来做到这一点。
答案 30 :(得分:0)
我在Docker容器中通过Behat / Mink和Selenium运行Chrome时遇到了同样的问题。经过一番摆弄,我到达了下面的behat.yml
,上面提供了上述开关。请注意,所有这些都是我要使其成功运行所必需的。
default:
extensions:
Behat\MinkExtension:
base_url: https://my.app/
default_session: selenium2
selenium2:
browser: chrome
capabilities:
extra_capabilities:
chromeOptions:
args:
- "headless"
- "no-sandbox"
- "disable-dev-shm-usage"
答案 31 :(得分:0)
在我的情况下,我试图在Windows OS上使用chrome浏览器创建可运行的jar,并希望在无头模式下在带有CentO的unix框中运行相同的jar。我将二进制文件指向已下载并与套件打包在一起的驱动程序。对我来说,无论添加以下内容,此问题都会继续发生:
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--no-sandbox");
System.setProperty("webdriver.chrome.args", "--disable-logging");
System.setProperty("webdriver.chrome.silentOutput", "true");
options.setBinary("/pointing/downloaded/driver/path/in/automationsuite");
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("window-size=1024,768"); // Bypass OS security model
options.addArguments("--log-level=3"); // set log level
options.addArguments("--silent");//
options.setCapability("chrome.verbose", false); //disable logging
driver = new ChromeDriver(options);
我尝试过的解决方案是,在主机VM / Unix盒上下载chrome及其工具,在自动化套件和bingo中安装二进制文件并将其指向该二进制文件!它有效:)
下载命令:
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
安装命令:
sudo yum install -y ./google-chrome-stable_current_*.rpm
使用以下Google-chrome二进制路径的更新套件:
options.setBinary("/opt/google/chrome/google-chrome");
而且..它有效!
答案 32 :(得分:0)
在与jenkins服务器集成时,我也遇到了这个问题,我使用 root 用户执行jenkin作业,当我将用户更改为其他用户时,问题已解决 。我不确定为什么root用户会发生此错误。
Google Chrome版本71.0
ChromeDriver 2.45版
CentOS7版本1.153
答案 33 :(得分:-2)
我通过安装yum -y install gtk3-devel gtk3-devel-docs
“解决了这个问题,它可以正常工作
我的工作环境是:
Selenium Version 3.12.0
ChromeDriver Version v2.40
Chrome 68 level
之前:
之后:
答案 34 :(得分:-2)
由于这是此类错误最活跃的消息,因此我想提一下我的解决方案(花了几个小时来解决这个问题)。
在Ubuntu 18.04上,使用Chrome 70,Chromedriver 2.44和Python3,即使我禁用了上面列出的所有选项,我仍然遇到相同的DevToolsActivePort错误。 chromedriver日志文件以及ps表明我在chrome_options.binary_location中设置的chromedriver正在运行,但始终会出现DevToolsActivePort错误。当我删除chrome_options.binary_location ='....'并将其添加到webdriver创建中时,我可以正常使用。 webdriver.Chrome('/ ...的路径/ chromedriver',chrome_options = chrome_options)
感谢大家的宝贵意见,这些使我理解并解决了这个问题。