4.元素操作
4.1.为社么要学习操作元素方法?
- 需要让脚本模拟用户给指定元素输入值
- 需要让脚本模拟人为删除元素的内容
- 需要让脚本模拟点击操作
4.2元素常用操作方法
- click() 单击元素
- send_keys() 模拟输入
- clear() 清除文本
4.3.案例
打开百度页面
输入hello
间隔三秒,修改为hello world
间隔三秒,点击确定
间隔三秒,关闭浏览器
from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('hello ')
sleep(2)
#修改输入内容---->清空操作
driver.find_element_by_id('kw').clear()
driver.find_element_by_id('kw').send_keys('hello world')
sleep(3)
driver.find_element_by_id('su').click()
sleep(3)
driver.quit()
5.操作浏览器
5.1操作浏览器常用方法
方法 | 说明 |
---|---|
1.maximize_window() | 最大化浏览器窗口–>模拟浏览器最大化窗口 |
2. set_window_size(width,height) | 设置浏览器窗口大小–>设置浏览器宽,高(像素点) |
3.set_window_position(x,y) | 设置浏览器位置–>设置浏览器位置 |
4.back() | 后退–>模拟浏览器后退按钮 |
5.forword() | 前进–>模拟浏览器前进按钮 |
6.refresh() | 刷新–>模拟浏览器F5刷新 |
7. close() | 关闭当前窗口–>模拟点击浏览器关闭按钮 |
8.quit() | 关闭浏览器驱动对象–>关闭所有程序启动的窗口 |
9.title | 获取页面title |
10.current_url | 获取当前页面url |
5.2案例(1,2,3,4,5)
from selenium import webdriver
from time import sleep
#浏览器最大化,位置,大小,前进,后退
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
#将浏览器最大化
driver.maximize_window()
#暂停2m
sleep(2)
#设置固定大小(300,200)
driver.set_window_size(300,200)
#暂停2m
sleep(2)
#移动浏览器窗口位置:x:320,y:150
driver.set_window_position(320,150)
#暂停2m
sleep(2)
#最大化
driver.maximize_window()
#点击“地图”访问网站,注意:要演示后退功能,必须先执行打开一个新的网站
driver.find_element_by_link_text('地图').click()
#暂停2m
sleep(10)
#执行后退--->百度页面
driver.back()
#暂停2m
sleep(10)
#执行前进--->地图页面。注意:前进必须放在后退操作后执行
driver.forward()
sleep(3)
driver.quit()
5.3案例(6.7.8.9.10)
from selenium import webdriver
from time import sleep
#浏览器title,quit,close,refresh,current_url
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
#刷新
driver.find_element_by_id('kw').send_keys('hello')
sleep(4)
driver.refresh()
#获取title
title=driver.title#字符串
print(title)
#获取当前url
current_url=driver.current_url#字符串
print(current_url)
#点击“地图”访问网站,注意:要演示后退功能,必须先执行打开一个新的网站
driver.find_element_by_link_text('地图').click()
sleep(10)
#close:关闭主窗口
driver.close()
#暂停2m
sleep(10)
#quit()
driver.quit()
6.获取元素信息
6.1为什么要学习获取元素信息的方法
- 如何获取元素的文本?
- 如何获取元素属性值?
- 如何让程序判断元素是否为可见状态?
6.2获取元素信息的常用方法
方法 | 说明 |
---|---|
size | 返回元素大小 |
*****text | 获取元素的文本 |
get_attribute(“xxx”) | 获取属性值,传递的参数为元素的属性名 |
is_displayed() | 判断元素是否可见 |
is_enabled() | 判断元素是否可用 |
is_selected() | 判断元素是否选中,用来检查复选框或单选按钮是否被选中 |
6.3.案例
需求:http://www.baidu.com,完成以下操作
获取输入框大小
获取页面第一个超链接的文本内容
获取页面上第一个超链接的地址
判断页面的span标签是否可见
判断页面中百度以下按钮是否可见
X :判断页面中复选框是否为选中状态
from selenium import webdriver
from time import sleep
#元素常用操作方法
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
#获取输入框大小
size=driver.find_element_by_id('kw').size
print('获取输入框大小为',size)
#获取页面第一个超链接的文本内容
text=driver.find_element_by_css_selector('a').text
print('页面第一个超链接的文本内容为',text)
#获取页面上第一个超链接的地址 get_attribute('href')
attribute=driver.find_element_by_css_selector('a').get_attribute('href')
print('页面上第一个超链接的地址为',attribute)
#判断页面的span标签是否可见
display=driver.find_element_by_css_selector('span').is_displayed()
print('页面的span标签是否可见',display)
#判断页面中百度以下按钮是否可见
enable=driver.find_element_by_id('su').is_enabled()
print('页面中百度以下按钮是否可见',enable)
#X :判断页面中复选框是否为选中状态
#select=driver.find_element_by_css_selector('').is_selected()
#暂停2m
sleep(10)
#quit()
driver.quit()
输出:
获取输入框大小为 {‘height’: 44, ‘width’: 548}
页面第一个超链接的文本内容为
页面上第一个超链接的地址为 https://www.baidu.com/
页面的span标签是否可见 True
页面中百度以下按钮是否可见 True
7.鼠标和键盘操作
7.1鼠标操作:点击,右击,双击,悬停,拖拽。
7.2为什么要用鼠标操作?
web产品中存在丰富的鼠标交互方式,作为一个web自动化测试框架,需要应对这些鼠标操作的应用场景
7.3鼠标常见操作方法
selenium中将鼠标操作的方法封装在ActionChains中
需实例化对象:action=ActionChains(driver)
方法 | 说明 |
---|---|
1.context_click(element) | 右击---->模拟鼠标右键点击效果 |
2.double_click(element) | 双击 |
3.drag_and_drop(source,target) | 拖动 |
4.move_to_eleement(eleement) | 悬停 |
5.perform() | 执行—>此方法用来执行以上所有鼠标操作,不然不能够实现 |
7.4.案例 1.2.4.5
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
#mouse
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
#实例化,并获取ActionChains类
action=ActionChains(driver)
#定位文本框 ,右击 --->粘贴
#获取文本框元素
id=driver.find_element_by_id('kw')
#右击
action.context_click(id).perform()
sleep(10)
#双击‘文本框’--->选中内容
driver.find_element_by_id('kw').send_keys("hello")
action.double_click(id).perform()
sleep(10)
#悬停 移动到‘百度一下’按钮上,颜色变为蓝色
action.move_to_element(driver.find_element_by_id('su')).perform()
#拖拽 action.click_and_hold()
sleep(10)
#quit()
driver.quit()
注意:定位文本框 ,右击 —>粘贴内容只能用于firefox,ie浏览器,不能用于chrome浏览器
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
#mouse 右击扩展
#定位文本框 ,右击 --->粘贴内容只能用于firefox,ie浏览器,不能用于chrome浏览器
driver=webdriver.Firefox()
driver.get('http://www.baidu.com')
#实例化,并获取ActionChains类
action=ActionChains(driver)
#定位文本框 ,右击 --->粘贴
#获取文本框元素
id=driver.find_element_by_id('kw')
#点击右键
action.context_click(id).perform()
#发送p,快捷菜单(粘贴)
id.send_keys('p')
sleep(10)
sleep(10)
#quit()
driver.quit()
7.5案例 3拖拽
7.6键盘操作:‘
selenium中将键盘的按键都封装在keys中
导包:from selenium.webdriver.common.keys import keys
7.7常见的键盘操作
方法 | 说明 |
---|---|
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) |
7.8案例
打开百度页面
输入12345,暂停3m,删除5;
全选输入内容,暂停3m;
复制输入内容,暂停3m;
清空,暂停3m,粘贴至输入框
from selenium import webdriver
from time import sleep
#键盘操作
#定位文本框 ,右击 --->粘贴内容只能用于firefox,ie浏览器,不能用于chrome浏览器
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
#输入12345,暂停3m,删除5;
driver1=driver.find_element_by_id('kw')
driver1.send_keys('12345')
sleep(3)
driver1.send_keys(Keys.BACK_SPACE)
sleep(5)
#全选输入内容,暂停3m;ctrl+A
driver1.send_keys(Keys.CONTROL,'a')
sleep(3)
#复制输入内容,暂停3m; ctrl+c
driver1.send_keys(Keys.CONTROL,'c')
sleep(3)
#清空,暂停3m,粘贴至输入框 ctrl+v
driver1.clear()
sleep(5)
driver1.send_keys(Keys.CONTROL,'v')
sleep(3)
#quit()
driver.quit()
8.元素等待
8.1.为什么要设置等待?
- 网络速度低
- 电脑配置低
- 服务器处理请求慢
8.2.什么是元素等待?
在定位页面元素时,会在指定时间内一直等待的过程
8.3元素等待类型
1.隐式等待
2.显式等待:只针对单个元素有效
8.4隐式等待
定位元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长还没有找到指定元素,则抛出元素 不存在的异常 NoSuchElementException。
8.4.1 实现方式
方法:driver.implicitly_wait(timeout)(timeout:为等待最大时长,单位:秒)一般设置30
说明:该等待为全局变量(只需要设置一次,就会作用于所有元素)
所有元素生效
一般情况下为前置必写代码
8.4.2案例
打开百度王雅网页,使用该等待定位输入框,如果元素存在,就输入12345
from selenium import webdriver
from time import sleep
#打开百度王雅网页,使用该等待定位输入框,如果元素存在,就输入12345
"""
给一个错误id,如果直接抛出异常,说明等待失效,定位失败。如果在设置指定时间外抛出异常,说明等待生效
"""
driver=webdriver.Chrome()
#设置隐式等待
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
driver1=driver.find_element_by_id('k')
sleep(5)
driver.quit()
8.5.显式等待
定位元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长还没有找到指定元素,则抛出元素 不存在的异常 TimeoutException。
selenium中封装在WebDriverWait中
8.5.1.实现方式
-
导包 等待类 from selenium.webdriver.support.wait import WebDriverWait
-
WebDriverWait(driver,timeout,poll_frequency=0.5)
1).driver:浏览器对象
2).timeout:超时时长。单位:秒
3)poll_frequency:检测间隔时间。默认0.5秒 -
调用方法:until(method):直到 … 时
1).method:函数名称,该函数用来实现对元素的定位
2).一般使用匿名函数来实现,lambda x:x.find_element_by_id(‘kw’) -
element=WebDriverWait(driver,10,1).until(lambda x:x.find_element_by_id(‘kw’))
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
#打开百度网页,使用该等待定位输入框,如果元素存在,就输入12345
"""
给一个错误id,如果直接抛出异常,说明等待失效,定位失败。如果在设置指定时间外抛出异常,说明等待生效
设置显式等待
步骤:
1. 导包 等待类 from selenium.webdriver.support.wait import WebDriverWait
2. WebDriverWait(driver,timeout,poll_frequency=0.5)
1).driver:浏览器对象
2).timeout:超时时长。单位:秒
3)poll_frequency:检测间隔时间。默认0.5秒
3. 调用方法:until(method):直到 .. 时
1).method:函数名称,该函数用来实现对元素的定位
2).一般使用匿名函数来实现,lambda x:x.find_element_by_id('kw')
4. element=WebDriverWait(driver,10,1).until(lambda x:x.find_element_by_id('kw'))
"""
driver=webdriver.Chrome()
#设置显式等待
driver.get('http://www.baidu.com')
#调用until返回的一定是一个元素
input=WebDriverWait(driver,timeout=5,poll_frequency=0.5).until(lambda x:x.find_element_by_id('k'))
#输入值 注意:此时input还不是元素,只有代码运行起来才会是元素
input.send_keys("12345")
sleep(5)
driver.quit()
send_keys()扩展
上传文件操作:
#错误实现
driver.find_element_by_id(’’).click()
#正确实现
driver.find_element_by_id(’’).send_keys(‘需上传文件的路径’)