2013-06-13 23 views
32

Tôi đang cố gắng chạy tập lệnh Trình quản trị Web Selenium bằng Python để thực hiện một số tác vụ cơ bản. Tôi có thể làm cho robot hoạt động hoàn hảo khi chạy nó thông qua inten selen IDE (ví dụ: khi đơn giản nhận GUI để lặp lại hành động của tôi). Tuy nhiên khi tôi xuất mã dưới dạng tập lệnh Python và cố thực thi nó từ dòng lệnh, trình duyệt Firefox sẽ mở nhưng không bao giờ có thể truy cập URL bắt đầu (lỗi được trả về dòng lệnh và chương trình dừng). Điều này đang xảy ra cho tôi bất kể trang web nào tôi đang cố gắng truy cập.Chạy Trình quản trị Web Selenium bằng một proxy trong Python

Tôi đã bao gồm một mã rất cơ bản ở đây cho mục đích trình diễn. Tôi không nghĩ rằng tôi đã bao gồm phần proxy của mã chính xác vì lỗi được trả lại dường như được tạo bởi proxy.

Mọi trợ giúp sẽ được đánh giá cao.

Mã bên dưới chỉ đơn giản là để mở www.google.ie và tìm kiếm từ "selenium". Đối với tôi, nó sẽ mở một trình duyệt firefox trống và dừng lại.

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

Trả lời

13

Làm thế nào về một cái gì đó như thế này

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) 

Bạn có thể đọc thêm về nó here.

+0

Câu trả lời này làm việc tốt cho tôi . Trong trường hợp bất kỳ ai khác đang cố gắng làm điều này với Edge, 'webdriver.DesiredCapabilities.EDGE ['proxy']' không có hiệu lực vì Microsoft Edge hiện không có cài đặt cấu hình máy chủ proxy (để sử dụng Edge với proxy, bạn phải định cấu hình proxy trong cài đặt kết nối mạng của Windows). –

+1

Để xem tài liệu chi tiết đầy đủ, hãy xem: https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities#proxy-json-object – LeckieNi

10

Giải pháp của tôi:

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) 

Sau đó gọi trong mã của bạn:

my_proxy(PROXY_HOST,PROXY_PORT) 

tôi có vấn đề với mã này bởi vì tôi đã đi qua một chuỗi như một cổng #:

PROXY_PORT="31280" 

Điều này quan trọng:

int("31280") 

Bạn phải vượt qua số nguyên thay vì chuỗi hoặc cấu hình firefox của bạn sẽ không được đặt thành cổng thích hợp và kết nối qua proxy sẽ không hoạt động.

+1

Cổng cần được chuyển thành int? Điều đó sẽ làm cho ví dụ proxy của Firefox trên trang chính thức sai: http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp Trong ví dụ của họ, PROXYHOST: PROXYPORT được chuyển thành một chuỗi. – Pyderman

+0

@Pyderman, bạn đang nhầm lẫn giữa lớp 'Proxy()' với lớp 'FirefoxProfile()'. Sử dụng tùy chọn hồ sơ, bạn phải chuyển ip và cổng riêng biệt, và đúc 'cổng' thành' int() '. Trong lớp 'Proxy()' bạn chỉ cần truyền chuỗi chứa "IP: PORT", và chắc chắn nó làm phần còn lại của công việc cho bạn. – erm3nda

4

Thử thiết lập proxy sock5 quá. Tôi đã phải đối mặt với cùng một vấn đề và nó được giải quyết bằng cách sử dụng vớ Proxy

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) 

Sau đó gọi install_proxy (ip , port) từ chương trình của bạn.

+0

đã cứu tôi rất nhiều thời gian –

3

Nếu bất cứ ai đang tìm kiếm một giải pháp dưới đây là cách:

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/') 
2

Hãy thử bằng cách lập 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") 

Chương trình này thử nghiệm trên cả Windows 8 và Mac OSX. Nếu bạn đang sử dụng Mac OSX và nếu bạn không cập nhật selen thì bạn có thể phải đối mặt với selenium.common.exceptions.WebDriverException.Nếu vậy, sau đó thử lại sau khi nâng cấp selen bạn

pip install -U selenium 
6

trình đối với tôi theo cách này (tương tự như @Amey và @ user4642224 mã, nhưng ngắn hơn một chút):

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) 
Các vấn đề liên quan