浏览器操作
设置浏览器显示范围:
1、窗口最大化 dirver.maxmize_window()
2、设置窗口大小 dirver.set_window_size(width, height)
3、设置窗口位置 dirver.set_window_position(x, y)
浏览器显示页面操作:
1、页面后退操作 dirver.back()
2、页面前进操作 dirver.forword()
3、页面刷新操作 dirver.refresh()
"""
需求:
打开注册A.html页面,完成以下操作
1).最大化窗口
2).打印当前窗口的标题和地址
3).暂停3s,点击界面 访问 百度 网站 超链接
4).暂停3s,再次打印当前窗口的标题和地址
5).暂停3s,关闭当前窗口
6).暂停3s,关闭浏览器
"""
# 最大化浏览器
driver.maximize_window()
sleep(3)
# 设置窗口大小
driver.set_window_size(500, 700)
sleep(3)
driver.set_window_position(0, 500)
sleep(3)
# 点击新浪
driver.find_element_by_partial_link_text("新浪").click()
sleep(3)
# 后退
driver.back()
sleep(3)
# 前进
driver.forward()
sleep(3)
driver.refresh()
浏览器关闭操作:
关闭当前窗口 dirver.close()
关闭浏览器 dirver.quit()
获取浏览器操作:
获取标题:dirver.title
获取网页地址:dirver.current_url
当前窗口:创建驱动时第一个打开的窗口,对于当前窗口的元素一般都可以直接定位和操作,如果弹出新的窗口, 对于新的窗口元素是不能直接进行操作,需要学习后续的窗口切换。
"""
需求:
打开注册A.html页面,完成以下操作
1).最大化窗口
2).打印当前窗口的标题和地址
3).暂停3s,点击界面 访问 百度 网站 超链接
4).暂停3s,再次打印当前窗口的标题和地址
5).暂停3s,关闭当前窗口
6).暂停3s,关闭浏览器
"""
# 最大化浏览器
driver.maximize_window()
# 获取当前窗口标题
print("当前窗口title:", driver.title)
# 获取当前窗口url
print("当前窗口url:", driver.current_url)
sleep(3)
driver.find_element_by_partial_link_text("注册A网页").click()
# 获取当前窗口标题
print("当前窗口title:", driver.title)
# 获取当前窗口url
print("当前窗口url:", driver.current_url)
sleep(3)
页面交互操作
1、下拉框
方式1:使⽤css或xpth (推荐)
元素定位的方式操作下拉框: 操作繁琐 、影响脚本运行效率
定位元素后调用点击的操作方法进行选择
"""
需求:使用‘注册A.html’页面,完成对城市的下拉框的操作:
1).选择‘广州’
2).暂停2秒,选择‘上海’
3).暂停2秒,选择‘北京
"""
driver.find_element(By.CSS_SELECTOR, '[value="gz"]').click()
sleep(2)
driver.find_element(By.CSS_SELECTOR, '[value="sh"]').click()
sleep(2)
driver.find_element(By.CSS_SELECTOR, '[value="bj"]').click()
方式2:使⽤专属Select类
步骤:
1、导包
2、创建Select类
3、选择选项
# 使用Select类来实现
# 1、定位下拉框元素 select
el = driver.find_element(By.CSS_SELECTOR, "#selectA")
# 2、实例化Select对象
select = Select(el)
# 3、使用下标定位广州
select.select_by_index(2)
sleep(2)
# 使用value定位上海
select.select_by_value("sh")
# 使用文本定位 北京
sleep(2)
select.select_by_visible_text("A北京")
注意:
Select类实现选项只适用于HTML原生态的<select> + <option>的下拉框
2、弹出框
为什么要处理弹框:如果⻚⾯操作过程中,有弹窗出现,不处理,⽆法继续对⻚⾯操作。
类型:
1、js原⽣弹窗(警告框、输⼊框、提示框)必须处理
2、开发使⽤标签⾃定义弹窗效果 (不⽤处理,正常操作即可。)
步骤:
1、获取弹出框对象
alert = driver.switch_to.alert
alert.text 获取弹窗框文本
三种弹窗框,在获取对象的时候都一样
2、弹出框处理方法
alert.accept() 接受弹出框
alert.dismiss() 取消弹出框
确认框没有取消按钮,取消方法一样生效
"""
需求:打开注册A.html页面,完成以下操作:
1).点击 alert 按钮
2).关闭警告框
3).输入用户名:admin
"""
# 点击弹窗
driver.find_element(By.ID,"alerta").click()
sleep(2)
# 获取弹窗对象
el = driver.switch_to.alert
# 处理弹窗 同意/取消
# el.dismiss() # 取消
# print("弹出文本:",el.text)
el.accept() # 同意
sleep(2)
# 输入用户名
driver.find_element(By.CSS_SELECTOR,"#userA").send_keys("admin")
3、滚动条
所要操作的元素不在当前展示页,需要 滑动滚动条才能找到。
有些⻚⾯场景,必须滚动条拉倒最底下才做某事 。如:注册⻚⾯,阅读完需求,协议才能勾选,此时就必须拖动滚动条。
步骤:
1、定义Js字符串 js = "window.scrollTo(0,1000)"
2、执行Js字符串 driver.execute_script(js)
"""
需求:打开新浪官网页面,完成以下操作
1).暂停2s,控制滚动条滑动到页面最底部
2).暂停2s,点击返回顶部按钮
"""
driver.get('https://www.sina.com.cn/')
# js -> 向下滑动10000像素
# js_down = "window.scrollTo(0,10000)"
# 动态执⾏滑倒底部 向下滑动滚动条⾼度
# js(0,10000) 第⼀个0为⽔平滚动条
js_down = "window.scrollTo(0,document.body.scrollHeight)"
# 执⾏js⽅法
driver.execute_script(js_down)
sleep(2)
# js—> 向上
js_top = "window.scrollTo(0,0)"
driver.execute_script(js_top)
滚动条扩展 -- 动态滚动
滚动到页面底部 js = "window.scrollTo(0,document.body.scrollHeight)" 比如:新浪页面太长,在超过10000像素时动态滑动到最底部
鼠标操作
ActionChains鼠标类 :点击、右击、双击、 、拖拽等
步骤:
1、导包 from selenium.webdriver import ActionChains
2、实例化鼠标对象 action = ActionChains(driver)
3、调用鼠标方法:
action.move_to_element(element) 鼠标悬停
action.context_click(element) 鼠标右击
action.double_click(element) 鼠标双击
action.drag_and_drop(source, target) 鼠标拖拽
4、 执行鼠标操作 action.perform()
调用鼠标方法并不会去执行鼠标操作,必须调用perform才会执行
"""
需求:打开注册页面A,模拟鼠标悬停在‘注册’按钮上
"""
from selenium.webdriver import ActionChains
# 获取ActionChains对象
action = ActionChains(driver)
el = driver.find_element(By.CSS_SELECTOR,"button")
sleep(2)
# 调用悬停方法
action.move_to_element(el).perform()
# 需求:打开注册页面A,在用户名文本框上点击鼠标右键
# 获取ActionChains对象
action = ActionChains(driver)
username = driver.find_element(By.CSS_SELECTOR,"#userA")
# 鼠标右击
action.context_click(username).perform()
sleep(2)
"""
需求:打开注册A,输入用户名admin,暂停3秒钟后,双击鼠标左键,选中admin
"""
from selenium.webdriver import ActionChains
# 获取ActionChains对象
action = ActionChains(driver)
username = driver.find_element(By.CSS_SELECTOR,"#userA")
username.send_keys("admin")
sleep(3)
# 鼠标双击
action.double_click(username).perform()
# 鼠标拖拽方法
sleep(3)
# 获取ActionChains对象
action = ActionChains(driver)
div1 = driver.find_element(By.CSS_SELECTOR, "#div1")
div2 = driver.find_element(By.CSS_SELECTOR, "#div2")
action.drag_and_drop(div1, div2).perform()
元素等待----隐式等待和显示等待
元素等待概念:在等位元素时如未定位到,会在指定时间内一直等待的过程
代码执⾏过程中,第⼀次未找到元素,先不抛出异常。激活等待时间,在等待过程中如果找到元素 就执⾏
为什么有元素等待:
1、网络配置低
2、电脑配置低
3、服务器处理速度请求慢
由于⽹络或配置原因,导致元素未加载出来,⽽代码已执⾏,会触发异常。
元素类型类型 : 隐式等待、显示等待、强制等待
1、隐式等待
说明: 针对全部元素⽣效
⽅法: driver.implicitly_wait(timeout秒)
提示:在项⽬中,如果未封装⾃动化框架时,推荐使⽤。
定位元素时,如果能定位到元素则直接返回该元素,不触发等待;
如果不能定位到该元素,则间隔一段时间后再去定位元素;
如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常NoSuchElementException。
# 全局生效,所有元素第一次未找到触发 等待10秒
driver.implicitly_wait(10)
# 验证隐式等待
driver.find_element(By.CSS_SELECTOR,"#userAA")
2、显示等待
说明: 针对单个元素⽣效,可以修改查找频率和超时时间。
特点: 查找并返回元素
提示:在封装框架时,高手使用,灵活
定位 元素时,如果能定位到元素则直接返回该元素,不触发等待;
如果不能定位到该元素,则间隔一段时间后再去定位元素
如果在达到最大时长时还没有找到指定元素,则抛出超时异常 TimeoutException
步骤:
1、导包 from selenium.webdriver.support.wait import WebDriverWait
2、创建显示等待类对象 WebDriverWait(driver, timeout, poll_frequency=0.5)
3、调用utils方法 until(method):直到...时
4、element = WebDriverWait(driver,10,1).until(lambda x: x.find_element(By.CSS_SELECTOR,"#userAA"))
# 1、导包
from selenium.webdriver.support.wait import WebDriverWait
# 2、显示等待 -> 返回查找到的元素
el = WebDriverWait(driver,10,0.5).until(lambda x: x.find_element(By.CSS_SELECTOR,"#userAA"))
el.send_keys("admin")
3、强制等待
语法: sleep(10)
提示: 执⾏到这句必须等待10秒,不灵活。
time.sleep()影响运行效率
from time import sleep
sleep(10)
元素等待比较