Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Ubuntu服务器上无头运行Chromedriver_Java_Google Chrome_Selenium_Selenium Chromedriver_Headless - Fatal编程技术网

Java 在Ubuntu服务器上无头运行Chromedriver

Java 在Ubuntu服务器上无头运行Chromedriver,java,google-chrome,selenium,selenium-chromedriver,headless,Java,Google Chrome,Selenium,Selenium Chromedriver,Headless,我正在使用Selenium和Java(1.8)中的Chromedriver来进行一些自动web爬网: System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("someurl.com"); 我正在尝试迁移到Ubuntu 16.04服务器。在服务器上,我安装了Ubuntu chromedriver版本2.37,chrom

我正在使用Selenium和Java(1.8)中的Chromedriver来进行一些自动web爬网:

System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("someurl.com");
我正在尝试迁移到Ubuntu 16.04服务器。在服务器上,我安装了Ubuntu chromedriver版本2.37,chrome版本65。根据chromedriver文档,这些版本是兼容的。我已经更改了指定chromedriver在Ubuntu中位置的代码:

System.setProperty("webdriver.chrome.driver", "/usr/lib/local/chromedriver");
在运行我的程序之前,我启动了xvfb:

Xvfb -ac :99 -screen 0 1280x1024x16 &
export DISPLAY=:99
然后执行我的程序:

java -jar myprogram.jar
控制台上会打印以下内容:

Starting ChromeDriver 2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7) on port 10574
Only local connections are allowed.
Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: exited abnormally
  (Driver info: chromedriver=2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7),platform=Linux 4.4.0-112-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 60.35 seconds
Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-11T20:33:15.31Z'
System info: host: 'ubuntu-s-1vcpu-1gb-nyc1-01', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-112-generic', java.version: '1.8.0_151'
Driver info: driver.version: ChromeDriver
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
        at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
        at org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$new$0(JsonWireProtocolResponse.java:53)
        at org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$getResponseFunction$2(JsonWireProtocolResponse.java:91)
        at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:123)
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
        at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
        at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
        at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
        at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:126)
        at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:73)
        at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:136)
        at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:545)
        at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:209)
        at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:132)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:181)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:168)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:123)
        at RHio.Test.main(Test.java:39)
在端口10574上启动ChromeDriver 2.37.544315(730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7)
只允许本地连接。
线程“main”org.openqa.selenium.WebDriverException中出现异常:未知错误:Chrome无法启动:异常退出
(驱动程序信息:chromedriver=2.37.544315(730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7),平台=Linux 4.4.0-112-generic x86_64)(警告:服务器未提供任何堆栈跟踪信息)
命令持续时间或超时:60.35秒
构建信息:版本:“3.11.0”,修订版:“e59cfb3”,时间:“2018-03-11T20:33:15.31Z”
系统信息:主机:'ubuntu-s-1vcpu-1gb-nyc1-01',ip:'127.0.1.1',os.name:'Linux',os.arch:'amd64',os.version:'4.4.0-112-generic',java.version:'1.8.0_151'
驱动程序信息:Driver.version:ChromeDriver
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.openqa.selenium.remote.ErrorHandler.CreateTrowable(ErrorHandler.java:214)
位于org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
位于org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$new$0(JsonWireProtocolResponse.java:53)
位于org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$getResponseFunction$2(JsonWireProtocolResponse.java:91)
位于org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:123)
位于java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
位于java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
位于java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
位于java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
位于java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
位于java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
位于java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
位于java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
位于java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
位于org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:126)
位于org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:73)
位于org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:136)
位于org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
位于org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:545)
位于org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:209)
位于org.openqa.selenium.remote.RemoteWebDriver(RemoteWebDriver.java:132)
位于org.openqa.selenium.chrome.ChromeDriver(ChromeDriver.java:181)
位于org.openqa.selenium.chrome.ChromeDriver(ChromeDriver.java:168)
位于org.openqa.selenium.chrome.ChromeDriver(ChromeDriver.java:123)
位于RHio.Test.main(Test.java:39)

该错误确实让我们了解了发生的错误:

Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: exited abnormally
当您试图在Ubuntu服务器上启动Chromedriver和Chrome时,您必须传递以下几个选项:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(chrome_options=options, executable_path='/path/to/chromedriver')
driver.get('http://google.com/')
driver.quit()
附加说明 按照强制性要求,并确保以下各项:

  • Chromedriver位于
    /usr/local/bin/
  • Chrome浏览器位于
    /usr/bin/google Chrome

tl;博士
Chrome的故事从版本65开始,支持无头模式。不需要xvfb。好的,我试过使用无头ChromeOption,但没有运行xvfb,但问题仍然存在……对我来说很有效。如果没有额外的信息,可能会有上百种不同的错误。阅读如何创建。您使用什么版本的chromedriver和chrome?基于相关问题,我怀疑我的安装有问题。我发现了一个愚蠢的问题,但你安装了Chrome吗?(不仅仅是chromedriver,还有实际的浏览器)我猜你没有。大多数选项与无头Chrome无关。在Java中,您只需传递
chromeOptions.setHeadless(true)Chrome(Chrome\u options=options,executable\u path='/path/to/chromedriver')
为什么还要确保“chromedriver在/usr/local/bin/”内?在重新安装chromedriver和Chrome之后,确保它们都在这些文件夹中,并添加所有那些chromeOptions参数,它就工作了!谢天谢地,在我的情况下,似乎没有沙箱起作用。谢谢谢谢@DebanjanB
Chromedriver位于/usr/local/bin/
-似乎不再需要,因为您可以在代码中正确指定它,例如
System.setProperty(“webdriver.chrome.driver”,“/path/to/Chromedriver\u linux64\u v81/Chromedriver”)-为我工作