ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Selenium | 页面跳转后无法定位到元素,怎么破?

2021-12-20 18:31:34  阅读:286  来源: 互联网

标签:Selenium frame driver switch handles iframe 跳转 self 页面


本文节选自霍格沃兹测试学院内部教材

要定位一个元素时,怎么都定位不到的时候就要考虑是不是浏览器内嵌了一个 frame 窗口或者要找的元素在新打开的窗口里。这时候就需要进行 frame
的切换或者窗口的切换。

frame 类似于在原有主 HTML 的基础上又嵌套一个 HTML,而且嵌套的 HTML 是独立使用的,互不影响。

当打开一个页面时,光标的定位是在主页面中,如果页面是由多个 frame 组成的,那么无法直接定位到具体的元素,需要切换到自己所需要的 frame
中,再查找该元素。

iframe解析

如图可以看到iframe的标签

iframe的多种切换方式

HTML 代码示例

<iframe src="1.html" id="hogwarts_id" name="hogwarts_name"></iframe>

那么通过传入 id、name、index 以及 Selenium 的 WebElement 对象来切换 frame

  • index:传入整型的参数,从 0 开始,这里的 0 就是第一个 frame

    • driver.switch_to.frame(0)

``

  • id:iframe 的 id

    • driver.switch_to.frame("hogwarts_id")

``

  • name: iframe 的 name

    • driver.switch_to.frame("hogwarts_name")

``

  • WebElement: 传入 selenium.webelement 对象

    • driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))

iframe切换回默认页面

driver.switch_to.frame() 之后,如果还想操作原页面,则可以使用

driver.switch_to.default_content()

iframe多层切换

{: width="50%"}

如图所示多层嵌套的 iframe 从最外部 iframe 切换到 iframe2 则需要层层切换

driver.switch_to.frame("iframe1")driver.switch_to.frame("iframe2")

从 iframe2 切换回 iframe1 可以使用父子切换


# 从 iframe2 切换到上一级 iframe1 driver.switch_to.parent_frame()# 从 iframe1 切换到上一级 iframe,如果 iframe 已经是最上级,则保持不变driver.switch_to.parent_frame()

这个方法是 Selenium 提供的直接从子 frame 切换到父 frame,可以使用在嵌套的 frame 框架中。

多窗口处理

元素有属性,浏览器的窗口其实也有属性的,浏览器窗口的属性用句柄(handle)来识别。

当浏览器打开一个窗口时,如果要在新的窗口操作就需要句柄切换。

句柄的获取

当有多个窗口时,可以用 window_handles 打印句柄:


>>> browser = webdrver.Chrome()>>> handles = browser.window_handles>>> handles

打印出的 window_handles:

['CDwindow-8012E9EF4DC788A58DC1588E7B8A7C44', 'CDwindow-11D52927C71E7C2B9984F2D1E2856049']

句柄的切换

通过打印 handles 可以看出,它是一个列表,那么就可以通过 switch_to.window() 来切换句柄

从上面源代码中的说明可以看出,switch_to.window()需要提供一个 windows_name,可以是 name 也可以是 windows
handle。


from selenium import webdriver  
browser = webdriver.Chrome()handles = browser.window_handlesprint(handles)browser.switch_to.window(handles[-1])

这里唯一要注意的是 handles[-1] 是一个列表,这里的 -1 表示浏览器窗口的倒数第一个。

实战案例

百度搜索“霍格沃兹测试学院”,点击“霍格沃兹测试学院_腾讯课堂”,点击“中高级测试开发「名企定向培养」班-霍格沃兹测试学院”。

代码示例:

      *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   * 



from selenium import webdriver  
  
class TestHogwarts:    def setup_method(self, method):        self.driver = webdriver.Chrome()        self.driver.implicitly_wait(3)  
    def teardown_method(self, method):        self.driver.quit()  
    def test_hogwarts(self):        self.driver.get('https://www.baidu.com')        #在输入框中输入霍格沃兹测试学院        self.driver.find_element_by_id('kw').send_keys('霍格沃兹测试学院')        #点击搜索        self.driver.find_element_by_css_selector('.s_btn').click()        #使用link_text点击        self.driver.find_element_by_link_text('霍格沃兹测试学院_腾讯课堂').click()        #将获取到的window_handles赋值给一个变量handles        handles = self.driver.window_handles        #切换句柄        self.driver.switch_to.window(handles[-1])        assert len(self.driver.find_elements_by_css_selector('.ag-title-main')) == 1

在做Web自动化的时候,网页中 frame 的定位以及多窗口处理,小伙伴们学会了吗?今天就先讲到这里啦,大家还想看什么内容的文章也可以留言告诉我们哦!

** 推荐学习**

内容全面升级,4 个月 20+ 项目实战强化训练,资深测试架构师、开源项目作者亲授 BAT 大厂前沿最佳实践,
带你一站式掌握测试开发必备核心技能( 对标阿里P6+,年薪50W+ )! 直推 BAT 名企测试经理,普遍涨薪 50%+!

⬇️ 点击“阅读原文”,提升测试核心竞争力!

阅读原文

标签:Selenium,frame,driver,switch,handles,iframe,跳转,self,页面
来源: https://www.cnblogs.com/hogwarts/p/15712326.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有