一文搞懂浏览器自动化测试框架selenium!
1、selenium是什么?
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。(转自百度百科)
2、python中的selenium使用
代码链接:https://github.com/princewen/python3_crawl
先来看一段完整的的代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
#找到百度的输入框
input = browser.find_element_by_id('kw')
#在输入框中输入python
input.send_keys('Python')
#回车进行搜索
input.send_keys(Keys.ENTER)
#等待10s
wait = WebDriverWait(browser,10)
#直到contnet_left元素出现
wait.until(EC.presence_of_element_located((By.ID,'content_left')))
#打印当前url
print (browser.current_url)
#打印当前的cookie
print (browser.get_cookies())
#打印当前的源代码
print (browser.page_source)
finally:
browser.close()
在上面的代码中,我们先使用Chrome内核构造了一个浏览器,获取到了百度的链接,随后找到了百度输入框元素,在输入框中输入python并回车,相当于使用百度搜索python,使用显式等待页面内容出现,最后我们打印了url、cookie和页面源代码。
接下来我们将详细介绍selenium的功能。
2.1 访问页面
使用get方法请求一个页面
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print (browser.page_source)
browser.close()
2.2 查找元素
查找元素分为查找一个元素或者查找多个元素,可以使用通用的方法或者非通用方法,在通用方法中需要通过By的方式指定查找方式。查找方式可以通过id、class、name、xpath等形式。
#单个元素
#除了下面的方式外,还有其它方式
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element_by_id('q')
input_second = browser.find_element_by_css_selector('#q')
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print (input_first,input_second,input_third)
browser.close()
#通用方式
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element(By.Id,'q')
print (input_first)
browser.close()
#查找多个元素
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements_by_css_selector(('.service-bd li'))
lis_2 = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
#返回一个列表
print (lis)
print (lis_2)
browser.close()
2.3 元素交互操作
元素的交互操作,比如在文标框中输入文字、清除文本框中的文字,点击按钮等等。
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(1)
input.clear()
input.send_keys('iPad')
button = browser.find_element_by_class_name('btn-search')
button.click()
2.4 交互动作
交互动作使用ActionChains,这里的代码展示了把元素从一个位置拖动到另一个位置的代码。
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryul-api=dropable'
browser.get(url)
#切换到iframe
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source,target)
actions.perform()
2.5 执行javascript
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
browser.close()
2.6 获取元素属性
可以通过get_attribute方法得到元素属性,对于某些关键字,直接使用.就可以获得。
"""获取元素属性"""
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
logo = browser.find_element_by_id('zh-top-link-logo')
print (logo)
# 获取class
print (logo.get_attribute('class'))
input = browser.find_element_by_class_name('zu-top-add-question')
#获取文本
print (input.text)
#获取其他信息
print (input.id)
print (input.location)
print (input.tag_name)
print (input.size)
2.7 切换frame
页面之间frame的切换,需要注意的是在子frame中无法获得父frame的元素。
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryul-api=dropable'
browser.get(url)
#切换到iframe
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
try:
logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
print ('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print (logo)
print (logo.text)
2.8 等待
等待分为隐式等待和显式等待。在隐式等待中,只需要指定一个等待时间,当我们获取元素时,如果超过等待时间还没有获取到元素,会抛出异常。显示等待构造WebDriverWait对象,调用其until方法指定一个元素并制定相应的等待形式,如元素的加载,元素可点击等等,如果超过等待时间指定的元素没有呈现或者不可点击,那么就会抛出异常。
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
"""隐式等待"""
browser.implicitly_wait(10)
"""如果这个元素没有找到的话,会等待10s,如果还没有找到,就会抛出异常"""
logo = browser.find_element_by_id('zh-top-link-logo')
print (logo)
# 获取class
print (logo.get_attribute('class'))
browser.close()
"""显示等待"""
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser,10)
#参数是元组,还有其他一些等待条件
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))
browser.close()
2.9 前进后退
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('https://www.python.org')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
2.10 cookies操作
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print (browser.get_cookies())
browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})
print (browser.get_cookies())
browser.delete_all_cookies()
print (browser.get_cookies())
2.11 选项卡管理
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print (browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.zhihu.com/explore')
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
browser.close()
2.12 异常处理
from selenium.common.exceptions import NoSuchElementException,TimeoutException
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
except TimeoutException:
print ('TIme out')
try:
browser.find_element_by_id('hello')
except NoSuchElementException:
print ('NOT FOUND')
想了解更多? 那就赶紧来关注我们
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【go】剑指offer:3种方法寻找二进制1的个数
- 高并发技术
- Working with Errors in Go 1.13
- Hadoop技术(二)资源管理器YARN和分布式计算框架MapReduce
- CDH——Cloudera’s Distribution Including Apache Hadoop
- 【go】剑指offer:用26个英文字母组合表示列数
- Flink——运行在数据流上的有状态计算框架和处理引擎
- goland破解教程
- HTTP接口设计
- NSQ分布式消息基础入门
- 【golang】剑指offer 最大n位数
- Spark提交Jar任务警告: Initial job has not accepted any resources;
- Defer,Panic,and Recover
- Spark——底层操作RDD,基于内存处理数据的计算引擎
- Go 项目最佳实践