Lancer le Webdriver Selenium avec un proxy en Python

j'essaye d'exécuter un script de Webdriver Selenium en Python pour faire quelques tâches de base. Je peux faire fonctionner parfaitement le robot en le faisant tourner à travers L'interface IDE de sélénium (c'est-à-dire en obtenant simplement L'interface graphique pour répéter mes actions). Cependant, lorsque j'exporte le code en tant que script Python et que j'essaie de l'exécuter depuis la ligne de commande, le navigateur Firefox s'ouvre mais ne peut pas accéder à l'URL de départ (une erreur est renvoyée à la ligne de commande et le programme s'arrête). Cela se passe en moi, peu importe de quel site web etc j'essaie d'accéder.

j'ai inclus ici un code très basique à des fins de démonstration. Je ne pense pas avoir inclus correctement la section proxy du code car l'erreur renvoyée semble être générée par le proxy.

Toute aide serait très appréciée.

le code ci-dessous est simplement destiné à s'ouvrir www.google.ie et cherchez le mot "sélénium". Pour moi, il ouvre un navigateur firefox vierge et s'arrête.

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()
42
demandé sur user2479813 2013-06-13 12:21:17

7 réponses

Que Diriez-vous de quelque chose comme ceci

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)

Vous pouvez en lire plus à ce sujet ici.

17
répondu Amey 2013-06-13 17:14:01

fonctionne pour moi de cette façon (similaire au code @Amey et @user4642224, mais un peu plus court):

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)
14
répondu Mykhail Martsyniuk 2016-11-16 09:20:41

ma solution:

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)

alors appelez votre code:

my_proxy(PROXY_HOST,PROXY_PORT)

j'ai eu des problèmes avec ce code parce que je passais une chaîne comme un port #:

 PROXY_PORT="31280"

Ceci est important:

int("31280")

vous devez passer un entier au lieu d'une chaîne de caractères ou votre profil firefox ne sera pas défini à un port approprié et la connexion par l'intermédiaire de proxy ne fonctionnera pas.

12
répondu mrki 2014-07-23 20:57:58

Essayez sock5 proxy. Je faisais face au même problème et il est résolu en utilisant le proxy de chaussettes

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)

alors appelez install_proxy ( ip , port ) de votre programme.

4
répondu chowmean 2015-06-01 06:43:14

Si quelqu'un est à la recherche d'une solution voici comment faire :

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/')
4
répondu user4642224 2016-02-12 00:31:33

Essayez par la mise en place 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")

Ce programme test sur Windows 8 et Mac OSX. Si vous utilisez Mac OSX et si vous n'avez pas de sélénium mis à jour, alors vous pouvez faire face à selenium.common.exceptions.WebDriverException. Si c'est le cas, réessayez après avoir mis à jour votre sélénium

pip install -U selenium
3
répondu Rafayet Ullah 2016-07-04 03:02:28

essayez d'exécuter le service tor, ajoutez la fonction suivante dans votre code.

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
répondu o.awajan 2018-07-10 09:06:34