Selenium定位不到指定元素原因之iframe(unable to locate element)

浏览过程中,图片中的内容可能太小,无法看清,可以>右键>在新标签中打开

Outline

项目原因,需要用selenium实现模拟登陆、模拟上传文件,自然就需要模拟点击【上传】按钮;

模拟点击之前需要通过selenium提供的“方法”去定位到要点击的元素;

模拟登陆过程中,全程都可以定位到需要点击的元素,但登陆后需要定位点击【上传】按钮时问题来了;

元素明明在那放着,就是定位不到,这个问题困扰了一下午还没解决,最终走到了iframe这个一步,才得以解决。

什么是iframe

解决问题之前很有必要先了解下什么是iframe:

HTML内联框架元素 <iframe> 表示嵌套的浏览上下文,有效地将另一个HTML页面嵌入到当前页面中。在HTML 4.01中,文档可能包含头部和正文,或头部和框架集,但不能包含正文和框架集。

但是,<iframe>可以在正常的文档主体中使用。每个浏览上下文都有自己的会话历史记录和活动文档。包含嵌入内容的浏览上下文称为父浏览上下文。顶级浏览上下文(没有父级)通常是浏览器窗口。

iframe是HTML三种结构中的框结构,框结构中还有另外两个元素:framesetframe,但它们都已废弃,不再推荐使用。

HTML中iframe展示

如下图所示,右侧代码中圈出来的iframe标签,渲染之后在前端显示的就是左侧圈出来的区域;

也就是此iframe嵌套在该HTML框架中。

如何说明iframe是一个独立部分、是被嵌套到HTML框架内部的?见下图:

将iframe标签中的 src=/default/research/redirect 复制出来在地址栏进行链接替换,会发现此时的页面只有iframe独立部分,之前页面中的banner不见了。

参考:

深入理解iframe-简书

iframe文档

selenium定位元素

selenium模拟登陆操作

部分代码:

    def auto_login(self):
        # 获取浏览器窗口对象
        driver = webdriver.Chrome()
        # 打开浏览器进入指定地址
        driver.get(‘https://ycjq.95358.com/research‘)

        # selenium进行元素定位、填写内容
        driver.find_element_by_name("CyLoginForm[username]").send_keys("你的账号")
        driver.find_element_by_name("CyLoginForm[pwd]").send_keys("你的密码")

        # 这里图像识别获取验证码  def valideCode():
        # driver.find_element_by_name("valideCode").send_keys("")

        # selenium进行元素定位、模拟点击(登陆)
        time.sleep(10)
        driver.find_element_by_id("btnSubmit").click()

页面分析:

根据标签的“name”、“id”等,进行元素定位,然后模拟操作。

执行上述代码,你会发现会自动打开浏览器,进入指定地址,然后会自动进行账号密码的输入,并且自动点击“登陆”;

然后会进行登陆后的页面跳转。

整个流程很正确也很合理,但页面跳转之后再进行元素定位、模拟点击时就有坑了。

切换iframe

上一步“模拟登陆”时,HTML页面并不涉及 iframe 标签,但登陆过后就含有 iframe标签了。

所以再通过selenium进行模拟点击时就要切换iframe了。

在用selenium定位页面元素的时候会遇到定位不到的问题,明明元素就在那儿,用firebug也可以看到,就是定位不到,问题很有可能就出在iframe上。

问题复现

错误代码复现:

    def auto_login(self):
        # 获取浏览器窗口对象
        driver = webdriver.Chrome()
        # 打开浏览器进入指定地址
        driver.get(‘https://ycjq.95358.com/research‘)

        # selenium进行元素定位、填写内容
        driver.find_element_by_name("CyLoginForm[username]").send_keys("你的账号")
        driver.find_element_by_name("CyLoginForm[pwd]").send_keys("你的密码")

        # selenium进行元素定位、模拟点击(登陆)
        time.sleep(10)
        driver.find_element_by_id("btnSubmit").click()
        time.sleep(10)
     # 定位到“上传”按钮
        driver.find_element_by_id(‘notebook_list_info‘).click()

可以确定下图的元素定位位置无误,理应可以通过selenium模拟点击的,但模拟点击之后一直提示找不到标签:

问题解决

问题出现之后,进行相关问题搜索,五花八门,各种解决方案,用了一下午,各种尝试,最终确定问题出在iframe。

只有切换到iframe里面,selenium才能定位到 iframe里面的元素。

切换iframe

selenium提供了switch_to.frame()方法来切换frame

switch_to.frame(reference)

注意:

可能你会这样写:switch_to_frame(),但会发现,这段代码被加上“删除线”了;

原因是这个方法已经out了,之后可能被废弃,建议switch_to.frame()

switch_to.frame(reference)中的reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象。

如下图中的 id、name。

如果没有id、name属性的化,可以通过xpath匹配WebElement对象进行定位。

正确定位代码:

    def auto_login(self):
        # 获取浏览器窗口对象
        driver = webdriver.Chrome()
        # 打开浏览器进入指定地址
        driver.get(‘https://ycjq.95358.com/research‘)

        # selenium进行元素定位、填写内容
        driver.find_element_by_name("CyLoginForm[username]").send_keys("你的账号")
        driver.find_element_by_name("CyLoginForm[pwd]").send_keys("你的密码")

        # 这里图像识别获取验证码  def valideCode():
        # driver.find_element_by_name("valideCode").send_keys("")

        # selenium进行元素定位、模拟点击(登陆)
        time.sleep(10)
        driver.find_element_by_id("btnSubmit").click()
        time.sleep(10)
        # 切换iframe
        driver.switch_to.frame(‘research‘)
        driver.find_element_by_id(‘notebook_list_info‘).click()

执行代码之后即可正确模拟点击”上传“按钮。

参考:https://blog.csdn.net/huilan_same/article/details/52200586

原文地址:https://www.cnblogs.com/bigtreei/p/9974581.html

时间: 2024-12-30 02:56:19

Selenium定位不到指定元素原因之iframe(unable to locate element)的相关文章

解决网页元素无法定位(NoSuchElementException: Unable to locate element)的几种方法

只解决一个问题--NoSuchElementException: Message: Unable to locate element 出错原因 1.可能元素加载未完成 元素加载没完成,同样的路径定位,每次测试结果确是不一样的,有时候抛出错误,有时候正常!这就比较蛋疼了,也就是说,和你的定位方法半毛钱关系没有,而很大程度上取决于你的电脑和网速! 1.解决方案A:添加两行代码 wait = ui.WebDriverWait(driver,10) wait.until(lambda driver: d

【Python】selenium调用IE11浏览器,报错“找不到元素”NoSuchWindowException: Message:Unable to find element on closed window

当编写自动化脚本,定位浏览器元素时,报如下错误: 代码: >>> # coding=utf-8 >>> from selenium import webdriver >>> driver = webdriver.Ie() >>> driver.get("www.baidu.com") >>> driver.find_element_by_id("kw").send_keys(&

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element 定位frame中的元素

from selenium import webdriver import time def sleep(w=1): time.sleep(w) return 0 # 初始化浏览器信息 driver = webdriver.Chrome() driver.get("http://m.mail.10086.cn") print("------------------------------login in-------------------------------"

Selenium弹出新页面无法定位元素问题(Unable to locate element)--多窗口切换

最近学习到多窗口切换,在页面操作过程中有时点击某个链接会弹出新的窗口,这时需要先切换到新窗口才能对其进行操作.Webdriver提供了switch_to.window( ) 方法实现在不同窗口中切换. 查阅相关资料,得到两种方法来定位到当前页面: 方法一: browser.switch_to_window(browser.window_handles[1]) 方法二:直接定位当前最新弹出的窗口 for handle in browser.window_handles:#方法二,始终获得当前最后的

selenium定位css时报org.openqa.selenium.NoSuchElementException: Unable to locate element: {&quot;method&quot;:&quot;xpath&quot;,&quot;selector&quot;:&quot;

推测原因如下,请进行排查:原因1:xpath指定位置处还未展现出来,自动化已经进行点击,从而找不到该元素,解决办法就是加入等待时间,thread.sleep(3000);以上为3秒.原因2:xpath指定位置受前后的影响,比如需要先点击一下其他内容,才能展现,所以需要处理.建议:xpath定位建议使用相对路径定位,你使用的绝对路径定位.

selenium定位元素的八种方法

web driver提供了八种元素定位的方法: id, name, class name, tag name, link text, partial link text, xpath, css selector 如百度首页,百度一下按钮的元素信息 <input type="submit" id="su" value="百度一下" class="bg s_btn"> 百度首页新闻的页面的元素信息 <a href

为什么selenium定位不到元素

在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况,一般可以从以下几个方面着手解决: 1.Frame/Iframe原因定位不到元素: 这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位. 2.Xpath描述错误原因: 这种情况有可能是: 1.xpath语法规则书写错误,这个木有办法,补下xpath的语法,多写写,练练就

Selenium定位元素

Commands (命令) Action对当前状态进行操作失败时,停止测试 Assertion校验是否有产生正确的值 Element Locators指定HTML中的某元素 Patterns用于模式匹配 1. Element Locators (元素定位器) id=idid locator 指定HTML中的唯一id的元素 name=namename locator指定 HTML中相同name的元素中的第一个元素 identifier=ididentifier locator 首先查找HTML是否

Selenium定位HTML元素(Python)

本篇不是介绍通过各种方法(id, name, tag_name, css, xpath等)定位HTML各元素的普及性文章,网络上各种文档和博客介绍得均比较全面.这里只是将自己实践中,遇到的个别问题及解决方案进行记录. 在此推荐Selenium官方文档(Python版):http://selenium.googlecode.com/svn/trunk/docs/api/py/index.html 可以搜索关键字,得到函数用法和源码. 下面记录定位HTML元素方面遇到的问题和解决方法(持续更新).