由于代理配置,硒线阻塞连接

rem*_*emy 5 firefox proxy webdriver seleniumwire

我正在使用 selenium-wire 和 firefox webdriver 访问网站(在线游戏)。我在本地网络上运行 python 脚本,不需要代理来访问 Internet。

这是我的代码的摘录:

#!C:/Python38-32/python.exe
    
from seleniumwire import webdriver  # Import from seleniumwire
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains

# Create a new instance of the Firefox driver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary(r'C:\\Program Files\\Mozilla Firefox\\firefox.exe')
driver = webdriver.Firefox(firefox_binary=binary)

# Go to the home page
driver.get('https://fr0.forgeofempires.com/page/')

iframe = driver.find_element_by_tag_name('iframe')
iframe_switched = driver.switch_to.frame(iframe)
    
useridInput = driver.find_element_by_id('login_userid')
useridInput.click();
    
useridInput.send_keys('myuser'); 

login_passwordInput = driver.find_element_by_id('login_password')
login_passwordInput.click();

login_passwordInput.send_keys('mypass'); 

loginButton = driver.find_element_by_id('login_Login')
loginButton.click();

defaultContent_switched = driver.switch_to.default_content()

WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "play_now_button"))
)
play_nowButton = driver.find_element_by_id('play_now_button')
play_nowButton.click();

WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.LINK_TEXT, "ServerName"))
)
Button = driver.find_element_by_link_text('ServerName')
Button.click();
Run Code Online (Sandbox Code Playgroud)

一切正常,直到这一点。该页面现在应该在新的 URL ( https://xxx.forgeofempires.com/game )加载游戏,但它卡住了。如果我按 F5 我得到代理服务器拒绝连接。我转到我的 Firefox 代理设置,注意到它们从No proxyUse system proxy settings更改为Manual 127.0.0.1。我猜它是硒线为了检查流量而改变的?

在此处输入图片说明

我的最终目标是捕获页面生成的 XHR 响应,这就是我使用 Selenium-wire 的原因。

什么可能导致本地主机代理在连接到网站时被阻止?我该如何解决?

如果我更换

from seleniumwire import webdriver  # Import from seleniumwire
Run Code Online (Sandbox Code Playgroud)

经过

from selenium import webdriver  # Import from selenium
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是我将无法捕捉到 XHR 响应。我也尝试过 mitmproxy,但没有成功。

更新1:

我做了一个完全不工作的例子,它表明 Selenium-wire 做了一些错误的事情。在下面的示例中,无法加载 Google 的结果页面。

#!C:/Python38-32/python.exe
    
from seleniumwire import webdriver  # Import from seleniumwire
#from selenium import webdriver  # Import from selenium

from selenium.webdriver.common.keys import Keys

# Create a new instance of the Firefox driver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary(r'C:\\Program Files\\Mozilla Firefox\\firefox.exe')
driver = webdriver.Firefox(firefox_binary=binary)

driver.maximize_window()

# Go to the home page
driver.get('https://www.google.se/')

useridInput = driver.find_element_by_name('q')
useridInput.click();
    
useridInput.send_keys('test'); 

driver.find_element_by_name("q").send_keys(Keys.ENTER)
Run Code Online (Sandbox Code Playgroud)

rem*_*emy 5

我最后添加了这一行以使其工作:

value = input("SCRIPT ENDED\n")
Run Code Online (Sandbox Code Playgroud)

原因可以在这里和下面找到:

Selenium Wire 的工作原理是透明地将浏览器配置为指向 Selenium Wire 自己的代理服务器。该代理服务器(在上面的示例中运行在 127.0.0.1:49818 上)用于捕获浏览器在 Selenium Wire 运行时发出的请求。Selenium Wire 结束后,它会关闭其代理服务器,因为它认为它已完成。但是,如果浏览器保持打开状态(在上面的示例中似乎就是这种情况),浏览器仍将指向代理服务器。尝试使用浏览器将不起作用,因为代理服务器现在随着 Selenium Wire 的关闭而消失。

如果您希望手动与浏览器交互,则需要通过确保程序不会结束来保持 Selenium Wire 运行。您可能会为此使用 time.sleep(),或者可能使用其他一些机制,例如 input()。