前言
Selenium是一款用于web自动化的工具,支持多系统、多浏览器、多语言;以下是在学习selenium时的笔记。
目录
Selenium基础
准备
1.下载谷歌Chrome浏览器
2.在pycharm上下载selenium驱动包
3.下载与Chrome浏览器版本对应的chromedriver,并放到python的根目录下
一个简单的demo
unittest是Python单元测试框架,在web端UI自动化测试过程中,可以使用unitest框架。
下面是以打开度娘为例子,介绍下unitest:
import unittest
from time import sleep
from selenium import webdriver
# 编写一个python类,继承 unittest模块中的TestCase类,这就是一个测试类
class MyUnit(unittest.TestCase):
# 开始函数,环境的搭建,最先被调用的函数
def setUp(self):
# 打开浏览器,获取浏览器驱动对象
self.driver = webdriver.Chrome()
# 设置等待时间,隐式等待
self.driver.implicitly_wait(30)
# 最大化窗口
self.driver.maximize_window()
# 主机路径
self.baseUrl = 'http://www.baidu.com'
# 用例函数,函数名称前必须是test
def test_baidu(self):
# 打开链接
self.driver.get(self.baseUrl)
# 结束函数,环境的还原,最先被调用的函数
def tearDown(self):
# 关闭浏览器
sleep(3) # 关闭前,代码睡眠3秒钟
self.driver.quit()
if __name__ == '__main__':
# 执行测试 类中以 test 开头的测试用例
unittest.main
浏览器操作
获取浏览器对象,打开URL,刷新,最大化,返回标题,返回URL,截图,关闭浏览器
from selenium import webdriver
# 选择浏览器,获取浏览器对象
driver = webdriver.Chrome()
# 打开URL
driver.get("http://www.baidu.com")
# 刷新
driver.refresh()
# 最大化
driver.maximize_window()
# 返回当前页面标题
driver.title
# 返回当前页面的URL
driver.current_url
# 截图操作
driver.get_screenshot_as_file("Screenshots/1.png")
# 关闭浏览器 (退出并关闭所有关联的tab窗口)
driver.quit()
# 关闭浏览器 (关闭当前的tab窗口)
driver.close()
查找页面元素
可以通过ID查找单个元素,通过name、class、tag_name、link_text、partial_link_text、css、xpath;还可以查找多个元素。
'''
<html>
<body>
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100">
<input type="text" class="s_ipt" name="wd" id="kw1" maxlength="100">
<a id="title-content" class="title-content" href="https://www.baidu.com">百度一下</a>
</body>
</html>
'''
# 通过ID查找单个元素 (ID属性)
driver.find_element_by_id('kw')
# 通过name查找元素 (name属性)
driver.find_element_by_name('wd')
# 通过class查找元素 (class属性)
driver.find_element_by_class_name('s_ipt')
# 通过tagName查找元素 (元素名称)
driver.find_element_by_tag_name('a')
# 通过linkText查找元素 (链接文字)
driver.find_element_by_link_text('百度一下')
# 通过partialLinkText查找元素 (部分链接文字)
driver.find_element_by_partial_link_text('百度')
# 通过css查找元素 (需要学习css语法)
driver.find_element_by_css_selector('#kw') # id
driver.find_element_by_css_selector('.s_ipt') # class
driver.find_element_by_css_selector('input') # 标签名称
driver.find_element_by_css_selector('body>input') # 父子关系
driver.find_element_by_css_selector("[name='wd']") # 属性
# 通过Xpath查找元素 (需要学习Xpath语法)
driver.find_element_by_xpath('/html/body/a') # 通过绝对路径定位
driver.find_element_by_xpath('/html/body/input[1]') # [1]标注第1个标签
driver.find_element_by_xpath("input[@id='kw']") # 通过元素属性定位
driver.find_element_by_xpath("/html/body/input[@id='kw']") # 绝对路径与元素属性结合
# 查找多个元素
driver.find_elements_by_class_name('class')
xpath使用教程
css选择器使用教程
元素操作
一些常用且简单的元素操作,如:输入文本、清空输入框、单击、获取元素文本、获取元素属性值
from selenium import webdriver
# 选择浏览器,获取浏览器对象,打开URL,最大化
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
kw = driver.find_element_by_id('kw')
su = driver.find_element_by_id('su')
# 输入文本
kw.send_keys('萝卜')
# 清空输入框
kw.clear()
# 输入文本
kw.send_keys('黄瓜')
# 单击
su.click()
one = driver.find_element_by_xpath('//*[@id="u"]/a[1]')
# 获取元素的文本
print(one.text)
# 获取元素的属性值
print(one.get_attribute("href"))
# 关闭浏览器
driver.quit()
鼠标事件
鼠标事件的方法都在ActionChains类里,使用时,需要引用webdriver中的这个类;
常用的鼠标事件:悬停、右击、双击、拖动。
import time
from selenium import webdriver
# 引用鼠标操作事件类
from selenium.webdriver import ActionChains
# 选择浏览器,获取浏览器对象,打开URL,最大化
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
kw = driver.find_element_by_id('kw')
su = driver.find_element_by_id('su')
time.sleep(3)
# 鼠标悬停
ActionChains(driver).move_to_element(su).perform()
# 右击
ActionChains(driver).context_click(su)
# 双击
ActionChains(driver).double_click(su)
# 拖动 把su拖动到kw
ActionChains(driver).drag_and_drop(su,kw)
time.sleep(3)
# 关闭浏览器 (退出并关闭所有关联的tab窗口)
driver.quit()
键盘事件
键盘事件使用的是send_keys()方法;
还需要引入Keys模块;
常用的键盘事件如:全选、剪切、复制、粘贴、回车、回退(回退到上个页面)。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# 选择浏览器,获取浏览器对象,打开URL,最大化
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
# 获取输入框
kw = driver.find_element_by_id('kw')
# 输入
kw.send_keys('牙刷')
# 删除键(back space)
kw.send_keys(Keys.BACK_SPACE)
# 全选 (Ctrl+A)
kw.send_keys(Keys.CONTROL,'a')
# 剪切(Ctrl+X)
kw.send_keys(Keys.CONTROL,'x')
# 粘贴(Ctrl+V)
kw.send_keys(Keys.CONTROL,'v')
# 复制(Ctrl+C)
kw.send_keys(Keys.CONTROL,'c')
# 回车(Enter)
kw.send_keys(Keys.ENTER)
# 回退(Esc)
kw.send_keys(Keys.ESCAPE)
time.sleep(3)
# 关闭浏览器 (退出并关闭所有关联的tab窗口)
driver.quit()
元素等待
sleep休眠方法
指定等待时间,不管元素是否存在,使线程进入等待,可能使线程挂掉,慎用此方法
import time
# 休眠三秒
time.sleep(3)
selenium隐式等待
隐式等待作用于driver全局,可设置一个最长等待时间;
若元素没有出现,进入隐式等待;在设置时间范围内元素出现,继续执行代码;在设置时间结束元素没有出现,仍然继续执行代码。
# 设定隐式等待时间为15秒
driver.implicitly_wait(15)
selenium显式等待
设置一个最长等待时间;
如果在这个时间段内没有找到元素,则抛出异常。找到该元素,才执行后续代码。
显示等待和隐式等待可以同时使用,最长时间取两者最大值。
WebDriverWait(driver,10,poll_frequency=0.5).until(
expected_conditions.presence_of_element_located(By.ID,"input1")
)
driver:浏览器驱动
timeout:最长超时等待时间
poll_frequency:检测的时间间隔,默认为0.5s
ignore_exception:超时后抛出的异常信息,默认情况下抛 NoSuchElementException 异常
多层框架定位
frame或iframe中的元素无法被直接定位到,是因为创建了内连框架,通过切换框架,可定位到框架中的元素。
切换frame框架:使用webDriver对象的switch_to属性里的frame方法
切换到框架frame
driver.switch_to.frame(frame0)
切换回外层框架集frameset
driver.switch_to.default_content()
例子:
"""
<frameset cols="30%,*">
<frame src="left.html" />
<frame src="right.html" />
</frameset>
<a id="a1">这个是框架标签中left_frame</a>
<div id="div1">章节</div>
<a id="a2">这个是框架标签right_frame</a>
<h3>内容</h3>
"""
# 获取frameset和frame元素
frameset = driver.find_element_by_tag_name('frameset')
frame = driver.find_elements_by_tag_name("frame")
frame0 = frame[0]
frame1 = frame[1]
# 切换到frame0
driver.switch_to.frame(frame0)
# 可以对frame0中的元素操作
print(driver.find_element_by_id('a1').text)
# 切换回frameset
driver.switch_to.default_content()
# 切换到frame1
driver.switch_to.frame(frame1)
# 可以对frame1中的元素操作
print(driver.find_element_by_id('a2').text)
窗口定位
可以使用webdriver对象中的switch_to属性里面的window方法
# 返回当前会话中所有窗口的句柄
windows = driver.window_handles
# 将焦点切换到指定的窗口,括号中填写要切换到的窗口的名称或窗口句柄
driver.switch_to.window(windows[2])