wake-up-neo.net

Ausführen von Selenium Webdriver mit einem Proxy in Python

Ich versuche, ein Selenium Webdriver-Skript in Python auszuführen, um einige grundlegende Aufgaben auszuführen. Ich kann den Roboter dazu bringen, einwandfrei zu funktionieren, wenn er durch die Schnittstelle von Selenium IDE läuft (dh, wenn er einfach die GUI dazu bringt, meine Aktionen zu wiederholen). Wenn ich den Code jedoch als Python-Skript exportiere und versuche, ihn von der Befehlszeile aus auszuführen, wird der Firefox-Browser geöffnet, kann jedoch nie auf die Start-URL zugreifen (ein Fehler wird an die Befehlszeile zurückgegeben und das Programm wird angehalten). Dies geschieht unabhängig von der Website usw., auf die ich zugreifen möchte.

Ich habe hier einen sehr grundlegenden Code für Demonstrationszwecke eingefügt. Ich denke nicht, dass ich den Proxy-Abschnitt des Codes korrekt eingefügt habe, da der zurückgegebene Fehler vom Proxy generiert wird.

Jede Hilfe wäre sehr dankbar. 

Der folgende Code dient einfach dazu, www.google.ie zu öffnen und nach dem Wort "Selenium" zu suchen. Für mich öffnet sich ein leerer 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 __== "__main__":
    unittest.main()
48
user2479813

Wie wäre es mit so etwas 

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 können mehr darüber lesen hier .

21
Amey

Funktioniert für mich so (ähnlich wie bei @Amey und @ user4642224, aber etwas kürzer):

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

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 rufen Sie Ihren Code an:

my_proxy(PROXY_Host,PROXY_PORT)

Ich hatte Probleme mit diesem Code, weil ich eine Zeichenfolge als Port # übergeben habe:

 PROXY_PORT="31280"

Das ist wichtig:

int("31280")

Sie müssen statt eines Strings eine Ganzzahl übergeben, da Ihr Firefox-Profil nicht auf einen ordnungsgemäßen Port festgelegt ist und die Verbindung über den Proxy nicht funktioniert.

12
mrki

Wenn jemand nach einer Lösung sucht, dann wie folgt:

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/')
5
user4642224

Versuchen Sie auch, Socks5 Proxy einzurichten. Ich war mit dem gleichen Problem konfrontiert und es wurde mit dem Socken-Proxy gelöst

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 Sie install_proxy ( ip , port ) aus Ihrem Programm auf.

4
chowmean

Versuchen Sie es mit dem Einrichten von 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 hat unter Windows 8 und Mac OSX getestet. Wenn Sie Mac OSX verwenden und Selenium nicht aktualisiert wurde, können Sie Selenium.common.exceptions.WebDriverException sehen. Wenn ja, versuchen Sie es erneut, nachdem Sie Ihr Selenium aktualisiert haben

pip install -U Selenium
4
Rafayet Ullah

Proxy mit Bestätigung Dies ist ein völlig neues Python-Skript aus einem Mykhail Martsyniuk-Beispielskript.

# Load webdriver
from Selenium import webdriver

# Load proxy option
from Selenium.webdriver.common.proxy import Proxy, ProxyType

# Configure Proxy Option
prox = Proxy()
prox.proxy_type = ProxyType.MANUAL

# Proxy IP & Port
prox.http_proxy = “0.0.0.0:00000”
prox.socks_proxy = “0.0.0.0:00000”
prox.ssl_proxy = “0.0.0.0:00000”

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

# Configure ChromeOptions
driver = webdriver.Chrome(executable_path='/usr/local/share chromedriver',desired_capabilities=capabilities)

# Verify proxy ip
driver.get("http://www.whatsmyip.org/")
1
Mario Uvera

Wie von @Dugini angegeben, wurden einige config-Einträge entfernt. Maximal:

webdriver.DesiredCapabilities.FIREFOX['proxy'] = {
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "noProxy":[],
    "proxyType":"MANUAL"
 }
0
serv-inc

versuchen Sie, den tor-Dienst auszuführen, fügen Sie Ihrem Code die folgende Funktion hinzu.

def connect_tor (port):

socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', port, True)
socket.socket = socks.socksocket

def main ():

connect_tor()
driver = webdriver.Firefox()
0
o.awajan

Das oben angegebene Ergebnis ist möglicherweise korrekt, funktioniert jedoch nicht mit dem neuesten Treiber. Hier ist meine Lösung für die obige Frage. Einfach und süß


        http_proxy  = "ip_addr:port"
        https_proxy = "ip_addr:port"

        webdriver.DesiredCapabilities.FIREFOX['proxy']={
            "httpProxy":http_proxy,
            "sslProxy":https_proxy,
            "proxyType":"MANUAL"
        }

        driver = webdriver.Firefox()

ODER

    http_proxy  = "http://ip:port"
    https_proxy = "https://ip:port"

    proxyDict = {
                    "http"  : http_proxy,
                    "https" : https_proxy,
                }

    driver = webdriver.Firefox(proxy=proxyDict)
0
Dugini Vijay