消息:错误:轮询更改失败:通过 Selenium 和 FirefoxProfile 下载文件时尝试获取资源时出现 NetworkError
Posted
技术标签:
【中文标题】消息:错误:轮询更改失败:通过 Selenium 和 FirefoxProfile 下载文件时尝试获取资源时出现 NetworkError【英文标题】:Message: Error: Polling for changes failed: NetworkError when attempting to fetch resource while downloading file through Selenium and FirefoxProfile 【发布时间】:2019-06-03 02:35:34 【问题描述】:我正在尝试在 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 0.22 版和 firefow 65.0 版。我也在 UBUNTU 18 上(仅 ssh) geckodriver 在 /usr/bin 文件中,并且拥有所有需要的权利。
我在谷歌上读到这可能是因为 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】:我遇到了同样的错误。将 geckodriver vresion 更新为 geckodriver 0.24.0(2019-01-28)后对我来说效果很好。试试这个
xxxxx:~$ geckodriver --version
geckodriver 0.24.0 ( 2019-01-28)
【讨论】:
【参考方案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()
快照:
参考:How to resolve “TypeError: NetworkError when attempting to fetch resource.”【讨论】:
我看不出等待元素可点击与 CORS 有什么关系。答案中提到 CORS 的部分没有任何意义,也没有任何帮助。 谢谢!这很有帮助。此外,我的文件类型错误。它不是“文本/csv”,我没有看到。我之前下载了一个插件来获取文件格式,然后在“text/csv”之后添加了它。最后,它的工作!再次感谢你:)以上是关于消息:错误:轮询更改失败:通过 Selenium 和 FirefoxProfile 下载文件时尝试获取资源时出现 NetworkError的主要内容,如果未能解决你的问题,请参考以下文章
测试立即失败,出现未知错误:通过 systemd 运行 Selenium 网格时,DevToolsActivePort 文件不存在
ElementNotVisibleException:消息:尝试通过 Selenium 和 Python 单击按钮时出现元素不可交互错误