学习网站:白月黑羽
python编辑工具vscode:插件
selenium安装:win+r 输入pip install selenium
自动化测试还需要一个浏览器驱动:chromedriver,可以官网下载: ChromeDriver - WebDriver for Chrome - Downloads
下面是编辑测试:
1. 导入库并创建一个“遥控器”wd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service=Service(r'D:\tools\chromedriver.exe'))
2. get方法打开一个网站
wd.get('https://www.baidu.com')
selenium定位元素的方法
定位单个元素:
定位一组元素:
1.根据HTML页面中id属性来选择元素
选择元素前需要导入一个库:上面这些方法在已经不建议使用了,而是另外一种写法,其实都是大同小异。
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建 WebDriver 对象
wd = webdriver.Chrome()
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://www.bing.com')
# 根据id选择元素,返回的就是该元素对应的WebElement对象
element = wd.find_element(By.ID, 'sb_form_q')
# 通过该 WebElement对象,就可以对页面元素进行操作了
# 比如输入字符串到 这个 输入框里
element.send_keys('csdn\n')
2,根据class_name来选择元素
通过 WebElement 对象的 text属性
可以获取该元素 在网页中的文本内容,所以下面的代码,可以打印出 element 对应 网页元素的文本
Selenium 的 Webdriver 对象 有个方法叫 implicitly_wait
,可以称之为 隐式等待
,或者 全局等待
。该方法接受一个参数, 用来指定 最大等待时长。
from selenium import webdriver
from selenium.webdriver.common.by import By
#创建一个webdriver对象
wd = webdriver.Chrome()
#设置最大等待时间:find_element时最长等待时间
wd.implicitly_wait(5)
#访问B站
wd.get('https://www.bilibili.com/')
#根据class_name来选择元素:选择的是一个输入框
element = wd.find_element(By.CLASS_NAME, 'nav-search-input')
#向输入框中输入‘考研’ ‘\n’相当于是回车的意思
element.send_keys('考研\n')
#搜索也可以这样:定位搜索图标+点击
search = wd.find_element(By.CLASS_NAME, 'nav-search-btn')
search.click()
3,根据tag名选择元素(选出来的可能会有多个)
我们可以通过指定 参数为 By.TAG_NAME
,选择所有的tag名为 div的元素,返回的是一个列表
4. 根据name值来定位元素:
和a标签有关的定位
link text定位:使用a标签对之间的文本信息做定位。——>find_element_by_link_text()(常用)
partial link text定位:使用a标签对之间的部分文本信息做定位。——find_element_by_partial_link_text() (少用)
xpath定位
这2个元素定位方法更强大xpath,css_select(几乎可以准确定位任何元素)更复杂(有门槛)根据元素的xpath路径来完成定位。需要懂xpath语法。——find_element_by_xpath(“xpath路径”)
css定位
根据元素的CSS选择器来完成定位。需要懂CSS选择器。—find_element_by_css_selector(“CSS选择器”)
获取元素的属性
通过wd.find_element对象的方法:get_attribute('class')来获取对象的属性值
element = wd.find_element(By.ID, 'input_name')
print(element.get_attribute('class'))
from selenium import webdriver
from selenium.webdriver.common.by import By
wd = webdriver.Chrome()
wd.implicitly_wait(10)
wd.get('https://www.bilibili.com/')
#CSS_SELECTOR 选择class属性:在前面加上一个‘.’
# element = wd.find_element(By.CSS_SELECTOR, '.nav-search-input')
# element.send_keys('考研\n')
elements = wd.find_elements(By.CSS_SELECTOR, '.channel-link')
for element in elements:
print(element.get_attribute('href'))
wd.quit()
获取整个元素对应的HTML信息
# 根据属性选择元素
element = wd.find_element(By.CSS_SELECTOR, '[href="http://www.miitbeian.gov.cn"]')
# 打印出元素对应的html
print(element.get_attribute('outerHTML'))
print(element.get_attribute('innerHTML'))
wd.quit()
CSS Selector选择web页面的元素
CSS是用来对web页面进行渲染的,因此必然涉及到web页面上某一元素的选择,比如页面某些内容显示效果,可以讲 CSS Selector 语法 天生就是浏览器用来选择元素的,selenium自然就可以使用它用在自动化中,去选择要操作的元素了。
选择单个元素的方法:
find_element(By.CSS_SELECTOR, CSS Selector参数)
选择多个元素的方法:返回一个列表
find_elements(By.CSS_SELECTOR, CSS Selector参数)
选择方法和之前通过ID,CLASS_NAME,TAG_NAME 是一样的
CSS_SELECTOR方法选择class:在1处那加个‘.’
#CSS_SELECTOR 选择class属性:在前面加上一个‘.’
element = wd.find_element(By.CSS_SELECTOR, '.nav-search-input' ) #----1
element.send_keys('考研\n')
elements = wd.find_elements(By.CSS_SELECTOR, '.channel-link')
for element in elements:
print(element.get_attribute('href'))
wd.quit()
CSS_SELECTOR方法选择ID:在前面加个‘#’
from selenium import webdriver
from selenium.webdriver.common.by import By
#创建一个webdriver对象
wd = webdriver.Chrome()
wd.implicitly_wait(10)
wd.get('https://www.bing.com')
#使用CSS_SELECTOR根据ID选择元素:在前面加个‘#’
element = wd.find_element(By.CSS_SELECTOR, '#sb_form_q')
element.send_keys('matepad11\n')
CSS_SELECTOR方法选择TAG名:直接在‘’中输入tag标签名字
elements = wd.find_elements(By.CSS_SELECTOR, 'div')
<a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a>
css 选择器支持通过任何属性来选择元素,语法是用一个方括号 []
。
比如要选择上面的a元素,就可以使用 [href="http://www.miitbeian.gov.cn"]
。
这个表达式的意思是,选择 属性href值为 http://www.miitbeian.gov.cn
的元素。
要选择a节点,里面的href属性包含了 miitbeian 字符串,就可以这样写
a[href*="miitbeian"]
要选择a节点,里面的href属性以 http 开头 ,就可以这样写
a[href^="http"]
要选择a节点,里面的href属性以 gov.cn 结尾 ,就可以这样写
a[href$="gov.cn"]
CSS 选择器 可以指定 选择的元素要 同时具有多个属性的限制,像这样
div[class=misc][ctype=gun]
CSS_SELECTOR可以使用次序筛选:父节点的第几个
span:nth-child(2) span元素并且是在父节点的第二个位置
p:nth-last-child(1) P元素并且是倒数第一个
里面可以是数字也可以是“odd”奇数;“even”偶数
***选择第一个span类型的元素: span:nth-of-type(1) span:nth-last-of-type(1)
#CSS_SELECTOR选择: nth-child(n)
from selenium import webdriver
from selenium.webdriver.common.by import By
#创建一个webdriver对象
wd = webdriver.Chrome()
wd.implicitly_wait(5)
#访问网站
wd.get('https://cdn2.byhy.net/files/selenium/sample1b.html')
spans = wd.find_elements(By.CSS_SELECTOR, 'span:nth-child(2)')
for span in spans:
print(span.get_attribute('innerHTML'))
wd.quit()
Frame窗口切换
一个HTML文档中可能内嵌其他的HTML文档,但是CSS_SELECTOR选择时只是针对当前的HTML文档,因此需要进行窗口的切换:
切入:wd.switch_to.frame(name or id)
切出:wd.switch_to.default_content()
from selenium import webdriver
from selenium.webdriver.common.by import By
wd = webdriver.Chrome()
wd.get('https://cdn2.byhy.net/files/selenium/sample2.html')
# 先根据name属性值 'innerFrame',切换到iframe中
wd.switch_to.frame('innerFrame')
# 根据 class name 选择元素,返回的是 一个列表
elements = wd.find_elements(By.CLASS_NAME, 'plant')
for element in elements:
print(element.text)
# 切换回 最外部的 HTML 中
wd.switch_to.default_content()
# 然后再 选择操作 外部的 HTML 中 的元素
wd.find_element_by_id('outerbutton').click()
wd.quit()
窗口的切换
from selenium import webdriver
from selenium.webdriver.common.by import By
wd = webdriver.Chrome()
wd.implicitly_wait(5)
wd.get('https://cdn2.byhy.net/files/selenium/sample3.html')
# 点击打开新窗口的链接
link = wd.find_element(By.TAG_NAME, "a")
link.click()
# wd.title属性是当前窗口的标题栏 文本
print(wd.title)
mainHandle = wd.current_window_handle
for handle in wd.window_handles:
wd.switch_to.window(handle)
if 'Bing' in wd.title:
break
print(wd.title)
wd.switch_to.window(mainHandle)
print(wd.title)
wd.quit()
选择框
常见的选择框包括: radio框、checkbox框、select框
radio框选择选项,直接用WebElement的click方法,模拟用户点击就可以了。
对checkbox进行选择,也是直接用 WebElement 的 click 方法,模拟用户点击选择。
需要注意的是,要选中checkbox的一个选项,必须 先获取当前该复选框的状态
,如果该选项已经勾选了,就不能再点击。否则反而会取消选择。
# 先把 已经选中的选项全部点击一下
elements = wd.find_elements(By.CSS_SELECTOR,
'#s_checkbox input[checked="checked"]')
for element in elements:
element.click()
select框 则是一个新的select标签,大家可以对照浏览器网页内容查看一下,对于Select 选择框, Selenium 专门提供了一个 select类 进行操作。
鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽:ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('https://www.baidu.com/')
from selenium.webdriver.common.action_chains import ActionChains
ac = ActionChains(driver)
# 鼠标移动到 元素上
ac.move_to_element(
driver.find_element(By.CSS_SELECTOR, '[name="tj_briicon"]')
).perform()
窗口冻结
setTimeout(function(){debugger}, 5000)
debugger可以冻结页面,settimeout是设定多长时间后单位ms
Alert 弹出框,目的就是显示通知信息,只需用户看完信息后,点击 OK(确定) 就可以了。
driver.switch_to.alert.accept()
driver.switch_to.alert.text 获取通知内容,字符串类型
driver.switch_to.alert.dismiss() 取消对话框
Prompt 弹出框 是需要用户输入一些信息,提交上去。
driver.switch_to.alert.send_keys()
# --- prompt ---
driver.find_element(By.ID, 'b3').click()
# 获取 alert 对象
alert = driver.switch_to.alert
# 打印 弹出框 提示信息
print(alert.text)
# 输入信息,并且点击 OK 按钮 提交
alert.send_keys('web自动化 - selenium')
alert.accept()
窗口的大小:
driver.get_window_size()
改变窗口大小
driver.set_window_size(x, y)
窗口标题+URL
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(4)
driver.get("https://www.163.com")
print(driver.title)
print(driver.current_url)
driver.quit()
截屏
使用 WebDriver 的 get_screenshot_as_file方法来截屏并保存为图片
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
# 打开网站
driver.get('https://www.baidu.com/')
# 截屏保存为图片文件
driver.get_screenshot_as_file('1.png')
#有一点不好,它不支持相对路径+文件名的方式,
Saves a screenshot of the current window to a PNG image file. Returns
False if there is any IOError, else returns True. Use full paths in
your filename.
手机模式
from selenium import webdriver
mobile_emulation = { "deviceName": "Nexus 5" }
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome( desired_capabilities = chrome_options.to_capabilities())
driver.get('http://www.baidu.com')
input()
driver.quit()
上传文件
网站页面上传文件的功能,是通过 type
属性 为 file
的 HTML input
元素实现的。
<input type="file" multiple="multiple">
# 先定位到上传文件的 input 元素
ele = wd.find_element(By.CSS_SELECTOR, 'input[type=file]')
# 再调用 WebElement 对象的 send_keys 方法
ele.send_keys(r'h:\g02.png')