Selenium自动化测试第二天(上)
如有任何学习问题,可以添加作者微信:superz-han
目录
框架
一个框架就是一个独立的网页
frameset: 框架组,用来布局框架
frame: 具体的一个框架,一般放在frameset中
iframe: 内联框架, 可以嵌入到其他网页的body中
切入 层层切入
switch_to.frame() # 只用切 iframe/frame 不用切frameset
- id
- name
- index
- 定位到的frame元素 find_element_by_id("parent")
切出
switch_to.parent_frame() # 跳到上级 多层框架推荐使用
switch_to.defaut_content() # 跳出所有 一层框架推荐使用 也可以用switch_to.parent_frame()跳出框架
示例
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://115.28.108.130/control.html")
# iframe: 内联框架, 可以嵌入到其他网页的正文中,
# frameset: 框架组,用来布局,可以嵌套,不能嵌入到body中,
# frame,框架,需要放到frameset中
# 只用切iframe及frame, frameset是用来布局的,不用切
driver.switch_to.frame("parent_frame")
driver.switch_to.frame("left")
driver.find_element_by_link_text("链接1").click()
driver.switch_to.parent_frame() # 这里不用swith_to.default_content(),不然还要再切到parent_frame
driver.switch_to.frame("main")
print(driver.find_element_by_tag_name("h2").text)
# print(driver.find_element_by_xpath("/html/body/h2").text)
sleep(5)
driver.quit()
练习
打开 http://115.28.108.130/control.html,点击链接1,输出右侧文本内容
注意
- 框架中的页面 尽量不要使用xpath绝对路径定位 /html/body/h2
xpath
- 绝对路径+索引 /html/body/div/form/div[3] 逐层写 结合index index从1开始
- 相对路径+属性(推荐) //div[@id="firstdiv"] 支持多属性结合定位
- 通过子标签 //div[a] 包含链接的div
- 通过文本定位 //[text()="第二个div"] 包含 //[contains(text(), "username")]
- 通过相对位置 //*[text()="第二个div"]/../table
- 轴 //[text()="王五"]/following::a following后面的
//[text()="用户名"]/following::input 用户名后的第一个输入框
也可以通过F12复制(不推荐:有可能有问题)
注意:
- xpath的索引从1开始
- 使用文本定位 注意 换行 空格 特殊字符
- 注意动态位置,动态属性
- 注意复制的xpath可能会有问题
css selector
css选择器, 比xpath快
find_element_by_css_selector("#firstdiv")
基本
- id #firstdiv
- class .stuname
- 标签名 div
*
可以标识任意标签
位置 不支持向上
- 下级 #firstdiv>form>div >或空格
-
- 同级元素
- 索引: :first-child() :nth-child(n) #firstdiv>form>div:nth-child(3)
属性 不支持判断文本
- 属性 [type="password"] [name=""]
- 属性 ^= 以 开头 $= 以 结尾 *= 包含
- input 常见属性: checked enabled
示例
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://115.28.108.130/control.html")
div = driver.find_element_by_css_selector("#firstdiv>form>div:nth-child(2)")
print(div.text)
table = driver.find_element_by_css_selector("#firstdiv>form>div+table")
print(table.tag_name)
练习:
打开 http://115.28.108.130/control.html#
- 找到"第二个div"并打印文本 text
- 找到"第二个div"同级的table并打印标签名 tag_name
注意:
- css selector不支持往上级查找
- 不支持查找包含某个子标签的标签
- 不支持查找指定文本内容的标签
切换窗口
- switch_to.alert(): 切到弹出框
- switch_to.frame(): 切入框架
- switch_to.window(): 切换窗口
- window_handles: 所有窗口句柄 列表
- current_window_handle: 当前窗口句柄
只有两个窗口
all = driver.window_handles # 所有窗口句柄
old = driver.current_window_handle # 当前窗口出版
for h in all: # h 是当前从all中取出来的句柄
if h != old: # 如果取出来的不等于老窗口
driver.switch_to.window(h) # 切换到新窗口
多个窗口
all = driver.window_handles
for h in all:
driver.switch_to.window(h)
if "腾讯课堂" in driver.title:
break # 跳出循环
示例
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://115.28.108.130/control.html")
# 1. 切到新页面(只打开了两个页面)
driver.find_element_by_partial_link_text("在新页面").click()
print(driver.title) # 还在原页面
all = driver.window_handles
old = driver.current_window_handle
for h in all:
if h!=old:
driver.switch_to.window(h)
print(driver.title) # 切换到了新页面
driver.find_element_by_id("kw").send_keys("龙腾育才")
driver.find_element_by_id("su").click()
sleep(1)
driver.find_element_by_partial_link_text("腾讯课堂").click() # 又打开了新页面
# 2. 多窗口切换, 根据网页标题切换
print(driver.title) # 还在百度搜索页上
all = driver.window_handles
for h in all:
driver.switch_to.window(h)
if "腾讯课堂" in driver.title:
break
else:
print("没有找到相应的页面")
print(driver.title)
sleep(5)
driver.quit()
练习
打开百度 http://www.baidu.com
搜索赶集网
切换到赶集网,并打印标题
此为北京龙腾育才 Python高级自动化(Selenium部分)授课笔记
课程介绍
想要参加现场(北京)/网络课程的可以联系作者微信:lockingfree
- 高效学习,快速掌握Python自动化所有领域技能
- 同步快速解决各种问题
- 配套实战项目练习