Сообщение: ошибка: не удалось выполнить опрос на предмет изменений: ошибка NetworkError при попытке извлечь ресурс при загрузке файла через Selenium и FirefoxProfile - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь загрузить файл с URL-адреса, используя selenium и Firefox на python3, но это приводит к ошибке в файле журнала geckodriver:

 (firefox:13723): Gtk-WARNING **: 11:12:39.178: Theme parsing error:       <data>:1:77: Expected ')' in color definition
 1546945960048  Marionette  INFO    Listening on port 40601
 1546945960132  Marionette  WARN    TLS certificate errors will be ignored for this session
     console.error: BroadcastService: 
      receivedBroadcastMessage: handler for
      remote-settings/monitor_changes
       threw error:
            Message: Error: Polling for changes failed: NetworkError when attempting to fetch resource..
            Stack:
                remoteSettingsFunction/remoteSettings.pollChanges@resource://services-settings/remote-settings.js:188:13

Я использую Geckodriver версии 0.22 и FireFow версии 65.0. Также нахожусь на UBUNTU 18 (только SSH) geckodriver находится в файле / usr / bin и имеет все необходимые права.

Я читал в Google, что это может быть из-за COPS. Но я действительно понимаю, что такое COPS или как их исправить (если это реальная проблема).

вот мой код:

from os import getcwd
from pyvirtualdisplay import Display
from selenium import webdriver

# start the virtual display
display = Display(visible=0, size=(800, 600))
display.start()

# configure firefox profile to automatically save csv files in the current directory
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.download.dir", getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv")

driver = webdriver.Firefox(firefox_profile=fp)
page = "https://www.thinkbroadband.com/download"
driver.get(page)
driver.find_element_by_xpath("//*[@id='main-col']/div/div/div[8]/p[2]/a[1]").click()

Ребята, у вас есть идеи?

1 Ответ

0 голосов
/ 08 января 2019

Это сообщение об ошибке ...

Message: Error: Polling for changes failed: NetworkError when attempting to fetch resource..

... означает, что NetworkError при попытке извлечь ресурс.

Здесь основная проблема, вероятно, связана с Распределение ресурсов между источниками (CORS)

Cross-Origin Resource Sharing (CORS) - это механизм, который использует дополнительные заголовки HTTP, чтобы сообщить браузеру, чтобы веб-приложение, работающее в одном источнике (домене), имело разрешение на доступ к выбранным ресурсам с сервера в другом источнике. Веб-приложение отправляет HTTP-запрос с несколькими источниками, когда оно запрашивает ресурс, источник которого (домен, протокол и порт) отличается от своего собственного источника.

Пример запроса с несколькими источниками: код JavaScript внешнего интерфейса для веб-приложения, обслуживаемый http://domain -a.com использует XMLHttpRequest для выполнения запроса на http://api.domain -b .com / data.json .

В целях безопасности браузеры ограничивают перекрестные HTTP-запросы, инициируемые из сценариев. Например, XMLHttpRequest и Fetch API следуют политике одного источника. Это означает, что веб-приложение, использующее эти API-интерфейсы, может запрашивать только ресурсы HTTP из того же источника, из которого было загружено приложение, если ответ другого источника не содержит правильных заголовков CORS.

Современные браузеры обрабатывают клиентские компоненты совместного использования разных источников, включая заголовки и применение политик. Но этот новый стандарт означает, что серверы должны обрабатывать новые заголовки запросов и ответов.

Решение

Вам нужно заставить WebDriverWait , чтобы требуемый элемент был активным для кликабельности , и вы можете использовать следующее решение:

  • Кодовый блок:

    from selenium import webdriver
    from os import getcwd
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # configure firefox profile to automatically save csv files in the current directory
    fp = webdriver.FirefoxProfile()
    fp.set_preference("browser.download.folderList", 2)
    fp.set_preference("browser.download.manager.showWhenStarting", False)
    fp.set_preference("browser.download.dir", getcwd())
    fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv")
    driver = webdriver.Firefox(firefox_profile=fp, executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
    driver.get("https://www.thinkbroadband.com/download")
    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='specific-download-headline' and contains(., 'Extra Small File (5MB)')]//following::p[1]/a"))).click()
    
  • Фотоснимок:

download_file_firefox

...