【问题标题】:Wait for XHR Request and/or a Console message for Selenium in Python在 Python 中等待 XHR 请求和/或 Selenium 的控制台消息
【发布时间】:2016-05-13 13:32:11
【问题描述】:

我试图让 selenium 在页面源完全呈现后捕获它,如果我转到页面并立即捕获只有部分页面已经呈现,如果我完全休眠 30 秒渲染,但我希望它更高效。

如果我们以https://twitter.com/i/notifications 为例,您会看到在页面加载后 5~ 秒后有一个 toast_poll 和一个时间线 XHR 请求。

我希望能够检测到其中一个请求并等待其中一个请求触发,这表明页面已完全加载。

我正在使用的网站会触发 console.log("Done"),因此如果我可以在 PhantomJS 和 Firefox 中检测到控制台命令,那么这将是比等待 XHR 请求更好的选择,只需等待 Done 出现在控制台中然后这就是页面已完全加载的指示器。

关于此帖的重复举报:

这个问题是关于 PhantomJS 和 Firefox 的,Detect javascript console output with python 的帖子来自一年多以前,给出的答案仅适用于 Chrome,我正在寻找 PhantomJSFirefox 选项,我已经基于 StackOverflow 的思考是不可能的,所以我的文章开头是关于等待 XHR 请求的原因。

我已经尝试过以下代码,但它对我不起作用.. 即使网站抛出 console.log("Done"),我也得到零响应

from seleniumrequests import PhantomJS
from seleniumrequests import Firefox
from selenium import webdriver
import os

webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/37.0.2062.120 Chrome/37.0.2062.120 Safari/537.36'
webdriver.DesiredCapabilities.PHANTOMJS['loggingPrefs'] = { 'browser':'ALL' }

browser = PhantomJS(executable_path="phantomjs.exe", service_log_path=os.path.devnull)
browser = webdriver.Firefox()
browser.set_window_size(1400, 1000)

url = "https://website.com"
browser.get(url)

for entry in browser.get_log('browser'):
    print entry

我无法使用注释掉的 browser = webdriver.Firefox() 进行测试,因为我不确定如何设置两批 DesiredCapabilities

【问题讨论】:

  • @salomonderossi 不,这是关于 PhantomJSFirefox 的,该帖子仅关于 Chrome,我正在寻找 PhantomJS 和 Firefox 选项,我已经认为基于 StackOverflow 不是不可能,这就是为什么我的文章开头是关于等待 XHR 请求的原因。
  • 恕我直言,你也可以使用 Firefox、Safari、IE 或无头 PhantomJS 浏览器
  • @salomonderossi 查看我的编辑,我已经在 Firefox 和 Phantom 上尝试过,但它不起作用。 firefox 路由垃圾邮件加载了大量控制台错误,但没有一个是 Done 一个,而 PhantomJS 一个由于设置了 2 个不同的 DesiredCapabilities 而无法正常工作。

标签: python python-2.7 selenium


【解决方案1】:

您可以覆盖console.log 函数并使用execute_async_script 等待“完成”消息:

from selenium import webdriver

driver = webdriver.Firefox()
driver.set_script_timeout(10)

driver.get("...")

# wait for console.log("Done") to be called
driver.execute_async_script("""
  var callback = arguments[0];
  console.log = function(message) {
    if(message === "Done")
      callback();
  };
  """)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 2021-01-04
    • 2015-10-27
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多