Estoy tratando de ejecutar un script de Selenium 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 de Selenium IDE (es decir, cuando simplemente obtengo la GUI para repetir mis acciones). Sin embargo, cuando exporto el código como una secuencia de comandos de Python e intento ejecutarlo desde la línea de comando, el navegador Firefox se abrirá pero nunca podrá acceder a la URL de inicio (se devuelve un error a la línea de comando y el programa se detiene). Esto me está sucediendo independientemente del sitio web, etc., al que intento acceder.
He incluido un código muy básico aquí para fines de demostración. No creo que haya incluido la sección de proxy del código correctamente ya que el error que se devuelve parece ser generado por el proxy.
Cualquier ayuda sería muy apreciada.
El siguiente código está destinado simplemente a abrir www.google.es 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()
fuente
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 aquí .
fuente
webdriver.DesiredCapabilities.EDGE['proxy']
no tiene ningún efecto porque Microsoft Edge actualmente no tiene una configuración para configurar un servidor proxy (para usar Edge con un proxy, debe configurar el proxy en la configuración de conexión de red de Windows) .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:
Tuve problemas con este código porque estaba pasando una cadena como 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 configurará en un puerto adecuado y la conexión a través de proxy no funcionará.
fuente
Proxy()
clase conFirefoxProfile()
clase. Al usar las preferencias de perfil, debe pasar ip y puerto por separado, y transmitirport
aint()
. EnProxy()
clase simplemente pasas la cadena que contiene "IP: PORT", y seguramente hace el resto del trabajo por ti.Intente configurar también el proxy sock5. Estaba enfrentando el mismo problema y se resuelve usando el proxy de calcetines
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
install_proxy ( ip , port )
desde su programa.fuente
Si alguien está buscando una solución, aquí le explicamos 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/')
fuente
Proxy con verificación. Esta es una secuencia de comandos de Python completamente nueva en referencia a una secuencia de comandos de muestra de Mykhail Martsyniuk.
# 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/")
fuente
Pruebe configurando 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 probado tanto en Windows 8 como en Mac OSX. Si está utilizando Mac OSX y no tiene selenio actualizado, puede enfrentarlo
selenium.common.exceptions.WebDriverException
. Si es así, intente nuevamente después de actualizar su seleniumfuente
El resultado indicado anteriormente puede ser correcto, pero no funciona con el controlador web más reciente. Aquí está mi solución para la pregunta anterior. Simple y dulce
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()
O
http_proxy = "http://ip:port" https_proxy = "https://ip:port" proxyDict = { "http" : http_proxy, "https" : https_proxy, } driver = webdriver.Firefox(proxy=proxyDict)
fuente
Las respuestas anteriores y sobre esta pregunta no me funcionaron con Selenium 3.14 y Firefox 68.9 en Linux, o son innecesariamente complejas. Necesitaba usar una configuración WPAD, a veces detrás de un proxy (en una VPN) y otras no. Después de estudiar un poco el código, se me ocurrió:
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)
La inicialización de Proxy establece proxyType en ProxyType.PAC (autoconfiguración desde una URL) como efecto secundario.
También funcionó con la detección automática de Firefox, usando:
from selenium.webdriver.common.proxy import ProxyType proxy = Proxy({'proxyType': ProxyType.AUTODETECT})
Pero no creo que esto funcione tanto con URL internas (no proxy) como externas (proxy) como lo hace WPAD. Las configuraciones de proxy similares también deberían funcionar para la configuración manual. Las posibles configuraciones de proxy se pueden ver en el código aquí .
Tenga en cuenta que pasar directamente el objeto Proxy
proxy=proxy
al controlador NO funciona; se acepta pero se ignora (debería haber una advertencia de desaprobación, pero en mi caso creo que Behave se lo está tragando).fuente
Como lo indicó @Dugini, se han eliminado algunas entradas de configuración . Máximo:
webdriver.DesiredCapabilities.FIREFOX['proxy'] = { "httpProxy":PROXY, "ftpProxy":PROXY, "sslProxy":PROXY, "noProxy":[], "proxyType":"MANUAL" }
fuente
Esto funcionó para mí y me permitió usar un navegador sin cabeza, solo necesita llamar al método que pasa su proxy.
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)
fuente
intente ejecutar el servicio tor, agregue la siguiente función a su código.
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()
fuente