selenium-wire блокирует соединение из-за конфигурации прокси

Я использую selenium-wire и веб-драйвер Firefox для доступа к веб-сайту (онлайн-игра). Я запускаю скрипт Python в своей локальной сети, и для доступа в Интернет не требуется прокси-сервер.

Вот выдержка из моего кода:

#!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();

Все работает нормально до этого момента. Теперь страница должна загрузить игру по новому URL (https://xxx.forgeofempires.com/game), но он застревает. Если я нажимаю F5, я получаю сообщение Прокси-сервер отказывается от подключений. Я зашел в настройки прокси-сервера Firefox и заметил, что они изменились с Без прокси или Использовать системные настройки прокси на Вручную 127.0.0.1. Я предполагаю, что это Selenium-wire меняет это, чтобы проверить трафик?

введите здесь описание изображения

Моя конечная цель — поймать ответы XHR, сгенерированные на странице, поэтому я использую Selenium-wire.

Что может привести к блокировке прокси-сервера localhost при подключении к веб-сайту? Как я могу это исправить?

Если я заменю

from seleniumwire import webdriver  # Import from seleniumwire

by

from selenium import webdriver  # Import from selenium

он отлично работает, но тогда я не смогу поймать ответы 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)

person remyremy    schedule 17.07.2020    source источник


Ответы (1)


Я добавил эту строку в конце, чтобы заставить ее работать:

value = input("SCRIPT ENDED\n")

Причину этого можно найти здесь и ниже:

Selenium Wire работает, прозрачно настраивая браузер так, чтобы он указывал на собственный прокси-сервер Selenium Wire. Этот прокси-сервер (работающий по адресу 127.0.0.1:49818 в приведенном выше примере) используется для захвата запросов, сделанных браузером во время работы Selenium Wire. После того, как Selenium Wire завершает работу, он выключает свой прокси-сервер, потому что думает, что это сделано. Однако, если браузер остается открытым (что, похоже, имеет место в приведенном выше примере), браузер все равно будет указывать на прокси-сервер. Попытка использовать браузер не сработает, потому что прокси-сервер теперь ушел с отключением Selenium Wire.

Если вы хотите вручную взаимодействовать с браузером, вам необходимо поддерживать работу Selenium Wire, следя за тем, чтобы ваша программа не завершалась. Вы могли бы потенциально использовать time.sleep() для этого или, возможно, какой-то другой механизм, такой как input().

person remyremy    schedule 22.07.2020
comment
Большое тебе спасибо. Работал на меня. И хороший вопрос. - person Anthony Vinay; 27.01.2021