2016-06-08 23 views
4

我使用linux下的网络测试分裂(v0.7.3),而铬,默认的示例代码不能在运行:分裂:如何添加铬选项?

from splinter import Browser 
from pyvirtualdisplay import Display 

d = Display(visible=0, size=(800, 600)) 
d.start() 

b = Browser('chrome') 
b.visit('http://www.google.com') 
b.quit() 

d.stop() 

在运行时,我得到了这样的例外:

selenium.common.exceptions.WebDriverException: Message: chrome not reachable 

我测试相同功能的硒与一些镀铬选项添加:

from selenium import web driver 
from selenium.webdriver.chrome.options import Options 
from pyvirtualdisplay import Display 

d = Display(visible=0, size=(800, 600)) 
d.start() 

opt = Options() 
opt.add_argument('--disable-setuid-sandbox') 
b = webdriver.Chrome(chrome_options=opt) 
b.get('http://www.google.com') 
b.quit() 

d.stop() 

该工程确定,所不同的是--disable-setuid-sandbox选项添加到铬驱动程序,如果选项不添加,将有一个僵尸chrome-sandbox进程chromium-browser

这里的问题是,我不知道如何将chrome.options.Option实例传递给splinter.Browser(),我浏览了实施splinter/driver/webdriver/chrome.py下,似乎没有进入到这样一个实例传递给splinter.Browser()。有没有其他方式可以将选项传递给Chrome驱动程序?

回答

0

我不是100%确定这会起作用,但我只是看着分裂的文档,它说。

您还可以传递对应于Selenium DesiredCapabilities参数的其他参数。

寻找分裂调用浏览器的源代码可以采取一些参数。这些参数将被传递来创建一个Chrome WebDriver的实例。于是我去了硒源代码,看到的构造是这样的:

def __init__(self, executable_path="chromedriver", port=0, 
       chrome_options=None, service_args=None, 
       desired_capabilities=None, service_log_path=None): 

没有为chrome_options一个参数,这样应该可以使用此参数来传递它。所以,如果我是正确这应该很好地工作:

opt = Options() 
opt.add_argument('--disable-setuid-sandbox') 
b = Browser(browser='chrome', chrome_options=opt) 

编辑 另外,您可以通过您所要的功能藏汉:

opt = Options() 
opt.add_argument('--disable-setuid-sandbox') 
dc = opt.to_capabilities() 
b = Browser(browser='chrome', desired_capabilities=dc) 
+0

你能告诉我链接吗?我搜索了[文档](https://splinter.readthedocs.io/en/latest/index.html),有一个'desired_capabilities',但只适用于firefox,不幸的是,'chrome_options'不适用于我目前的分裂版本(0.7.3)。 – coanor

+0

@coanor它在Remote WebDiver的文档中(https://splinter.readthedocs.io/en/latest/drivers/remote.html)我认为它不同于Chrome WebDriver,因为它同时创建了一个同一浏览器类的实例。你有没有尝试我的建议? – RemcoW

+0

@coanor以下是浏览器类的源代码https://github.com/cobrateam/splinter/blob/master/splinter/browser.py。正如你所看到的,它只不过是创建一个ChromeWebDriver并传递* args和** kwargs。所以这意味着你可以传递由Selenium WebDriver使用的参数,该参数在https://github.com/SeleniumHQ/selenium/blob/master/py/selenium/webdriver/chrome/webdriver.py#L34 – RemcoW

2

创建的BaseWebDriver一个新的实例,并设置.driver与Chrome驱动程序的一个实例。本示例启动Chrome的最大化:

from selenium.webdriver import Chrome 
from selenium.webdriver.chrome.options import Options 
from splinter.driver.webdriver import BaseWebDriver, WebDriverElement 

options = Options() 
options.add_argument('--start-maximized') 

browser = BaseWebDriver() 
browser.driver = Chrome(chrome_options=options) 

browser.visit('https://www.google.com') 
+0

Interresting,但我试过,我有恼人的问题,绝望地寻找一种方法来控制Chrome语言,因为chromedriver不会定义喜好。我的Ubuntu的语言环境是法语,所以它就像安装时使用法语作为默认语言,我无法控制这从分裂,这使我的测试失败... – Richard

0

我一直工作在分裂的过去几周叉子,你可以看看我的Dev分支,如果你想要的。我已经添加了这个和其他功能。

选项可以作为一个列表被传递给chrome_options参数

from splinter import Browser 

options = ['--start-maximized', '--disable-setuid-sandbox'] 

with Browser('chrome', chrome_options=options) as browser: 
    browser.visit('http://www.google.com') 

编辑:

因此,原来这是可能的分裂一直只使用**kwargs其通过各种可用的选项给硒司机。例如:

from splinter import Browser 

options = {'chrome_options':['--start-maximized', '--disable-setuid-sandbox']} 

with Browser('chrome', **options) as browser: 
    browser.visit('http://www.google.com') 
0

我所能做到这一点的唯一方法是通过使用add_argumentselenium.webdriver.ChromeOptions像这样:

from selenium.webdriver import ChromeOptions 
from splinter import Browser 

chrome_options = ChromeOptions() 
chrome_options.add_argument(your_argument) 

b=Browser("chrome", options=chrome_options) 
b.visit('http://www.google.com') 
b.quit() 
在你的代码

所以应该是:

from splinter import Browser 
from selenium.webdriver import ChromeOptions 
from pyvirtualdisplay import Display #I'm not certain what this is... 

d = Display(visible=0, size=(800, 600)) 
d.start() 

chrome_options = ChromeOptions() 
chrome_options.add_argument('disable-setuid-sandbox') 

b = Browser('chrome') 
b.visit('http://www.google.com') 
b.quit() 

d.stop() 

注意:我无法专门针对你的观点进行测试,因为我最近破坏了我的GRUB,所以我被困在窗口中,并且disable-setuid-sandbox选项仅适用于linux 。但是,我一直在用headless这个参数来使用这个方法。