python - Selenium - 在检查 HTML 之前找不到可见元素?

标签 python html selenium

我目前正在使用 Selenium 进行网络爬虫应用程序,在几个成功的模块之后,以下情况让我陷入困境:我试图找到“菜单”类的一个元素,其中包含文本“报告”名为“frame_applic”的框架。

非常简单,对吧?应该很简单:

browser = webdriver.Chrome()
#Do the necessary crawling to get to this specific menu...

browser.switch_to_frame('frame_applic')
for obj in browser.find_elements_by_class_name('menu'):
    if obj.text == 'Reports':
      bt_reports = obj    
      break

#The variable bt_reports should be the one requested.

这里是有趣的地方:虽然当我尝试切换到所需的框架时没有引发错误,但没有找到类名“menu”的元素。我肯定拼错了框架或类名,对吧?因此,在决定检查 HTML 并且不进行任何其他更改后,元素就在那里,就好像仅查看网页源代码的行为就改变了结果。这里可能发生什么?

我不允许发布完整的 HTML,但以下结构包含了该问题:

<html>
<head>
    <TITLE>Page</TITLE>
</head>
<frameset ...>
    <frame name="frame_menu" src="https:..." >
    <frame name="frame_applic" src="menu.asp?...">
    #document
        <table width="100%" border="0" cellpadding="5" cellspacing="0">

            <tr>
                <td colspan="2" align="right">
                    <table width="95%" border="0" cellpadding="5" cellspacing="0">

                        <tr><td><a href="https:..." class="menu">Reports</a></td></tr>
                        <tr><td><a href="https:..." class="menu">Change Password</a></td></tr>
                        <tr><td><a href="https:..." class="menu">Change Secret Phrase</a></td></tr>
                    </table>
                </td>
            </tr>
        </table>
        </body>

    <frame name="frame_bottom" src="https:...">
</frameset> 
</html>

最佳答案

经过仔细检查,我发现根本问题是所需框架的源信息位于 Active Server Page (asp) 中,如下所示:

<frame name="frame_applic" src="menu.asp?..."> 

并且无法从我所在的页面直接访问它。 检查浏览器上的元素的行为显然会强制这些元素在 webdriver 实例中共存,从而允许我获取框架内的元素,而它们以前是无法访问的。

我能够通过首先找到请求的帧,然后将网络驱动程序指向它的源来解决这个问题,方法是:

browser.get(browser.find_element_by_xpath("//frame[@name='frame_applic']")\
.get_attribute('src'))

然后像我之前那样简单地获取元素:

menu_list = browser.find_elements_by_class_name('menu')

关于python - Selenium - 在检查 HTML 之前找不到可见元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52948943/

相关文章:

python - 如何用matplotlib绘制一般方程?

python - 从python中的矩阵中提取列作为向量

python - Django select 如何记住选择的值?

html - 如何使 Twitter Bootstrap 工具提示看起来像弹出窗口(没有标题行)?

java - 新安装时出现 nullpointerException 错误

python - Crontab 不会在 Mac OS 上运行 python

html - 我怎样才能给这张 table 圆 Angular 的边框,并仍然保持我的配色方案?

html - Flexbox 强制新列

python-3.x - 定位隐藏在网页中的文本

selenium - 无法使用 browsermob 代理通过 selenium 访问不安全的 https