2016-06-08 15 views
4

Ich bin mit Splitter (v0.7.3) für Web-Test unter Linux, während auf Chrom kann der Standardbeispielcode nicht ausgeführt wird:splinter: wie chrome optionen hinzufügen?

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() 

Beim Laufen, bekam ich die Ausnahme wie folgt aus:

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

Und ich testen Sie die gleiche Funktion in Selen mit einigen Chrom Option hinzugefügt:

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() 

Dies funktioniert ok, der Unterschied ist die --disable-setuid-sandbox Option hinzugefügt, um Chrome-Treiber, wenn die Option nicht hinzufügen, wäre ein Zombie chrome-sandbox Prozess unter chromium-browser.

Das Problem hier ist, ich weiß nicht, wie eine chrome.options.Option Instanz splinter.Browser() passieren, durchsucht ich die Umsetzung unter splinter/driver/webdriver/chrome.py, so scheint es, dass es keinen Eintrag, eine solche Instanz splinter.Browser() passieren. Gibt es eine andere Möglichkeit, Optionen an den Chrome-Treiber zu übergeben?

Antwort

0

Ich bin nicht 100% sicher, dass das funktioniert, aber ich habe mir nur die Dokumente für Splitter angeschaut und es heißt.

Sie können auch zusätzliche Argumente übergeben, die den Selenium DesiredCapabilities-Argumenten entsprechen.

Blick in den Quellcode von Splitter Aufruf Browser kann einige Argumente zu nehmen. Diese Argumente werden dann übergeben, um eine Instanz des Chrome WebDrivers zu erstellen. Also ging ich zu dem Selen Quellcode und sah der Konstruktor wie folgt aussieht:

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

Es gibt einen Parameter für chrome_options ist so sollte es möglich sein, es zu passieren diese Parameter verwenden. Also, wenn ich richtig bin, sollten diese funktionieren:

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

bearbeiten Alternativ können Sie die Optionen wie gewünscht Fähigkeiten passieren aswell:

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

Würdest du mir den Link zeigen? Ich habe den Splitter [doc] (https://splinter.readthedocs.io/en/latest/index.html) durchsucht, es gibt eine 'sented_capabilities', aber nur für Firefox, leider sind die' chrome_options' für meinen aktuellen nicht verfügbar Splitterversion (0.7.3). – coanor

+0

@coanor Es ist in der Dokumentation für Remote WebDiver (https://splinter.readthedocs.io/en/latest/drivers/remote.html) Ich denke nicht, dass es sich von der Chrome WebDriver unterscheiden wird, da es eine erstellt Instanz derselben Browser-Klasse. Hast du meinen Vorschlag versucht? – RemcoW

+0

@coanor Hier ist der Quellcode für die Browser-Klasse https://github.com/cobrateam/splinter/blob/master/splinter/browser.py. Wie Sie sehen können, macht es wenig mehr als einen ChromeWebDriver zu erstellen und die * Argumente und ** Kwargs zu übergeben. Das heißt, Sie können die Argumente übergeben, die vom Selen WebDriver verwendet werden, der hier ist https://github.com/SeleniumHQ/selenium/blob/master/py/selenium/webdriver/chrome/webdriver.py#L34 – RemcoW

2

Erstellen Sie eine neue Instanz von BaseWebDriver und setzen .driver mit eine Instanz des Chrome-Treibers. Dieses Beispiel startet Chrome maximiert:

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

Interressant, aber ich habe das versucht und ich hatte nerviges Problem, verzweifelt nach einer Möglichkeit suchen, Chrome-Sprache zu steuern, da chromedriver definierte Einstellungen nicht definiert. Meine Ubuntu Locales sind auf Französisch, also ist es so, als wäre Chrome mit Französisch als Standardsprache installiert und ich kann das nicht vom Splitter aus kontrollieren, was meine Tests fehlgeschlagen hat ... – Richard

0

Ich habe auf einer Gabel von Splitter in den letzten paar Wochen arbeiten, können Sie meine dev Zweig überprüfen, ob Sie wollen. Ich habe diese und andere Funktionen hinzugefügt.

Optionen können als Liste auf dem chrome_options Parameter

from splinter import Browser 

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

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

Bearbeiten übergeben werden:

So stellt sich heraus dies möglich war, alle mit Splitter entlang nur **kwargs mit der die verschiedenen verfügbaren Optionen übergibt zu den Selentreibern.Zum Beispiel:

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

Der einzige Weg, den ich je war diese mithilfe der add_argument Methode mit selenium.webdriver.ChromeOptions wie so tun konnte:

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() 

so im Code wäre:

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() 

Hinweis: Ich konnte dies nicht mit Ihrem Argument testen, da ich kürzlich meinen GRUB-Code gebrochen habe, so dass ich in Windows steckengeblieben bin und die disable-setuid-sandbox-Option nur Linux ist . Jedoch habe ich diese Methode mit dem Argument headless für eine Weile verwendet.