Ich versuche, ein Selenium Webdriver-Skript in Python auszuführen, um einige grundlegende Aufgaben auszuführen. Ich kann den Roboter zum Funktionieren bringen, wenn er über die Selenium IDE-Schnittstelle ausgeführt wird (dh wenn einfach die GUI meine Aktionen wiederholt). Wenn ich den Code jedoch als Python-Skript exportiere und versuche, ihn über die Befehlszeile 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 stoppt). Dies passiert mir unabhängig davon, auf welche Website usw. ich zugreifen möchte.
Ich habe hier zu Demonstrationszwecken einen sehr einfachen Code eingefügt. Ich glaube nicht, dass ich den Proxy-Abschnitt des Codes korrekt eingefügt habe, da der zurückgegebene Fehler vom Proxy generiert zu werden scheint.
Jede Hilfe wäre sehr dankbar.
Der folgende Code soll lediglich 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()
quelle
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 Sie hier .
quelle
webdriver.DesiredCapabilities.EDGE['proxy']
hat dies keine Auswirkung, da Microsoft Edge derzeit keine Einstellung zum Konfigurieren eines Proxyservers hat (um Edge mit einem Proxy zu verwenden, müssen Sie den Proxy unter den Windows-Netzwerkverbindungseinstellungen konfigurieren). .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:
Ich hatte Probleme mit diesem Code, weil ich eine Zeichenfolge als Portnummer übergeben habe:
PROXY_PORT="31280"
Das ist wichtig:
int("31280")
Sie müssen eine Ganzzahl anstelle einer Zeichenfolge übergeben, da sonst Ihr Firefox-Profil nicht auf einen ordnungsgemäßen Port eingestellt wird und die Verbindung über den Proxy nicht funktioniert.
quelle
Proxy()
Klasse mitFirefoxProfile()
Klasse. Mit den Profileinstellungen müssen Sie IP und Port getrennt übergeben undport
an übertragenint()
. In derProxy()
Klasse übergeben Sie einfach die Zeichenfolge "IP: PORT" und erledigt den Rest der Arbeit für Sie.Versuchen Sie auch, den sock5-Proxy einzurichten. Ich hatte das gleiche Problem und es wird 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)
Rufen Sie dann
install_proxy ( ip , port )
von Ihrem Programm aus auf.quelle
Wenn jemand nach einer Lösung sucht, gehen Sie wie folgt vor:
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/')
quelle
Proxy mit Überprüfung. Dies ist ein völlig neues Python-Skript, das auf ein Mykhail Martsyniuk-Beispielskript verweist.
# 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/")
quelle
Versuchen Sie es, indem Sie FirefoxProfile einrichten
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 wurde sowohl unter Windows 8 als auch unter Mac OS X getestet . Wenn Sie Mac OSX verwenden und Selen nicht aktualisiert wurde, kann dies zu Problemen führen
selenium.common.exceptions.WebDriverException
. Wenn ja, versuchen Sie es nach dem Aufrüsten Ihres Selens erneutquelle
Das oben angegebene Ergebnis ist möglicherweise korrekt, funktioniert jedoch nicht mit dem neuesten Webdriver. 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)
quelle
Die obigen Antworten auf diese Frage haben bei Selenium 3.14 und Firefox 68.9 unter Linux entweder nicht funktioniert oder sind unnötig komplex. Ich musste eine WPAD-Konfiguration verwenden, manchmal hinter einem Proxy (in einem VPN) und manchmal nicht. Nachdem ich den Code ein wenig studiert hatte, kam ich auf:
from selenium import webdriver from selenium.webdriver.common.proxy import Proxy from selenium.webdriver.firefox.firefox_profile import FirefoxProfile proxy = Proxy({'proxyAutoconfigUrl': 'http://wpad/wpad.dat'}) profile = FirefoxProfile() profile.set_proxy(proxy) driver = webdriver.Firefox(firefox_profile=profile)
Die Proxy-Initialisierung setzt proxyType als Nebeneffekt auf ProxyType.PAC (Autokonfiguration über eine URL).
Es funktionierte auch mit der automatischen Erkennung von Firefox unter Verwendung von:
from selenium.webdriver.common.proxy import ProxyType proxy = Proxy({'proxyType': ProxyType.AUTODETECT})
Ich denke jedoch nicht, dass dies sowohl mit internen URLs (nicht als Proxy) als auch mit externen (Proxy) funktionieren würde, wie dies bei WPAD der Fall ist. Ähnliche Proxy-Einstellungen sollten auch für die manuelle Konfiguration funktionieren. Die möglichen Proxy-Einstellungen finden Sie im Code hier .
Beachten Sie, dass die direkte Übergabe des Proxy-Objekts
proxy=proxy
an den Treiber NICHT funktioniert - es wird akzeptiert, aber ignoriert (es sollte eine Verfallswarnung geben, aber in meinem Fall denke ich, dass Behave es verschluckt).quelle
Wie von @Dugini angegeben, wurden einige Konfigurationseinträge entfernt. Maximal:
webdriver.DesiredCapabilities.FIREFOX['proxy'] = { "httpProxy":PROXY, "ftpProxy":PROXY, "sslProxy":PROXY, "noProxy":[], "proxyType":"MANUAL" }
quelle
Dies hat bei mir funktioniert und ermöglicht die Verwendung eines Headless-Browsers. Sie müssen nur die Methode aufrufen, die Ihren Proxy übergibt.
def setProxy(proxy): options = Options() options.headless = True #options.add_argument("--window-size=1920,1200") options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") prox = Proxy() prox.proxy_type = ProxyType.MANUAL prox.http_proxy = proxy prox.ssl_proxy = proxy capabilities = webdriver.DesiredCapabilities.CHROME prox.add_to_capabilities(capabilities) return webdriver.Chrome(desired_capabilities=capabilities, options=options, executable_path=DRIVER_PATH)
quelle
Versuchen Sie, den Dienst auszuführen, und 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()
quelle