【问题标题】:Python Selenium view page source shows JavaScript but inspecting elements shows HTML elementsPython Selenium 视图页面源显示 JavaScript,但检查元素显示 HTML 元素
【发布时间】:2018-04-03 12:06:24
【问题描述】:

我正在尝试访问 Web 自动化项目的附件链接。问题是,当我通过 Chrome 加载网页并检查元素时,我可以看到 HTML 代码(div 和表格),但是当我使用查看源选项时,我看到的只是 JavaScript 函数。

现在,当我尝试通过 selenium(可以访问源代码,JavaScript 代码)访问元素时,我在那里找不到任何元素。我无法明确找到 iFrame 的提及,但我认为包含此信息的 iFrame 正在由 JavaScript 代码加载。有没有办法访问底层 HTML 以查找元素并访问链接?

注意:当我尝试查看作为 JavaScript 函数集合的页面源代码时,没有指向框架的链接,可以通过该链接获取所需的 HTML。

对于上下文:

inspect 元素看起来像:

<div id="SectionAttachments">
    <table summary="" border="0" cellspacing="5" cellpadding="0">
       <tbody>
          <tr>
             <td></td>
             <td><img class="attachmentsIcon" src="images/modern_graphite/attachment_url.png" alt="Linked Resource" title="Linked Resource"></td>
             <td class="attachmentTitle">
                <a href="LINK GOES HERE" class="nounderline" title="" target="_blank">Customer View</a>
             </td>
             <td>by</td>
             <td class="attachmentAuthor contact_popover" ivalue="99832"></td>
             <td class="attachmentDate"><span class="dateSpacer">-</span>10/25/2016 04:21:13 AM</td>
             <td width="16">
                <a href="javascript:onAttEdit('IssuePage&amp;Template=atturl&amp;TableId=1003&amp;RecordId=6931123&amp;TableId2=19&amp;Id2=7705574&amp;ProjectId=4581')" class="nounderline" title=""><img align="middle" src="images/modern_graphite/edit.gif" alt="Edit this Attachment" title="Edit this Attachment" border="0"></a>
             </td>
             <td width="16">
                <script type="text/javascript">
                   if(this.eMail)
                   {
                   document.write( "<a href=javascript:eMail('85',99832,document.forms[0].F99832,7705574) style={13}><img src='images/modern_graphite/email.gif' border='0' align='top' alt='Send E-mail' title='Send E-mail'></a>");
                   }
                   else if(parent&&parent.eMail)
                   {
                   document.write( "<a href=javascript:parent.eMail('85',99832,document.forms[0].F99832,7705574) style={13}><img src='images/modern_graphite/email.gif' border='0' valign='bottom' alt='Send E-mail' title='Send E-mail'></a>");
                   }
                </script><a href="javascript:eMail('85',99832,document.forms[0].F99832,7705574)" style="{13}"><img src="images/modern_graphite/email.gif" border="0" align="top" alt="Send E-mail" title="Send E-mail"></a>
             </td>
          </tr>
       </tbody>
    </table>
</div>

我想提取“LINK GOES HERE”处的链接

页面源没有 ID = "section attachments" 的 div 或 div 内的任何其他元素。 (我用相应的ID,类名等搜索,没有成功)

我尝试过的:

  • 我尝试从浏览器搜索页面源,没有结果。

  • 我的 selenium 代码尝试使用 XPath 搜索这些元素,它 返回未找到元素。

    XPath 表达式:

    driver.get_element_by_xpath("//td[@class = 'attachmentTitle']/a/@href")

  • 我已尝试让我的脚本休眠以防页面未完全加载,但没有效果。

有没有办法通过 selenium 获取这些链接?任何帮助将不胜感激。

编辑: 通过稍微修改 URL 以加载一个呈现类似但具有 iFrame 标签的页面,我可以切换到然后使用相同的 Xpath 查找元素并获取链接,从而解决了该问题。

在从另一个页面重定向几次后加载此页面。对 URL 进行轻微的字符串修改(在 Python 中使用替换)解决了这个问题。感谢所有试图提供帮助的人。

【问题讨论】:

  • 遍历 DOM 并找到 &lt;iframe&gt; 标签并在尝试定位元素之前切换到它。
  • inspect 元素中有 iFrame 标签,但页面源中没有。这就是问题所在。所以 Selenium 找不到 iFrame。
  • 使用与 iframe 标签相关的 HTML 更新问题,包括元素节点,以防元素在 &lt;iframe&gt; 标签内。
  • 您采取了哪些步骤来获取页面源?
  • Selenium 不查看视图源...它查看浏览器中呈现的 HTML。这相当于在 Chrome 中使用检查工具。以此为基础定位您的定位器,在 IFRAME 中添加一个开关,并确保添加一个等待。

标签: javascript jquery selenium-webdriver


【解决方案1】:

通过 - 获取元素

ele = driver.get_element_by_xpath("//td[@class = 'attachmentTitle']/a")

然后使用 - 检索元素属性

 ele.get_attribute('href')

【讨论】:

  • 是的,我已经更正了,但不起作用。就像我指定的那样,在页面源中找不到元素。
【解决方案2】:

看起来你可能混合在一起的东西很少:

  1. 当您在浏览器中查看页面源代码时,您会看到从服务器发送的 html。此 html 可以包含动态创建元素的 JavaScript,但在 html 本身中,您只能看到创建它们的 JavaScript 代码。

  2. 检查元素时看到的 DOM 是页面的当前结构。最初它与 html 几乎相同,但可能包含在从服务器加载页面后使用 JavaScript 动态创建或更改的元素。这也是 Selenium 与之交互的内容。

  3. (不确定您是否提到过,但为了完整起见)driver.page_source 返回一个表示该 DOM(当前状态)的字符串,但作为有效的 html 格式。

  4. html 页面可以包含使用 iframe 标记的嵌套页面。每个(父或嵌套)页面都有自己的 html 源和自己的 DOM。在 Selenium 中,您必须使用 driver.switch_to 方法在它们之间显式切换。请注意,尽管在浏览器的开发工具(即检查元素)上,所有页面的 DOM 似乎合并为一个。

【讨论】:

    最近更新 更多