作为测试人员,需要做的就是自行编写自动化程序。
Python 有自己的库,Java 也有自己的库…
Selenium 环境的安装主要就是安装:客户端库和浏览器驱动。
上述情况是:idle 可以正常运行,而pychram 报错
解决办法:File->Settings ->Project Interpreter
添加完事,即可正常运行
下面是关于基础操作的代码介绍
from selenium import webdriver
#选择 浏览器驱动
wb = webdriver.Chrome(r'C:/python37/webdriver.exe')
#打开网页
wb.get('http://www.baidu.com')
#选择元素的方法
#根据Id 选择
element = wd.find_element_by_id('kw')
#根据 class 属性
element = wd.find_element_by_class_name('要找的单个class')
elements = wd.find_elements_by_class_name('要查找的所有class')
#取出符合条件的第一个元素
print(element.text) # 如果没有 报错
#取出列表中的每一个元素
for element in elements:
print(element.text) #如果没有,返回空列表
#通过该 WebElement对象,就可以对页面元素进行操作
element.send_keys('查找圆周率第100位')
#关闭浏览器
wb.close()
pass
关于selenium 升级之后,find_element 的写法需要更新
原始写法
wd.find_element_by_id('username').send_keys('bilibili')
wd.find_element_by_class_name('password').send_keys('sadqwaea')
wd.find_element_by_tag_name('input').send_keys('asdawew')
wd.find_element_by_css_selector('button[type=submit]').click()
Selenium4 find_element写法
#首先导入 By
from selenium.webdriver.common.by import By
wd.find_element(By.ID,'username').send_keys('bilibili')
wd.find_element(By.CLASS_NAME,'password').send_keys('ssadojo')
wd.find_element(By.TAG_NAME,'input').send_keys('sadawda')
wd.find_element(By.CSS_SELECTOR,'button[type=submit]').click()
调用元素WebElement对象 的Click() 方法
wb.find_element(By.ID,‘su’).click()
调用元素WebElement对象 的send_keys() 方法
wb = wb.find_element(By.ID,‘username’).send_keys(‘输入的内容’);
通过WebElement 对象的text属性,可以获取元素 展示在界面上的文本内容
element = wb.find_element_by_id(‘1’)
print(element.text)
print(element.get_attribute(‘id’)) # 获取到的就是 id 属性的值
要想获取整个元素对应的HTML 文本内容,可以使用element.get_attribute(‘outerHTML’)
如果只是想获取整个元素内部的HTML文本内容,可以使用element.get_attribute(‘innerHTML’)
对于input 输入框的元素,要获取里面的输入文本,用text属性是不行的,这个时候可以使用element.get_attribute(‘value’)
element = wb.find_element_by_id(‘inpute_name’)
print(element.get_attribute(‘value’))
通过WebElement 对象的text 属性,可以获取元素 展示在界面上的 文本内容
但是有些元素没有展示在界面上,这时候用 WebElement 的 text属性,获取文本内容,就会有问题
element.get_attribute(‘innerText’)
或者 element.get_attribute(‘textContent’)
主要是学习 Css selector 语法选择元素
find_element_by_css_select(CSS Select 参数)
find_elements_by_css_selector(CSS Select 参数)
# 通过 Css 选择器 ,打印目标元素
element = wd.find_element_css_select('.plant')
print(element.get_attribute('outerHTML'))
# 等待加载完毕
time.sleep(2)
# 选择所有的 span 标签内容,
elements = wb.find_elements_by_css_selector('span')
for element in elements:
print(element.get_attribute('outerHTML'))
# 包含 用* ; 以某个字符串开头 用^;以某个字符串结尾 $
# 选择a 里面href 属性包含了bilibili 字符串,就可以这样写
element = wb.find_element(By.CSS_SELECTOR,'a[href*="bilibili"]')
print(element.get_attribute('outerHTML'))
# href 属性以 www 字符串开头
element = wb.find_element(By.CSS_SELECTOR,'a[href^="www"]')
# href 属性以 com 字符串结尾
element = wb.find_element(By.CSS_SELECTOR,'a[href$="com"]')
Css Select 同样可以根据tag 名、id属性和class 属性来选择元素
# 选择所有tag 名为 div 的元素
element = wd.find_elements_by_css_selector('div')
等价于
element =wd.find_elements_by_tag_name('div')
Css 选择器 选择子元素和 后代元素
HTML中,元素内部可以包含 其他元素
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YSgrIgq5-1636975816358)(E:\测试工程师_自动化学习\Selenium\Css 选择器包含子元素.jpg)]
# 元素1> 元素2 元素2 必须是直接子元素
# 元素1 元素2 元素2 可以不是直接子元素
elements = wb.find_elements_by_css_selector('#container > div')
for element in elements:
print('--------------')
print(element.get_attribute('outerHTML'))
# 下面语句会查到 href 为 www.baidu.com的 位置
elements = wd.find_elements(By.CSS_SELECTOR,'[href="www.baidu.com"]')
# wd.find_elements(By.CSS_SELECTOR,'[href]')
# 打印出对应的内容行
for element in elements:
print('----------')
print(element.get_attribute('outerHTML'))
**********************************
wb.find_element(By.ID,'kw').send_keys('国王排名\n')
time.sleep(3)
elements = wb.find_element(By.ID,'1').find_elements(By.CSS_SELECTOR,'[href]')
for element in elements:
print(element.get_attribute('outerHTML'))
浏览器 自带查找功能,可以验证 Css_selector 写的是否正确
.plant , .animal
#id>span,#id>p
父元素的第n个节点 使用 nth-child 选择
比如 span:nth-child(2)
:nth-child(2) # 无论哪个标签,只要是第二个,就会被选中
#id:nth-last-child(1)
使用nth-of-type
span:nth-of-type(1) # 父元素的 第一个span
span:nth-lash-of-type(1) #父元素的 倒数第一个 span
如果要选择的父元素的偶数节点,使用 nth-child(even)
如果要选择的父元素的奇数节点,使用 nth-child(odd)
#id p:nth-of-type(even)
选择 h3 后面紧跟着的兄弟节点 span
可以 h3 + span 表示紧跟关系 是 +
如果选择后续所有兄弟节点
h3 ~ span
如果要操作被嵌入的html 文档中的元素,就必须切换操作范围 到被嵌入的文档中
切换
# 切换到 frame
wd.switch_to.frame(frame_reference)
# 举个例子
wd.switch_to.frame('frame1')
或者
wd.switch_to.frame('innerFrame')
# 如果iframe 既没有id 也没有name ,name可以用webelement 定位到frame
wd.switch_to.frame(wd.find_element_by_css_selector('iframe[src="1.html"]'))
# 如何退出 frame
wd.switch_to.default_content()
from selenium import webdriver
from selenium.webdriver.common.by import By
wd = webdriver.Chrome(r:'D:\Chromedriver.exe')
wd.implicitly_wait(10)
wd.get('http://www.baidu.com')
# 再输入框输入 国王排名
wd.find_element(By.ID,'kw').send_keys('国王排名\n')
#打开新窗口链接
#先定位到 这个区域
element = wb.find_element(By.ID,'1')
link = element.find_element_by_tag_name('a')
link.click()
# wd.title 属性 是当前窗口的标题栏 文本
print(wd.title) # 此时发现,焦点还是在原来的浏览器,所以需要切换到新窗口
# mainWindow 变量保存当前窗口的句柄
mainWindow = wd.current_window_handle
# 切换到新的窗口
for handle in wd.window_handles:
#先切换到该窗口
wd.switch_to.window(handle)
#得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if 'bilibili' in wd.title:
#如果是,那么这时候WebDriver 对象就是对应的该窗口,正好,跳出循环,
break
# 切换回原来的窗口
wd.switch_to.window(mainWindow)
猪
狗
猫
单选框
# 获取当前选中的元素
element = wb.find_element(By.CSS_SELECTOR,('#id input[checked = checked]'))
print('当前选中的是:'+element.get_attribute('value'))
# 点选 苹果 这个选项
wb.find_element(By.CSS_SETECTOR,'#id input[value="苹果"]').click()
李老师
王老师
张老师
上面就是 多选框 checkbox
# 先把 已经选中的选项 全部点击一下
elements = wb.find_elements(By.CSS_SELECTOR,'#id input[checked = "checked"]')
for element in elements:
element.click()
#再点击 所要选中的选项
wb.find_element(By.CSS_SELECTOR,'#id input[value="王老师"]').click()
radio 框及 checkedbox 框 都是input 元素,只是 type 类型不同
李老师 王老师 张老师上面的就是 select 单选下拉框
苹果 橘子 香蕉上面是多选
# Select 类 提供了如下的方法
# 根据 选项的 value 属性值,选择元素 select_by_value
# 根据 选项的 次序,选择元素 select_by_index
# 根据 选项的 可见文本,选择元素 select_by_visible_text
# 不选中状态
# deselect_by_value
# deselect_by_index
# deselect_by_visible_text
# deselect_all
# ===============================================
# Select 单选框
# 导入 Select 类
from selenium.webdriver.support.ui import Select
#创建 Select 对象
select = Select(wb.find_element(By.CSS_SELECTOR,'.s_single'))
# 通过Select 对象选中 王老师
select.select_by_visible_text("王老师")
# =============================================
# Select 多选框
# 导入Select 类
from selenium.webdriver.support.ui import Select
# 创建Select 对象
select = select(wb.find_element(By.ID,'ss_multi'))
# 清除所有 已经选中 的选项
select.deselect_all()
# 选择 李老师 和王老师
select.select_by_visible_text("李老师")
select.select_by_visible_text("王老师")
# ===============================================
比如 要实现 鼠标点击右键、 双击、移动鼠标到某个元素、鼠标拖拽等
可以通过 selenium 提供的 ActionChains 类来实现
# 实现 特殊的动作
# 移动鼠标到某个元素
#首先导入 ActionChains
from selenium.webdriver.common.action_chains import ActionChains
ac = ActionChains(wb)
# 鼠标移动到 元素上
ac.move_to_element(
wb.find_element(By.CSS_SELECTOR,'[name="tj_button"]')
).perform() # perform() 执行动作
在浏览器开发者界面 console 下
输入 下面 js 代码 5000 毫秒 即 5
setTimeout(function(){debugger},5000)
通知信息 Alert
确认信息框 confirm
需要用户输入信息的 Prompt
# Alert 如何模拟用户点击OK 按钮
driver.switch_to.alert.accept()
# 获取 Alert 弹出对话框中的文本
driver.switch_to.alert.text
------------------------------------------------
###### 示例代码 #######
from selenium import webdriver
wb = webdriver.Chrome()
wb.implicity_wait(5)
wb.get('http://www.baidu.com')
# --- alert ----
wb.find_element(By.ID,'b1').click()
# 打印 弹出对话框 提示信息
print(wb.switch_to.alert.text)
# 点击 OK 按钮
wb.switch_to.alert.accpet()
# confirm 需要用户确认的弹出框
# 点击 ok 按钮,还是用accept 方法
driver.switch_to.alert.accept()
# 点击 Cancel 按钮,可以用 dismiss 方法
driver.switch_to.alert.dismiss()
---------------------------------------------
########## 示例代码 ###########
from selenium import webdriver
wb = webdriver.Chrome()
wb.implicity_wait(5)
wb.get('http://www.baidu.com')
# ----- confirm -------
wb.find_elemnet(By.ID,'b2').click()
# 打印 弹出对话框 提示信息
print(wb.switch_to.alert.text)
# 点击 OK 按钮
wb.switch_to.alert.accept()
# 点击 Cancel 按钮
wb.switch_to.alert.dismiss()
# prompt 需要用户输入内容,并点击确定
# 可以调用如下方法
wb.switch_to.alert.send_keys()
--------------------------------------------------------
############## 示例代码 ###############
from selenium import webdriver
wb = webdriver.Chrome()
wb.implicity.wait(5)
wb.get('http://www.baidu.com')
#-----------prompt --------------
wb.find_element(By.ID,'b3').click()
# 获取alert 对象
alert = wb.switch_to.alert
# 打印 弹出框 提示信息
print(alert.text)
# 输入信息,并且点击 ok 按钮提交
alert.send_keys('web自动化 - selenium ')
alert.accept()
# 点击 Cancel 按钮 取消
wb.find_element(By.ID,'b3').click()
alert = wb.switch_to.alert
alert.dismiss()
# Xpath 选择器
elements = wb.find_element_by_xpath('/html/body/div')
# 打印出 body 中所有div
from element in elements:
print('------------')
print(element.get_attribute('outerHTML'))
# //div//p // 指的是 无论是不是直接子节点,都选择 / 直接子节点
# 通配符 *
# //div/*
根据id 属性选择
选择id 为west 的元素,可以这样
#选择id 属性为west 的元素
//*[@id='west']
#只要是id 属性就行
//*[@id]
根据class 属性选择
选择所有div元素中 class 为plant 的元素
#- --------------------------
# 选择所有div元素中 class 为plant 的元素
//div[@class='plant']
# 如果一个元素class 有很多个,例如
<p id="beijing" class= "capital huge-city">
北京
</p>
# 那么xpath 语法应该是
//p[@class="capital huge-city"]
# ---------------------------
# 选择 style 属性值 包含color 字符串的页面元素
//*[contains(@style,'color')]
# 选择 style 属性值 以color 开头的页面元素
//*[starts-with(@style,'color')]
# 选择style 属性值 以color 结尾的页面元素
//*[ends-with(@style,'color')]
# 要选择 p 类型的 第2个的子元素
//p[2]
# 等价于 CSS 中的
p:nth-of-type(2)
# 要选择父元素为 div 中的p 类型 第2 个子元素
//div/p[2]
# 要选择 倒数的话 倒数第二 是
//div/p[last()-1]
xpath 还可以选择子元素的次序范围
# 比如,要获取招聘网站前十个职位信息
# 选取option 类型第1 到2 个子元素
//option[position()<=2]
或者
//option[position()<3]
# 选取 后三个
//option[position()>=last()-2]
# 举个实例 multi_choice 类下 的前三个选项
//*[@class='multi_choice']/option[position()<=3]
######### 组选择 ###########
# 比如,要选择所有的option元素和 所有的h4 元素,可以使用
//option | //h4
# 等价于 CSS 选择器
option , h4
# 实例
# 要选择所有的class 为 single_choice 和 class 为 multi_choice 的元素
//*[@class='single_choice'] | //*[@class='multi_choice']
########## 兄弟节点 #############
# 选择 父节点 ,这是css 做不到的
# 比如 选择id 为china 的节点的父节点
//*[@id='china']/..
# 查爷爷
//*[@id='china']/../..
# 兄弟节点选择
# 后续节点 following-siling::
# 比如,要选择 class 为single_choice 的元素所有后续兄弟节点
//*[@class='single_choice']/following-sibling::*
# 要选择 class 为 china 的元素所有后续 select 节点
//*[@class='china']/following-sibling::select
# 前任节点 preceding-siling::
//*[@class='single_choice']/preceding-siling::*
找到id 为china 下的 所有P 标签
# 找到id 为 china的元素中所有的 p 标签
from selenium import webdriver
wb = webdriver.Chrome(r'C:\python37\chromedriver.exe')
wb.implicitly.wait(5)
wb.get('http://www.baidu.com')
# 先寻找 id 是china 的元素
china = wd.find_element(By.ID,'china')
# 再寻找 该元素内部 的p 元素 # XPATH 的坑 './/p'
elements = china.find_elements(By.XPATH,'.//p')
# .//p 这个点'.'指的是 China 内部找,如果不加点,找的就是所有的 p
# 打印结果
for element in elements:
print(element.get_attribute('outerHTML'))
配置 环境
- 首先需要查看 Edge 的版本 帮助和反馈 > 关于Microsoft Edge
- 下载对于版本的 浏览器驱动
# Edge 浏览器 自动化程序编写
from selenium import webdriver
# 指定 驱动地址
wb = webdriver.Edge(r'E:\msedgedriver.exe')
wb.get('http://www.baidu.com')
input()