【问题标题】:Selenium driver's page source different than browserSelenium 驱动程序的页面源与浏览器不同
【发布时间】:2017-07-21 20:31:41
【问题描述】:

很遗憾,我无法发布代码来重现此问题,因为它涉及登录非公共站点的站点。但我的问题比代码问题更笼统。本质上,driver.page_source 与它正在驱动的浏览器中显示的内容不匹配。这不是元素未完全加载的问题,因为我在 python 终端中逐行执行代码时正在测试它。右键单击并转到“查看页面源”后,我正在浏览器中查看页面源,但如果我打印driver.page_source 或尝试find_element_by_[...],它显示的代码略有不同,缺少整个元素。这是有问题的html:

<nav role="navigation" class="utility-nav__wrapper--right">
<input id="hdn_partyId" value="1965629" type="hidden">
<input id="hdn_firstName" value="CHARLES" type="hidden">
<input id="hdn_sessionId" value="uHxQhlARvzA7N16uh+KJAdNFIcY6D8f9ornqoPQ" type="hidden">
<input id="hdn_cmsAlertRequest" type="hidden" value="Biennial Plus">
<ul class="h-list h-list--middle">
    [...]
</ul>

我需要所有 4 个输入元素,但是,hdn_partyIdhdn_sessionId 元素不会出现在 selenium 的 .page_source 中,如果我尝试使用 .find_element_by_[...] 获取它们,我会得到 NoSuchElementException

我什至检查了所有 input 元素并列出它们,这两个没有出现。

有人知道为什么 selenium 不会提供与直接查看它所驱动的浏览器相同的内容吗?

编辑:澄清...我正在通过 Selenium 使用 Chromedriver 驱动 Chrome。这不是页面未完全加载的问题。正如我所提到的,我通过 python 终端逐行手动运行,而不是执行脚本。所以浏览器弹出,加载页面,登录,然后我手动检查浏览器的页面源并查看元素,然后我 print driver.page_source 它不存在,如果我运行 session_id = driver.find_element_by_id('hdn_sessionId') 我得到一个 NoSuchElementException .页面中也没有任何框架,也没有任何额外的窗口。

【问题讨论】:

  • 在尝试获取源之前,您是否尝试使用显式等待功能?
  • 您是否尝试使用 Chromedriver 并注意页面是否完全加载?并检查其源代码?
  • 我不相信 driver.page_source 会检索 JavaScript 生成的任何 DOM 元素。
  • 我没有尝试使用显式等待,因为这不是页面加载完全的问题。这是我在 python 终端中执行代码的地方。我正在使用 selenium 来驱动 Chrome。所以页面加载完毕,我看了一下,右键,查看页面源码,查看元素,然后print driver.page_source这些元素都不存在了。
  • 您的意思是您在页面完全呈现后从 Python 控制台尝试了find_element_...(),并且只能找到 4 个输入中的 2 个?附言忽略driver.page_source

标签: python selenium


【解决方案1】:

我的一位同事发现了问题并找到了解决方法。本质上,页面加载完成后,它会运行一个清理 DOM 的 javascript 命令。浏览器中“查看页面源”显示的不是当前状态。因此,运行print driver.page_source 或使用任何形式的driver.find_element_by_[...] 都是从最新最新鲜的页面数据中提取,而浏览器的“查看页面源”仅显示页面首次加载时提供的内容。如果您开始在 Chrome 中“检查”页面,您将看到 HTML 与浏览器所说的“页面源”不同。在对 Javascript 进行逆向工程之后,我们能够运行 partyid = driver.execute_script('return accountdata.$partyId.val();') 并获得最初分配的内容。我希望这些信息足以帮助将来可能遇到此问题的其他人。

【讨论】:

  • 上下文菜单中的“查看页面源代码”显示服务器返回的 HTML,而命令 driver.page_source 返回浏览器构建的实际 HTML。我想我们都假设您正在谈论开发人员工具的“元素”选项卡中显示的源(上下文菜单中的“检查”)。这不是一个真正的问题,你只是看错了地方。所以最后,driver.page_source 返回的 HTML 确实匹配它正在驱动的浏览器中显示的内容。
  • 我猜是这样,但我当时不明白当您右键单击并单击“查看页面源代码”时浏览器没有显示实际显示的 HTML。但是我确实说过很多次我在浏览器中单击鼠标右键并单击“查看页面源代码”,并且从未提及任何有关“检查元素”的内容,所以当我说“对单击浏览器并单击查看源代码”。但是今天我学到了...大声笑
【解决方案2】:

如果您找到页面的'body',然后使用get_attribute('innerHTML'),您可以从页面访问所有内容。

【讨论】:

    【解决方案3】:

    在使用 selenium 时,通常情况下,等待就可以解决问题,而无需大量额外代码(即给完整的 DOM 加载几秒钟)。因此,在下面的示例中,收集的 HTML 反映了人们在“检查”时会看到的内容,而不是使用“查看源代码”,后者显示的是 pre-JS DOM

    from time import sleep
    from selenium import webdriver
    from webdriver_manager.chrome import ChromeDriverManager
    driver = webdriver.Chrome(ChromeDriverManager().install())
    
    driver.get(url)
    sleep(10)
    HTML = driver.page_source
    

    【讨论】:

    • 我知道这个问题已经有好几年了,但正如帖子所提到的,等待不是问题。我正在手动调试代码,并在 python 终端中逐行执行代码。问题是页面加载完成后运行的 javascript 函数,它从 DOM 中清除了一堆元素。接受的答案分解了导致问题的原因以及解决方法。
    【解决方案4】:

    尝试这样你会得到源代码关键字“view-source:”,根据你的浏览器可能会有所不同这是针对chrome的

    driver.get("view-source:"+url)
    
    sourcecode=driver.find_element_by_tag_name('body').text
    

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2020-12-06
      • 1970-01-01
      相关资源
      最近更新 更多