消息:错误:轮询更改失败:通过Selenium和FirefoxProfile下载文件时尝试获取资源时出现NetworkError

时间:2019-01-08 11:45:50

标签: python selenium cors webdriverwait firefox-profile

我正在尝试在python3上使用selenium和Firefox从URL下载文件,但这在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 verssion 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()

你们有什么主意吗?

2 个答案:

答案 0 :(得分:2)

此错误消息...

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

...表示尝试获取资源时出现 NetworkError

主要问题可能与Cross-Origin Resource Sharing (CORS)

有关
  

跨源资源共享(CORS)是一种机制,该机制使用其他HTTP标头来告诉浏览器,使运行在一个来源(域)上的Web应用程序有权访问来自另一个来源的服务器中的选定资源。当Web应用程序请求其来源(域,协议和端口)与其来源不同的资源时,它将发出跨域HTTP请求。

     

跨域请求的示例:http://domain-a.com所服务的Web应用程序的前端JavaScript代码使用XMLHttpRequest来向http://api.domain-b.com/data.json发出请求。

     

出于安全原因,浏览器限制了从脚本内部发起的跨域HTTP请求。例如,XMLHttpRequest和Fetch API遵循同源策略。这意味着使用这些API的Web应用程序只能从加载该应用程序的相同来源请求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

答案 1 :(得分:0)

我遇到了同样的错误。将geckodriver vresion更新为geckodriver 0.24.0(2019-01-28)后,对我来说效果很好。试试这个

xxxxx:~$ geckodriver --version
geckodriver 0.24.0 ( 2019-01-28)