remote - Ejecutando Selenium Webdriver con un proxy en Python
selenium webdriver python windows (7)
Estoy intentando ejecutar una secuencia de comandos de Selinium Webdriver en Python para realizar algunas tareas básicas. Puedo hacer que el robot funcione perfectamente cuando lo ejecuto a través de la interfaz IDE de Selenium (es decir, cuando simplemente obtengo que la GUI repita mis acciones). Sin embargo, cuando exporto el código como un script de Python e intento ejecutarlo desde la línea de comandos, el navegador Firefox se abrirá pero nunca podrá acceder a la URL inicial (se devuelve un error a la línea de comando y el programa se detiene). Esto me está sucediendo independientemente de qué sitio web, etc., estoy intentando acceder.
He incluido un código muy básico aquí para fines de demostración. No creo haber incluido correctamente la sección de proxy del código, ya que el proxy parece haber generado el error.
Cualquier ayuda sería muy apreciada.
El código siguiente simplemente tiene como objetivo abrir www.google.ie y buscar la palabra "selenio". Para mí, abre un navegador Firefox en blanco y se detiene.
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()
Funciona para mí de esta manera (similar al código @Amey y @ user4642224, pero más corto):
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)
Intenta configurar 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")
Este programa se probó tanto en Windows 8 como en Mac OSX. Si está utilizando Mac OSX y no tiene selenio actualizado, puede enfrentar selenium.common.exceptions.WebDriverException
. Si es así, intente de nuevo después de actualizar su selenio
pip install -U selenium
Intenta configurar el proxy sock5 también. Estaba enfrentando el mismo problema y se soluciona usando el proxy socks
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)
Luego llame a install_proxy ( ip , port )
desde su programa.
Mi solución:
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)
Luego llame a su código:
my_proxy(PROXY_HOST,PROXY_PORT)
Tuve problemas con este código porque estaba pasando una cadena como un número de puerto:
PROXY_PORT="31280"
Esto es importante:
int("31280")
Debe pasar un número entero en lugar de una cadena o su perfil de Firefox no se establecerá en un puerto correcto y la conexión a través del proxy no funcionará.
Qué tal algo como esto
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)
Puedes leer más sobre esto here .
Si alguien está buscando una solución, así es cómo:
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/'')
intente ejecutar el servicio, agregue la siguiente función a su código.
def connect_tor (puerto):
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()