ChromeDriver 和 Chrome 的非确定性行为与 pageLoadStrategy 无



我有一个使用Selenium和Chromium的网络爬虫,运行在Ubuntu Linux 16.04上。 所有新的抓取请求都会进入 Apache/WSGI,它为每个请求创建一个新的 python 线程,并使用 pyvirtualdisplay 和 Xvfb 生成 Chromium 进程来加载网站、登录、截屏等。

我使用带有标志的铬: 禁用扩展、禁用 GPU、无头、无沙盒

caps = DesiredCapabilities().CHROME
caps["pageLoadStrategy"] = "none"

然后我有一个函数,每秒检查一次页面是否已加载(因为某些页面在合理的时间内没有完全加载,所以我尝试等到它们至少是交互式的再继续(:

driver.execute_script("var state = document.readyState; return state;")

奇怪的是,现在当我尝试加载页面时,它会立即显示它处于"完成"状态(并在接下来的 15 秒内继续如此(。 但是当我实际尝试查找元素时,找不到它 - 所以我认为它实际上没有加载。 通常它会说它是"加载",然后是"交互式",等等。

我尝试重新启动Apache,但似乎没有修复任何问题。 可能出了什么问题?

我可以在我的进程列表中看到,当新请求进来时,Chromium 和 Xvfb 确实正在运行:

7429 ?        S      0:00 Xvfb -br -nolisten tcp -screen 0 1024x768x24 :2165
7430 ?        Sl     0:00 /var/www/html/flaskapp/chromedriver --port=39146
7438 ?        Sl     0:00 /usr/lib/chromium-browser/chromium-browser --disable-background-networking --disable-client-side-phishing
7440 ?        S      0:00 /usr/lib/chromium-browser/chromium-browser --type=zygote --no-sandbox --enable-logging --headless --log-l
7457 ?        Sl     0:00 /usr/lib/chromium-browser/chromium-browser --type=gpu-process --no-sandbox --enable-logging --headless --
7468 ?        S      0:00 /usr/sbin/apache2 -k start
7469 ?        Sl     0:00 /usr/lib/chromium-browser/chromium-browser --type=renderer --no-sandbox --enable-automation --enable-logg

您需要使用所需的参数配置ChromeDriver。几点:

  • 如果您完全等到元素至少是交互式的,然后再继续,那么配置是没有意义的:

    caps["pageLoadStrategy"] = "none"
    
  • 更好的方法是将pageLoadStrategy配置为normal或坚持默认策略一起删除配置:

    caps["pageLoadStrategy"] = "normal"  #  complete
    
  • 您可以在以下位置找到详细的讨论:

    • 如何让硒不等到脚本缓慢的整页加载?
    • Chrome 驱动程序的页面加载策略(更新至 Selenium v3.12.0(
  • pageLoadStrategyeager尚未在Chrome中实现。

  • 您可以在以下位置找到详细的讨论:

    • 回复:[chromedriver] 将页面加载策略添加到功能(evaj...@google.com 的问题2125123002(
    • 问题 2125123002: [chromedriver] 将页面加载策略添加到功能(已关闭(
  • 因此,为了确保加载所需的元素,您需要根据讨论中详述的普遍条件诱导WebDriverWait如何确保是否为Selenium + Python加载了一些HTML元素?

相关内容

  • 没有找到相关文章