WebDriver中级篇

元素操作|浏览器操作方法

目标
1. 掌握WebDriver常用的元素操作方法
2. 掌握WebDriver常用的操作浏览器方法
为什么要学习操作元素的方法?
1. 需要让脚本模拟用户给浏览器指定元素输入值
2. 需要让脚本模拟人为删除元素的内容
3. 需要让脚本模拟点击按钮    

元素常用操作方法

1. clear()            清除文本
2. send_keys()        模拟输入
3. click()            单击元素
说明:都是通过元素调用的方法,之前有用过,这里就不重复写了。
案例-1 用户注册A
需求:
    1. 通过脚本执行输入 用户名:admin;密码:123456;电话号码:18611111111;电子邮件:123@qq.com;
    2. 间隔3秒后,修改电话号码为:18600000000
    3. 间隔3秒,点击注册用户A
    4. 间隔3秒,关闭浏览器
    5. 元素定位方法不限
from time import sleep

from selenium import webdriver

driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)

# 实现需求
driver.find_element_by_css_selector("#user").send_keys("admin")
sleep(3)
driver.find_element_by_css_selector("#password").send_keys("123456")
sleep(3)
driver.find_element_by_css_selector(".tel").send_keys("18611111111")
sleep(3)
driver.find_element_by_css_selector("#email").send_keys("123@qq.com")
sleep(3)
# 修改电话,先清除使用clear
driver.find_element_by_css_selector(".tel").clear()
driver.find_element_by_css_selector(".tel").send_keys("1860000000")
# 点击按钮
driver.find_element_by_css_selector("button").click()

sleep(3)
driver.quit()
案例-1 实现步骤难点分析:
1. 间隔3秒 --> sleep(3)
2. 修改电话号码,先清除在输入新的号码; 清除  --> clear()
3. 点击按钮  --> click()
问题
1. 脚本启动浏览器窗口大小默认不是全屏?
2. 脚本执行结束如何关闭浏览器?

WebDriver操作浏览器常用方法

说明:主要了解通过WebDriver操作浏览器的常用方法
# 最大化浏览器
driver.maximize_window()
# 刷新
driver.refresh()
# 后退
driver.back()
# 前进
driver.forward()
# 设置浏览器大小
driver.set_window_size(300,300)
# 设置浏览器位置
driver.set_window_position(300,200)
# 关闭浏览器单个窗口
driver.close()
# 关闭浏览器所有窗口
driver.quit()
from time import sleep

from selenium import webdriver
driver = webdriver.Firefox()
url1 = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
url2 = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册A.html"

# 打开第一个窗口,第一个窗口标号1
driver.get(url1)
sleep(3)

# 打开第二个窗口,第二个窗口标号2
driver.get(url2)
sleep(2)

# 后退,退到标号1
driver.back()
sleep(2)
# 前进,进到标号2
driver.forward()
sleep(3)

#刷新
driver.refresh()
sleep(3)
driver.quit()
from time import sleep

from selenium import webdriver

driver = webdriver.Firefox()
url1 = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url1)
sleep(3)

# 点击注册A网页.html
driver.find_element_by_link_text("注册A网页").click()
sleep(3)
#演示close方法
driver.close()
#演示quit
#driver.quit()
"""
close()与quit()区别:1.close关闭当前主窗口
                    2.quit关闭由webdriver启动的所有窗口
"""

WebDriver其他常用的方法

为什么要学习WebDriver其他方法
1. 如何获取元素大小?
2. 如果获取元素的文本?
3. 如何获取元素属性值?
4. 如果让程序判断元素是否为可见状态?

我们想解决以上问题,就需要学习WebDriver封装其他操纵元素的方法
WebDriver其他常用方法
1. size                    返回元素大小
2. text                    获取元素的文本
3. title                   获取页面title
4. current_url             获取当前页面URL
5. get_attribute("xxx")    获取属性值;xxx:要获取的属性
6. is_display()            判断元素是否可见
7. is_enabled()            判断元素是否可用
提示:
    1. size、text、title、current_url:为属性,调用时无括号;如:xxx.size
    2. title、current_url:使用浏览器实例化对象直接调用;    如: driver.title
Demo
from selenium import webdriver
driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)

# 获取用户名文本框大小
size = driver.find_element_by_css_selector("#user").size
print("文本框大小:",size)
# 获取文本值
text = driver.find_element_by_partial_link_text("访问 新浪 网站").text
print("a标签链接文本值:",text)
# 获取元素属性值
get_attribute = driver.find_element_by_partial_link_text("访问 新浪 网站").get_attribute("href")
print("a标签href的值为:",get_attribute)
print("-------------------------")
# 获取当前页面title
title = driver.title
print("当前页面的title:",title)
# 获取当前页面url
url = driver.current_url
print("当前页面的url:",url)
print("-------------------------")

# 判断span元素是否显示
is_displayed = driver.find_element_by_css_selector("span").is_displayed()
print("span元素是否显示:",is_displayed)
# 判断取消按钮是否可用
is_enabled = driver.find_element_by_css_selector("#cancel").is_enabled()
print("取消按钮是否可用:",is_enabled)

"""
文本框大小: {'height': 30, 'width': 167}
a标签链接文本值: 访问 新浪 网站
a标签href的值为: http://www.sina.com.cn/
-------------------------
当前页面的title: 表单综合实例
当前页面的url: file:///D:/BaiduNetdiskDownload/19%E9%BB%91%E9%A9%AC%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80+%E5%B0%B1%E4%B8%9A/web%E8%87%AA%E5%8A%A8%E5%8C%96Day01/02_%E5%85%B6%E4%BB%96%E8%B5%84%E6%96%99/%E6%B3%A8%E5%86%8C%E5%AE%9E%E4%BE%8B.html
-------------------------
span元素是否显示: False
取消按钮是否可用: False
"""

WebDriver鼠标、键盘操作

目标
1. 了解WebDriver操作鼠标方法
2. 了解WebDriver操作键盘方法

鼠标事件

说明:WebDriver库对模拟鼠标操作封装的一些方法,此知识点作为了解
WebDriver为什么要操作鼠标?
说明:现在Web产品中提供了丰富的鼠标交互方式,如:双击、悬停、拖拽等功能,做为Web产品测试框架,需要
      应对这些Web产品应用场景,所以在WebDriver类库中封装了相应的鼠标交互方法。
疑问: WebDriver提供了那些操作鼠标事件的方法?
WebDriver操作鼠标方法
说明:在WebDriver中将操作鼠标的方法封装在ActionChains类中

1. context_click()            右击 --> 此方法模拟鼠标右键点击效果
2. double_click()            双击 --> 此方法模拟鼠标双击效果
3. drag_and_drop()            拖动 --> 此方法模拟鼠标拖动效果
4. move_to_element()        悬停 --> 此方法模拟鼠标悬停效果
5. perform()                执行 --> 此方法用来执行以上所有鼠标方法

为了更好的学习其他方法,我们先学习perform()执行方法,因为所有的方法都需要执行才能生效
鼠标执行-perform()
说明:在ActionChains类中所有提供的鼠标事件方法,在调用的时候所有的行为都存储在ActionChains类中,
      而perform()方法就是执行所有ActionChains中的行为

提示:必须调用perform()方法才能执行鼠标事件
鼠标右键-context_click()
说明:在ActionChains类中的鼠标右键方法是个已知的bug,因为它能点击右键出现菜单,但无法选择右键菜单选
      项,因此方法了解即可

需求:
    案例-1注册页面A,在用户名文本框上点击鼠标右键
代码实现关键点分析
1. 导包:from selenium.webdriver.common.action_chains import ActionChains
2. 实例化ActionChains对象:Action=ActionChains(driver)
3. 调用右键方法:element=Action.context_click(username)  #这个username是通过webdriver定位的文本元素
4. 执行:element.perform()
鼠标双击-double_click()
说明:模拟双击鼠标左键操作
需求:
    案例-1注册页面A,给用户名设置为admin,暂停3秒钟后双击鼠标左键,选中admin;
from time import sleep

from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Firefox()
url1 = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册A.html"
driver.get(url1)
driver.find_element_by_css_selector("#userA").send_keys("admin")
sleep(3)
action = ActionChains(driver)
action.double_click(driver.find_element_by_css_selector("#userA")).perform()
鼠标拖动-drag_and_drop()
说明:模拟鼠标拖动动作,选定拖动源元素释放到目标元素
拖动关键点分析
1. 源元素   socure=driver.find_element_by_id(xxx)
2. 目标元素 target=driver.find_element_by_id(xxx)
3. 调用方法 Action.drag_and_drop(source,target).perform()
鼠标悬停-move_to_element()
说明: 模拟鼠标悬停在选中的元素
需求:
    案例-1注册页面A,将模拟鼠标悬停 用户注册A 按钮,显示加入会员A提示
代码实现关键点分析
1. 导包...
2. 实例化...
3. 调用悬停方法:Action.move_to_element(element).perform()
鼠标操作 总结
1. 以上鼠标操作方法作为了解知识;
2. 建议掌握悬停方法

键盘操作

说明:
    1). 模拟键盘上一些按键或者组合键的输入 如:Ctrl+C 、Ctrl+V;
    2). WebDriver中对键盘的操作都封装在Keys类中
Keys类
导包:from selenium.webdriver.common.keys import Keys
常用的键盘操作
1. send_keys(Keys.BACK_SPACE)删除键(BackSpace) 
2. send_keys(Keys.SPACE)空格键(Space) 
3. send_keys(Keys.TAB)制表键(Tab) 
4. send_keys(Keys.ESCAPE)回退键(Esc) 
5. send_keys(Keys.ENTER)回车键(Enter) 
6. send_keys(Keys.CONTROL,'a') 全选(Ctrl+A) 
7. send_keys(Keys.CONTROL,'c')复制(Ctrl+C)

提示:以上方法就不一个一个讲解了,因为调用方法都一样;
案例-1 注册页面A
需求:
    1). 输入用户名:admin1,暂停2秒 删除1
    2). 全选用户名:admin      暂停2秒
    3). 复制用户名:admin      暂停2秒
    4). 粘贴到密码框          暂停2秒
    5). 关闭浏览器
from time import sleep

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
url1 = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册A.html"
driver.get(url1)
# 定位用户名
element=driver.find_element_by_css_selector("#userA")
# 输入用户名
element.send_keys("admin1")
sleep(3)
# 删除1
element.send_keys(Keys.BACK_SPACE)
sleep(3)
# 全选
element.send_keys(Keys.CONTROL,'a')
sleep(3)
# 复制
element.send_keys(Keys.CONTROL,'c')
sleep(3)
# 粘贴
driver.find_element_by_css_selector("#passwordA").send_keys(Keys.CONTROL,'v')

鼠标、键盘-总结

1. ActionChains作用和位置
2. 鼠标悬停方法
3. Keys类 位置
4. 键盘操作调用方法

元素等待

目标
1. 了解元素显式等待
2. 掌握元素隐式等待
什么是元素等待?
概念:WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程;
为什么要设置元素等待?
1. 由于网络速度原因
2. 电脑配置原因
3. 服务器处理请求原因
4.前段的ajax技术
导致的页面元素没能及时加载
也就是说延迟的原因。
元素等待类型
1. 显式等待
2. 隐式等待

显式等待【了解】

概念:使WebDriver等待指定元素条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)
提示:
    1). 在WebDriver中把显式等待的相关方法封装在WebDriverWait类中
    2). 等待是判定条件成立时,那如何判断条件成立?相关判断的方法封装在expected_conditions类中
案例-1 注册页面A
需求:
    1. 如果用户名文本框存在,就输入admin
实现难点分析
1. 导包 等待类         --> from selenium.webdriver.support.wait import WebDriverWait
2. 导包 判断条件     --> from selenium.webdriver.support import expected_conditions as EC
                        (将expected_conditions 通过as关键字起个别名:EC)
3. WebDriverWait(driver, timeout, poll_frequency=0.5)
        1). driver:浏览器对象
        2). timeout:超时的时长,单位:秒
        3). poll_frequency:检测间隔时间,默认为0.5秒
4. 调用方法 until(method):直到..时
        1). method:调用EC.presence_of_element_located(element)
                    element:调用By类方法进行定位
案例一 代码示例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册A.html"
driver.get(url)
element = (By.CSS_SELECTOR,"#userA")
WebDriverWait(driver,10).until(EC.presence_of_element_located(element)).send_keys("admin")
driver.quit()
"""
当element在页面不存在时,在等待超时结束后报超时异常,同时下面的代码被终止执行,不会执行driver.quit()代码
"""

隐式等待【掌握】

说明:等待元素加载指定的时长,超出抛出NoSuchElementException异常,实际工作中,一般都使用隐式等待;
显式与隐式区别:
    1. 作用域:显式等待为单个元素有效,隐式为全局元素
    2. 方法:显式等待方法封装在WebDriverWait类中,而隐式等待则直接通过浏览器实例化对象调用
 隐式等待调用方法
方法:implicitly_wait(timeout)
      (timeout:为等待最大时长,单位:秒)

调用:driver.implicitly_wait(10)
      (driver:为浏览器实例化对象名称)
隐式等待执行-说明
如果定位某一元素定位失败,那么就会触发隐式等待有效时长,如果在指定时长内加载完毕,则继续执行,否则
抛出NoSuchElementException异常,终止下面代码执行,如果元素在第一次就定位到则不会触发隐式等待时长;
代码示例
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.implicitly_wait(10)
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册A.html"
driver.get(url)
driver.find_element_by_css_selector("#userA").send_keys("admin")
sleep(3)
driver.quit()

元素等待-总结

1. 为什么要设置元素等待
2. 显式等待与隐式等待区别
3. 掌握隐式等待
条件成立执行后面语句,条件不成立抛出异常,并终止后面的语句

下拉选择框、警告框、滚动条操作

下拉选择框

目标
1. 掌握下拉选择框的操作方法
什么是下拉选择框
说明:下拉框就是HTML中<select>元素;
需求:
案例-1 注册实例页面,城市选项-暂停2秒后选择上海A,暂停2秒后选择重庆,暂停2秒后选择广州
实现方式
1. 定位option选项
2. 定位方式不限
第一种方式根据tag_name定位
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.implicitly_wait(10)
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)
# 城市选项,暂停两秒后选择上海,暂停两秒后选择重庆,暂停两秒后选择广州
# 第一种方式,根据标签名选择
tags = driver.find_elements_by_tag_name("option")
for tag in tags:
    if tag.get_attribute("value") == "sh":
        sleep(2)
        tag.click()
for tag in tags:
    if tag.text == "重庆":
        sleep(2)
        tag.click()
for tag in tags:
    if tag.text == "广州":
        sleep(2)
        tag.click()
sleep(3)
driver.quit()
第二种方式使用CSS
# 第二种使用CSS
sleep(2)
driver.find_element_by_css_selector("[value='sh']").click()
sleep(2)
driver.find_element_by_css_selector("[value='cq']").click()
sleep(2)
driver.find_element_by_css_selector("[value='gz']").click()
问题
如果有多个选项原有的定位方式处理起来比较繁琐;
每次查找元素耗时,click事件浪费资源
Select类
说明:Select类是WebDriver为解决select标签定位诞生的,此类定位的是select标签
select类有哪些方法?
Select方法:
1. select_by_index()                --> 根据option索引来定位,从0开始
2. select_by_value()                --> 根据option属性 value值来定位
3. select_by_visible_text()            --> 根据option显示文本来定位
Select类实现步骤分析:
1. 导包 Select类 --> from selenium.webdriver.support.select import Select
2. 实例化Select类 select=Select(WebElemet)
                    (WebElement):driver.find_element_by_id("selectA"))
3. 调用方法:select.select_by_index(index)
                (index:为列表索引,从0开始)
Select实现代码总结
select = Select(driver.find_element_by_id("select"))
# 1.根据索引实现
sleep(3)
select.select_by_index(1)
sleep(3)
select.select_by_index(3)
sleep(3)
select.select_by_index(2)
sleep(3)
# 2.根据文本实现
select.select_by_visible_text("上海")
sleep(3)
select.select_by_visible_text("重庆")
sleep(3)
select.select_by_visible_text("广州")
# 3.根据value属性实现
select.select_by_value("sh")
select.select_by_value("cq")
select.select_by_value("gz")
优点:这样只需要查找一个Select元素,在Select元素再找就可以了,查找过程极大的简化了,也不需要click()事件

警告框处理

需求
对案例-1 注册页面A,首先点击alerta按钮,其次输入用户名:admin
问题
1. 按钮被点击后弹出对话框,而接下来输入用户名的语句没有生效
from time import sleep

from selenium import webdriver

driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)
# 点击alert按钮
driver.find_element_by_css_selector("#alert").click()
# 输入注册信息
driver.find_element_by_css_selector("#user").send_keys("admin")
sleep(3)
driver.find_element_by_css_selector("#password").send_keys("123456")
sleep(3)
driver.find_element_by_css_selector(".tel").send_keys("18611111111")
sleep(3)
driver.find_element_by_css_selector("#email").send_keys("123@qq.com")
sleep(3)
driver.quit()
原因:当点击alert按钮后,弹出一个窗口,当窗口未关闭时,页面是灰色的,无法做任何事情

警告框处理
说明:WebDriver中对处理警告框的操作,有专用的处理方法;

提示:
    HTML中常用的对话框有三种,处理的方法都一样
        1). alert
        2). confirm
        3). prompt
警告框处理方法
1. text                 --> 返回alert/confirm/prompt中的文字信息
2. accept()             --> 接受对话框选项
3. dismiss()            --> 取消对话框选项
调用方法
1. 获取当前页面弹出的警告框 
        alert=driver.switch_to.alert
2. 调用
        alert.text
        alert.accept()
        alert.dismiss()
示例代码
from time import sleep

from selenium import webdriver

driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)
# 点击alert按钮
driver.find_element_by_css_selector("#alert").click()
# 获取警告框
alert = driver.switch_to.alert
# 打印警告框文本
print(alert.text)
# 接受警告框
sleep(2)
alert.accept()
# 取消警告框
#alert.dismiss()
# 输入注册信息
driver.find_element_by_css_selector("#user").send_keys("admin")
sleep(3)
driver.find_element_by_css_selector("#password").send_keys("123456")
sleep(3)
driver.quit()

滚动条操作

说明:WebDriver类库中并没有直接提供对滚动条进行操作方法,但是它提供了可调用JavaScript脚本的方法,所
          以我们可以通过JavaScript脚本来达到操作滚动条的目的;
备注:
    1). 滚动条:一种可控制程序显示范围的组件
    2). JavaScript:一种流行脚本语言,可以操作HTML标签;
        JavaScript学习资料:http://www.w3school.com.cn/js/js_intro.asp
为什么要学习滚动条操作?
1. 在HTML页面中,由于前端技术框架的原因,页面元素为动态显示,元素根据滚动条的下拉而被加载
2. 页面注册同意条款,需要滚动条到最底层,才能点击同意
需求
案例-1 注册实例,打开页面2秒后,滚动条拉倒最底层
需求实现分析:
1. 设置JavaScritp脚本控制滚动条  js="window.scrollTo(0,1000)"
                                    (0:左边距;1000:上边距;单位像素)
2. WebDriver调用js脚本方法  driver.execute_script(js)
控制滚动条实现代码
from time import sleep

from selenium import webdriver

driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)
# 最底层
js1 = "window.scrollTo(0,1000)"
# 最顶层
js2 = "window.scrollTo(0,0)"
sleep(3)
# 执行最底层
driver.execute_script(js1)
# 执行最顶层
sleep(3)
driver.execute_script(js2)
sleep(3)
driver.quit()
滚动条总结
1. WebDriver控制滚动方法
2. JavaScript控制滚动条语句
备注:js控制滚动条语句有很多种,如:js=document.documentElement.scrollTop=1000;
          但是推荐使用JS调用window句柄去控制;

frame表单切换、多窗口切换

目标
1. 掌握WebDriver切换frame表单方法
2. 掌握WebDriver多窗口切换的技巧

frame表单切换

frame:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素;
           (HTML语言中,frame/iframe标签为表单框架)
为什么要学习frame表单切换
需求:案例-2 注册实例.html
    1. 此页面有三个注册界面,先填写最上边注册信息,其次填写注册A页面注册信息,最后填写注册B页面信息
    2. 定位方式不限
from time import sleep

from selenium import webdriver

driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)
# 最上注册信息
driver.find_element_by_css_selector("#user").send_keys("admin")
driver.find_element_by_css_selector("#password").send_keys("123456")
driver.find_element_by_css_selector("#tel").send_keys("10086")
# 左A注册信息
driver.find_element_by_css_selector("#userA").send_keys("admin")
driver.find_element_by_css_selector("#passwordA").send_keys("123456")
driver.find_element_by_css_selector("#telA").send_keys("10086")
# 右B注册信息
driver.find_element_by_css_selector("#userB").send_keys("admin")
driver.find_element_by_css_selector("#passwordB").send_keys("123456")
driver.find_element_by_css_selector("#telB").send_keys("10086")

sleep(3)
driver.quit()
问题
1. 当前页面内无法定位注册页面A和注册页面B
原因
查看网页源代码可知原因
可以看出注册A.html 和 注册B.html 是通过表单链接形式在注册实例.html中,真正代码并未在注册实例.html中,
所以在注册实例.html中定位A.html页面和B.html页面的元素进行操作是不可取的。
frame表单切换
说明:在WebDriver类库中封装了HTML页面中使用frame表单框架技术定位的方法

方法:
    1). driver.switch_to.frame("myframe1")        -->    切换表单方法
            (myframe1:为frame表单的name或id)
    2). driver.switch_to.default_content()        --> 恢复默认页面方法
            (在frame表单中操作其他页面,必须先回到默认页面,才能进一步操作)
案例-2解决方案
1. 完成当前页面注册信息;
2. 调用表单切换方法(switch_to.frame("myframe1"))切换到注册用户A表单中
3. 调用恢复默认页面方法(switch_to.default_content())
4. 调用表单切换方法(switch_to.frame("myframe2"))切换到注册用户B表单中
案例代码
from time import sleep

from selenium import webdriver

driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)
# 最上注册信息
driver.find_element_by_css_selector("#user").send_keys("admin")
driver.find_element_by_css_selector("#password").send_keys("123456")
driver.find_element_by_css_selector("#tel").send_keys("10086")
# 左A注册信息,切换到注册用户A表单中
driver.switch_to.frame("myframe1")
driver.find_element_by_css_selector("#userA").send_keys("admin")
driver.find_element_by_css_selector("#passwordA").send_keys("123456")
driver.find_element_by_css_selector("#telA").send_keys("10086")
# 右B注册信息,再从实例页面,切换到B表单
driver.switch_to.default_content()
driver.switch_to.frame("myframe2")
driver.find_element_by_css_selector("#userB").send_keys("admin")
driver.find_element_by_css_selector("#passwordB").send_keys("123456")
driver.find_element_by_css_selector("#telB").send_keys("10086")

sleep(3)
driver.quit()

表单切换-总结

1. HTML中常用的表单框架
2. 切换表单方法
3. 为什么要恢复默认页面?
4. 恢复默认页面方法

多窗口

说明:在HTML页面中,经常有a标签也就是超链接,这些链接在被执行时,有的会在新的窗口打开链接;
(target属性的value设置为_blank,会在新窗口打开)
为什么要切换窗口?
案例-2 注册实例.html
需求:
    1). 点击注册A页面链接,在打开的页面,填写A页面注册信息;
问题
   1). 无法定位注册A页面
from time import sleep

from selenium import webdriver

driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)
sleep(3)

# 点击A注册链接,跳转到新窗口A页面
driver.find_element_by_link_text("注册A网页").click()
# 在新窗口A页面,输入注册信息
sleep(3)
driver.find_element_by_css_selector("#userA").send_keys("admin")
driver.find_element_by_css_selector("#passwordA").send_keys("123456")
driver.find_element_by_css_selector("#telA").send_keys("10086")
sleep(3)
driver.quit()
报错:无法定位注册A页面
多窗口切换
说明:在WebDriver中封装了获取当前窗口句柄方法和获取所有窗口句柄的方法以及切换指定句柄窗口的方法;
      (句柄:英文handle,窗口的唯一识别码)
灵光一现:driver.quit()关闭所有由webdriver启动的窗口   driver.close():是关闭当前句柄窗口,当前句柄窗口就是主窗口。试试(待验证)
方法:
    1). driver.current_window_handle         --> 获取当前窗口句柄
    2). driver.window_handles                 --> 获取所有窗口句柄
    3). driver.switch_to.window(handle)        --> 切换指定句柄窗口
案例-2 解决方案分析
1. 获取注册实例.html当前窗口句柄
2. 点击注册实例.html页面中注册A页面
3. 获取所有窗口句柄
4. 遍历判断窗口句柄并切换到注册A页面
5. 操作注册A页面元素,注册信息
from time import sleep

from selenium import webdriver

driver = webdriver.Firefox()
url = r"D:\BaiduNetdiskDownload\19黑马测试基础+就业\web自动化Day01\02_其他资料\注册实例.html"
driver.get(url)
sleep(3)
# 获取当前窗口句柄
current_handle = driver.current_window_handle
print("当前窗口句柄为:",current_handle)
# 点击A注册链接,跳转到新窗口A页面
driver.find_element_by_link_text("注册A网页").click()
#获取所有窗口句柄
handles = driver.window_handles
print("所有窗口句柄:",handles)
#遍历及切换
for handle in handles:
    if handle != current_handle:
        #执行切换窗口方法
        driver.switch_to.window(handle)
# 在新窗口A页面,输入注册信息
sleep(3)
driver.find_element_by_css_selector("#userA").send_keys("admin")
driver.find_element_by_css_selector("#passwordA").send_keys("123456")
driver.find_element_by_css_selector("#telA").send_keys("10086")

sleep(3)
driver.quit()
"""
    当前窗口句柄为: {5ddc693b-1e42-4004-848e-bb4b0b88565a}
    所有窗口句柄: ['{5ddc693b-1e42-4004-848e-bb4b0b88565a}', '{b6b73d77-c84b-418a-938d-01bab19d9fc4}']
"""

多窗口切换-总结

1. 什么是句柄?
2. 获取当前窗口句柄方法
3. 获取所有窗口句柄方法
4. 切换指定句柄窗口方法

posted @ 2020-10-11 14:48  幸福来之不易  阅读(237)  评论(0编辑  收藏  举报