Selenium是一个用于Web应用程序测试的工具。
Selenium WebDriver 原理:
Selenium Client Library:
Selenium自动化测试人员可以使用Java、Ruby、Python、C#等语言,利用它们提供的库来编写脚本。
JSON Wire Protocol Over HTTP Client:
JSON Wire Protocol是在HTTP服务器之间传输信息的REST风格的API。每个浏览器驱动程序(如FirefoxDriver、ChromeDriver等)都有它们各自的HTTP服务器。
Browser Drivers:
不同的浏览器都包含一个单独的浏览器驱动程序。浏览器驱动程序与相应的浏览器通信。当浏览器驱动程序接收到任何指令时,将在相应的浏览器中执行,响应信息将以HTTP的形式返回。
Browsers:
Selenium支持多种浏览器,如Firefox、Chrome、IE、Safari等。
(如果进不去谷歌商店)淘宝镜像 -- chromedriver -- 下载的版本要和浏览器的版本相匹配
1.配置到环境变量path中
2.移动放到代码里面
selemium的基本使用
from selenium import webdriver
使用selenium中webdriver的这样一个模块
webdriver -- 获取浏览器的对象
# 入门案例
from selenium import webdriver
import time
# webdriver-获取浏览器的对象
driver = webdriver.Chrome("chromedriver.exe")
# 准备一个网址
url = "https://www.baidu.com/"
driver.get(url)
time.sleep(5)
# 回收资源
driver.quit()
获取元素的方式
- id : find_element_by_id
- name : find_element_by_name
- class_name : find_element_by_class_name
- tag_name :find_element_by_tag_name
# 查找元素(标签,标记,节点) 通过id
driver.find_element_by_id("kw").send_keys("美女")
driver.find_element_by_id("su").click()
# 通过name查找元素
driver.find_element_by_name("wd").send_keys("帅哥")
driver.find_element_by_name("su").click() # 百度一下没有name,无法用name查找
driver.find_element_by_id("su").click()
# 通过class name 查找
driver.find_element_by_class_name("s_ipt").send_keys("美女")
driver.find_element_by_id("su").click()
用超链接(a标签):link_text,partial_link_text(部分定位)
# 定位a标签 -- link_test,partial_link_test(部分定位)
driver.find_element_by_link_text("hao123").click()
driver.find_element_by_partial_link_text("hao12").click()
获取元素的方式-css选择器
# 通过CSS选择器的方式定位
driver.find_element_by_css_selector("#kw").send_keys("美女") #id前缀是#
driver.find_element_by_css_selector(".s_ipt").send_keys("美女") #class name就是.前缀了
driver.find_element_by_css_selector("[name = wd]").send_keys("美女")
driver.find_element_by_css_selector("[value = 百度一下]").click()
获取元素的方式-xpath
xpath = xml path
- 通过Chrome的调试工具,获得特定元素的xpath
- 修改得到的xpath表达式
- 通过 chrome的 xpath helper 扩展插件 匹配查看
# 通过xpath - xml path ml-标记语言
# xml- extensive language 可拓展标记语言 html- 超文本标记语言
driver.find_element_by_xpath("//*[@id='sw']").send_keys("美女")
driver.find_element_by_xpath("//*[@id='su']").click()
推荐使用Chrom插件XPath Helper,用该插件预览xpath所提取的内容
打开和关闭xpath helper的快捷键都是:ctrl + shift + x
打开之后页面上方有一个黑色的窗体,左边显示query,右边显示result
按住ctrl + shift ,然后移动鼠标就可以选择页面上的元素,还是非常方便的
被选中的元素会显示不同的颜色,query窗口中显示的就是xpath的值,选完以后放开ctrl 和shift键就可以了。
xpath helper除了可以获取页面元素的xpath地址,也可以验证用户自己写的xpath地址是否正确。query窗口可以手动输入和修改xpath地址。
如何判断输入的地址是正确的呢:
1、result窗口有显示对应的内容,而不是null
2、页面中对应的元素会变成黄色
复合以上两点,说明xpath写对了。
元素的其他操作
-
元素操作
- clear() 清除文本
- send_keys() 模拟输入
- click() 单击元素
-
元素属性获取
-
size
返回元素大小
-
text
获取元素的文本
-
get_attribute()
获取属性值
-
is_display()
判断元素是否可见
-
5. is_enabled()
判断元素是否可用
# 元素操作
from selenium import webdriver
import time
# webdriver-获取浏览器的对象
driver = webdriver.Chrome("chromedriver.exe")
# 准备一个网址
# https://www.baidu.com/
url = "https://www.baidu.com/"
driver.get(url)
driver.find_element_by_id("kw").send_keys("python")
time.sleep(3)
# 清除输入的文字
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("美女")
driver.find_element_by_id("su").click()
# 打印元素的大小
print(driver.find_element_by_id("kw").size)
print(driver.find_element_by_id("kw").text)
print(driver.find_element_by_id("kw").is_enabled())
print(driver.find_element_by_id("kw").is_displayed())
print(driver.find_element_by_xpath("//*[text() = '新闻']").get_attribute("href"))
time.sleep(5)
# 回收资源
driver.quit()
浏览器的其他操作
-
浏览器操作(方法)
- maximize_window() 最大化浏览器
- set_window_size(width,height) 设置浏览器宽、高(像素点)
- set_window_position(x,y) 设置浏览器位置,浏览器左上角相对于屏幕左上角位置
- back() 后退
- forward() 前进
- refresh() 刷新
- close() 关闭当前页面
- quit() 关闭浏览器
-
浏览器信息(属性)
- title 获取页面title
- current_url 获取当前页面URL
# 最大化浏览器
driver.maximize_window()
# 设置浏览器的大小 1920*1080
driver.set_window_size(800,600)
# 设置浏览器的位置
driver.set_window_position(200,200)
# 浏览器后退
driver.back()
time.sleep(2)
# 浏览器前进
driver.forward()
time.sleep(2)
# 刷新浏览器
driver.refresh()
time.sleep(2)
# 关闭当前页面
driver.close()
time.sleep(5)
# 关闭浏览器
driver.quit()
print(driver.title)
print(driver.current_url)
完整代码:
# 浏览器的操作
from selenium import webdriver
import time
# webdriver-获取浏览器的对象
driver = webdriver.Chrome("chromedriver.exe")
# 准备一个网址
# https://www.baidu.com/
url = "https://www.baidu.com/"
driver.get(url)
# 最大化浏览器
driver.maximize_window()
# 设置浏览器的大小 1920*1080
# driver.set_window_size(800,600)
# 设置浏览器的位置
# driver.set_window_position(200,200)
print(driver.title)
print(driver.current_url)
driver.find_element_by_id("kw").send_keys("美女")
driver.find_element_by_id("su").click()
time.sleep(2)
print(driver.title)
print(driver.current_url)
# 浏览器后退
driver.back()
time.sleep(2)
# 浏览器前进
driver.forward()
time.sleep(2)
# 刷新浏览器
driver.refresh()
time.sleep(2)
print(driver.title)
print(driver.current_url)
driver.back()
driver.find_element_by_xpath("//*[text() = 'hao123']").click()
time.sleep(2)
# 关闭当前页面
driver.close()
time.sleep(5)
# 关闭浏览器
driver.quit()
等待
页面加载时间比代码执行时间慢,在翻页的时候或者加载新页面的时候,需要进行页面等待。不一定网页打开,所有的元素都在页面中了。 如果马上去找,可能出错。
强制等待:
time.sleep(sec)
1. 显式等待
1.导包
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 2.显示等待:--导包
# 等待某个元素加载完成,每隔0.5s去检查一次,最多等待5s时间
WebDriverWait(driver,5).until(EC.presence_of_element_located(By.ID,"1"))
- 每隔一定时间不断尝试查找元素
- 找到了就返回
- 如果超过指定时间还没找到就报错
注意
- 此方法知道即可,相对麻烦
- 后面会用隐式等待代替
2. 隐式等待
# 3.隐式等待:
driver.implicitly_wait(5)
driver.find_element_by_id("1").click()