【Selenium】Selenium自动化进阶find_elements技巧和iframe技巧

闲话

前文已经说了基本的定位元素的方式和模拟键鼠点击页面元素,本篇将给大家讲讲自动化测试的进阶技巧 关键字find_elements和iframe

因为这次文章属纯文本笔记分享,需要这次知识的视频教程的小伙伴可以点击并输入暗号:CSDN
在这里插入图片描述书接上文:【Selenium】Selenium自动化入门之操作元素与句柄
appium篇:【appium】appium自动化入门之环境搭建(上)

2.8 定位一组元素 find_elements

前言

前面的几篇都是讲如何定位一个元素,有时候一个页面上有多个对象需要操作,如果一个个去定位的话,比较繁琐,这时候就可以定位一组对象。
webdriver 提供了定位一组元素的方法,跟前面八种定位方式其实一样,只是前面是单数,
返里是复数形式:find_elements
本篇拿百度搜索作为案例,从搜索结果中随机选择一条搜索结果,然后点击查看。

2.8.1 定位搜索结果

1.在百度搜索框输入关键字“软件测试”后,用 firebug 查看页面元素,可以看到这些搜索结果有共同的属性。
在这里插入图片描述2.从搜索的结果可以看到,他们的父元素一样:< h3 class=“t” >

3.标签都一样,且 target 属性也一样:<a target="_blank"
4.于是这里可以用 css 定位(当然用 xpath 也是可以的)

# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver.finf_element_by_id("kw").send_keys(u"软件测试")
driver.finf_element_by_id("kw").submit()
s = driver.find_elements_by_css_selector("h3.t>3")

2.8.2 确认定位结果

1.前面的定位策略叧是一种猜想,并不一定真正获取到自己想要的对象的,也许会定位到一些不想要的对象。
2.于是可以获取对象的属性,来验证下是不是定位准确了。返里可以获取 href 属性,打印出 url 地址
在这里插入图片描述

2.8.3 随机函数

1.搜索结果有 10 条,从返 10 条中随机取一个就 ok 了
2.先导入随机函数:import random
3.设置随机值范围为 0~ 9:a=random.randint(0~9)
在这里插入图片描述

2.8.4 随机打开 url

1.从返回结果中随机取一个 url 地址
2.通过 get 方法打开 url
3.其实这种方式是接口测试了,不属亍 UI 自劢化,这里只是开阔下思维,不建议用这种(接口测试的教程后续会出)

方法

扫描二维码关注公众号,回复: 12447302 查看本文章
# coding:utf-8
from selenium import webdriver
import random
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver.finf_element_by_id("kw").send_keys(u"软件测试")
driver.finf_element_by_id("kw").submit()
s = driver.find_elements_by_css_selector("h3.t>3")
# 设置随机值
t = random.randint(0,9)
# 随机取一个结果获取url地址
a = s[t].gei_attribute("href")
print a
driver.get(a)

2.8.5 通过 click 点击打开

1.前面那种方法,是直接访问 url 地址,算是接口测试的范畴了,真正模拟用户点击行为,得用 click 的方法

# coding:utf-8
from selenium import webdriver
import random
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("kw").send_keys(u"软件测试")
driver.find_element_by_id("kw").submit()
s = driver.find_elements_by_css_selector("h3.t>a")
# 设置随机值
t = random.randint(0, 9)
# 随机取一个结果点击鼠标
s[t].click()

不知道有小伙伴有没注意一个细节,前面在搜索框输入关键字后,我并没有去点击搜索按钮,而是用的 submit 的方法,submit 相当于回车键。

2.9 iframe

2.9.1 frame 和 iframe 区别

Frame 不 Iframe 两者可以实现的功能基本相同,不过 Iframe 比Frame 具有更多的灵活性。

frame 是整个页面的框架,iframe 是内嵌的网页元素,也可以说是内嵌的框架

Iframe 标记又叫浮动帧标记,可以用它将一个 HTML 文档嵌入在一个 HTML 中显示。

它和 Frame 标记的最大区别是在网页中嵌入 的< Iframe>< /Iframe>所包含的内容不整个页面是一个整体,而< Frame>< /Frame>所包含的内容是一个独立的个体,是可以独立显示的。

另外,应用 Iframe 还可以在同一个页面中多次显示同一内容,而不必重复这段内 容的代码。

2.9.2 案例操作:163 登录界面

1.打开 http://mail.163.com/登录页面
2.用 firebug 定位登录框
3.鼠标停留在左下角(定位到 iframe 位置)时,右上角整个登录框显示灰色,说明 iframe 区域是整个登录框区域
4.左下角箭头位置显示 iframe 属性

2.9.3 切换 iframe

1.由于登录按钮是在 iframe 上,所以第一步需要把定位器切换到iframe 上
2.用 switch_to_frame 方法切换,此处有 id 属性,可以直接用 id定位切换

# coding:utf-8
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://http://mail.163.com")
driver.implicitly_wait(30)
# 切换iframe
driver.switch_to_frame("x-URS-iframe")
driver.find_element_by_name("email").send_keys("123")
driver.find_element_by_name("password").send_keys("456")

2.9.4 如果 iframe 没有 id 怎么办?

1.返里 iframe 的切换是默认支持 id 和 name 的方法的,当然实际情况中会遇到没有 id 属性和 name 属性为空的情况,这时候就需要先定位 iframe

2.定位元素还是之前的八种方法同样适用,这里我可以通过 tag 先定位到,也能达到同样效果

# coding:utf-8
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://http://mail.163.com")
driver.implicitly_wait(30)
iframe = driver.find.element_by_tag_name("iframe")
driver.switch_to_frame(iframe)
driver.find_element_by_name("email").send_keys("123")
driver.find_element_by_name("password").send_keys("456")

2.9.5 释放 iframe

1.当 iframe 上的操作完后,想重新回到主页面上操作元素,这时候,就可以用 switch_to_default_content()方法返回到主页面

# coding:utf-8
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://http://mail.163.com")
driver.implicitly_wait(30)
driver.find_element_by_name("email").send_keys("123")
driver.find_element_by_name("password").send_keys("456")
# 释放iframe,重新回到主页面上
driver.switch_to.default_content()

2.9.6 如何判断元素是否在 iframe 上?

1.定位到元素后,切换到 firepath 界面
2.看 firebug 工具左上角,如果显示 Top Window 说明没有 iframe
3.如果显示 iframe#xxx 返样的,说明在 iframe 上,#后面就是它的 id
在这里插入图片描述

2.9.7 如何解决 switch_to_frame 上的横线呢?

1.先找到官方的文档介绍
在这里插入图片描述
2.python 的脚本上面划一横线,是说这个语法已经过时了(也可以继续用,只是有部份人有强迫症)。

上面文档介绍说官方已经不推荐上面的写法了,用这个写法就好了 driver.switch_to.frame()

2.9.8 参考代码如下

# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://mail.163.com/")
driver.implicitly_wait(30)
# 凿换 iframe
# iframe = driver.find_element_by_tag_name("iframe")
# driver.switch_to_frame(iframe)
# driver.switch_to_frame("x-URS-iframe")
driver.switch_to.frame("x-URS-iframe")
driver.find_element_by_name("email").send_keys("123")
driver.find_element_by_name("password").send_keys("456")
# 释放 iframe,重新回刡主页面上
driver.switch_to.default_content()

一定要记得看

我相信能在CSDN上来看这些技术类文章的,一定是有个想学习的心,奈何学习的道路遥远且冗杂,都想走前人的路,少碰点荆棘
方便大家学习我整理的一个提供大家参考的学习脑图,需要这份脑图的可以直接领取或者点击并输入暗号:CSDN也行

在这里插入图片描述

另外

当然千万不要忘记领取这份selenium自动化测试教学的视频配套版,毕竟是辛苦录制的

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Chaqian/article/details/110391330