2013-06-13 6 views
32

Ich versuche, ein Selenium Webdriver-Skript in Python auszuführen, um einige grundlegende Aufgaben zu erledigen. Ich kann den Roboter dazu bringen, perfekt zu funktionieren, wenn ich ihn durch die Selenium IDE Schnittstelle laufe (zB wenn ich einfach die GUI dazu bringe, meine Aktionen zu wiederholen). Wenn ich jedoch den Code als Python-Skript exportiere und versuche, ihn über die Befehlszeile auszuführen, öffnet sich der Firefox-Browser, kann aber niemals auf die Start-URL zugreifen (ein Fehler wird an die Befehlszeile zurückgegeben und das Programm stoppt). Das passiert mir unabhängig davon, auf welcher Webseite ich versuche zuzugreifen.Running Selenium Webdriver mit einem Proxy in Python

Ich habe hier einen sehr einfachen Code zu Demonstrationszwecken eingefügt. Ich glaube nicht, dass ich den Proxy-Abschnitt des Codes korrekt eingefügt habe, da der zurückgegebene Fehler scheinbar vom Proxy generiert wird.

Jede Hilfe würde sehr geschätzt werden.

Der folgende Code soll einfach www.google.ie öffnen und nach dem Wort "selen" suchen. Für mich öffnet es einen leeren Firefox Browser und stoppt.

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 
from selenium.common.exceptions import NoSuchElementException 
import unittest, time, re 
from selenium.webdriver.common.proxy import * 

class Testrobot2(unittest.TestCase): 
    def setUp(self): 

     myProxy = "http://149.215.113.110:70" 

     proxy = Proxy({ 
     'proxyType': ProxyType.MANUAL, 
     'httpProxy': myProxy, 
     'ftpProxy': myProxy, 
     'sslProxy': myProxy, 
     'noProxy':''}) 

     self.driver = webdriver.Firefox(proxy=proxy) 
     self.driver.implicitly_wait(30) 
     self.base_url = "https://www.google.ie/" 
     self.verificationErrors = [] 
     self.accept_next_alert = True 

    def test_robot2(self): 
     driver = self.driver 
     driver.get(self.base_url + "/#gs_rn=17&gs_ri=psy-ab&suggest=p&cp=6&gs_id=ix&xhr=t&q=selenium&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=seleni&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.47883778,d.ZGU&fp=7c0d9024de9ac6ab&biw=592&bih=665") 
     driver.find_element_by_id("gbqfq").clear() 
     driver.find_element_by_id("gbqfq").send_keys("selenium") 

    def is_element_present(self, how, what): 
     try: self.driver.find_element(by=how, value=what) 
     except NoSuchElementException, e: return False 
     return True 

    def is_alert_present(self): 
     try: self.driver.switch_to_alert() 
     except NoAlertPresentException, e: return False 
     return True 

    def close_alert_and_get_its_text(self): 
     try: 
      alert = self.driver.switch_to_alert() 
      alert_text = alert.text 
      if self.accept_next_alert: 
       alert.accept() 
      else: 
       alert.dismiss() 
      return alert_text 
     finally: self.accept_next_alert = True 

    def tearDown(self): 
     self.driver.quit() 
     self.assertEqual([], self.verificationErrors) 

if __name__ == "__main__": 
    unittest.main() 

Antwort

13

Wie wäre es so etwas wie dieses

PROXY = "149.215.113.110:70" 

webdriver.DesiredCapabilities.FIREFOX['proxy'] = { 
    "httpProxy":PROXY, 
    "ftpProxy":PROXY, 
    "sslProxy":PROXY, 
    "noProxy":None, 
    "proxyType":"MANUAL", 
    "class":"org.openqa.selenium.Proxy", 
    "autodetect":False 
} 

# you have to use remote, otherwise you'll have to code it yourself in python to 
driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.FIREFOX) 

Sie mehr darüber lesen können here.

+0

Diese Antwort war für mich gut . Falls jemand dies mit Edge versucht, hat 'webdriver.DesiredCapabilities.EDGE ['proxy']' keine Auswirkung, da Microsoft Edge momentan keine Einstellung zum Konfigurieren eines Proxyservers hat (um Edge mit einem Proxy zu verwenden, Sie müssen den Proxy unter den Windows-Netzwerkverbindungseinstellungen konfigurieren). –

+1

Das vollständige Dokument finden Sie unter: https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities#proxy-json-object – LeckieNi

10

Meine Lösung:

def my_proxy(PROXY_HOST,PROXY_PORT): 
     fp = webdriver.FirefoxProfile() 
     # Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5 
     print PROXY_PORT 
     print PROXY_HOST 
     fp.set_preference("network.proxy.type", 1) 
     fp.set_preference("network.proxy.http",PROXY_HOST) 
     fp.set_preference("network.proxy.http_port",int(PROXY_PORT)) 
     fp.set_preference("general.useragent.override","whater_useragent") 
     fp.update_preferences() 
     return webdriver.Firefox(firefox_profile=fp) 

Dann in Ihrem Code aufrufen:

my_proxy(PROXY_HOST,PROXY_PORT) 

ich mit diesem Code Probleme hatte, weil ich einen String als Port # vorging:

PROXY_PORT="31280" 

Das ist wichtig:

int("31280") 

Sie müssen eine Ganzzahl anstelle einer Zeichenfolge übergeben oder Ihr Firefox-Profil wird nicht auf einen korrekten Port festgelegt, und die Verbindung über Proxy wird nicht funktionieren.

+1

Port muss in int konvertiert werden? Das würde das Firefox-Proxy-Beispiel auf der offiziellen Seite falsch machen: http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp In ihrem Beispiel wird PROXYHOST: PROXYPORT als String übergeben. – Pyderman

+0

@Pyderman, du verwechselst die 'Proxy()' Klasse mit der 'FirefoxProfile()' Klasse. Mit Profileinstellungen müssen Sie IP und Port getrennt übergeben und 'port' nach' int() 'umwandeln. In der 'Proxy()' Klasse übergeben Sie einfach die Zeichenfolge, die "IP: PORT" enthält, und sicherlich erledigt sie den Rest der Arbeit für Sie. – erm3nda

4

Versuchen Sie auch, den Sock5-Proxy einzurichten. Ich war vor dem gleichen Problem, und es mithilfe des SOCKS-Proxy

def install_proxy(PROXY_HOST,PROXY_PORT): 
     fp = webdriver.FirefoxProfile() 
     print PROXY_PORT 
     print PROXY_HOST 
     fp.set_preference("network.proxy.type", 1) 
     fp.set_preference("network.proxy.http",PROXY_HOST) 
     fp.set_preference("network.proxy.http_port",int(PROXY_PORT)) 
     fp.set_preference("network.proxy.https",PROXY_HOST) 
     fp.set_preference("network.proxy.https_port",int(PROXY_PORT)) 
     fp.set_preference("network.proxy.ssl",PROXY_HOST) 
     fp.set_preference("network.proxy.ssl_port",int(PROXY_PORT)) 
     fp.set_preference("network.proxy.ftp",PROXY_HOST) 
     fp.set_preference("network.proxy.ftp_port",int(PROXY_PORT)) 
     fp.set_preference("network.proxy.socks",PROXY_HOST) 
     fp.set_preference("network.proxy.socks_port",int(PROXY_PORT)) 
     fp.set_preference("general.useragent.override","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A") 
     fp.update_preferences() 
     return webdriver.Firefox(firefox_profile=fp) 

Dann rufen install_proxy (ip , port) aus Ihrem Programm gelöst.

+0

hat mir viel Zeit gespart –

3

Wenn jemand nach einer Lösung suchen hier, wie:

from selenium import webdriver 
PROXY = "YOUR_PROXY_ADDRESS_HERE" 
webdriver.DesiredCapabilities.FIREFOX['proxy']={ 
    "httpProxy":PROXY, 
    "ftpProxy":PROXY, 
    "sslProxy":PROXY, 
    "noProxy":None, 
    "proxyType":"MANUAL", 
    "autodetect":False 
} 
driver = webdriver.Firefox() 
driver.get('http://www.whatsmyip.org/') 
2

Versuchen durch Einrichten FirefoxProfile

from selenium import webdriver 
import time 


"Define Both ProxyHost and ProxyPort as String" 
ProxyHost = "54.84.95.51" 
ProxyPort = "8083" 



def ChangeProxy(ProxyHost ,ProxyPort): 
    "Define Firefox Profile with you ProxyHost and ProxyPort" 
    profile = webdriver.FirefoxProfile() 
    profile.set_preference("network.proxy.type", 1) 
    profile.set_preference("network.proxy.http", ProxyHost) 
    profile.set_preference("network.proxy.http_port", int(ProxyPort)) 
    profile.update_preferences() 
    return webdriver.Firefox(firefox_profile=profile) 


def FixProxy(): 
    ""Reset Firefox Profile"" 
    profile = webdriver.FirefoxProfile() 
    profile.set_preference("network.proxy.type", 0) 
    return webdriver.Firefox(firefox_profile=profile) 


driver = ChangeProxy(ProxyHost ,ProxyPort) 
driver.get("http://whatismyipaddress.com") 

time.sleep(5) 

driver = FixProxy() 
driver.get("http://whatismyipaddress.com") 

Dieses Programm auf Windows 8 getestet und Mac OSX. Wenn Sie Mac OS X verwenden und wenn Sie Selen nicht aktualisiert haben, können Sie auf selenium.common.exceptions.WebDriverException stoßen.Wenn ja, dann versuchen Sie es erneut nach dem Selen

pip install -U selenium 
6

Works für mich auf diese Weise ein Upgrade (ähnlich @Amey und @ user4642224 Code, aber kürzer ein bisschen):

from selenium import webdriver 
from selenium.webdriver.common.proxy import Proxy, ProxyType 

prox = Proxy() 
prox.proxy_type = ProxyType.MANUAL 
prox.http_proxy = "ip_addr:port" 
prox.socks_proxy = "ip_addr:port" 
prox.ssl_proxy = "ip_addr:port" 

capabilities = webdriver.DesiredCapabilities.CHROME 
prox.add_to_capabilities(capabilities) 

driver = webdriver.Chrome(desired_capabilities=capabilities)