Selenium浏览器⾃动化测试框架
selenium简介
介绍
Selenium [1] 是⼀个⽤于Web应⽤程序测试的⼯具。Selenium测试直接运⾏在浏览器中,就像真正的⽤户在操作⼀样。⽀持的浏览器包括IE(7, 8, 9, 10,
11),,Safari,Google Chrome,Opera等。这个⼯具的主要功能包括:测试与浏览器的兼容性——测试你的应⽤程序看是否能够很好得⼯作在不同浏览器和操作系统之上。
测试系统功能——创建回归测试检验软件功能和⽤户需求。⽀持⾃动录制动作和⾃动⽣成 .Net、Java、Perl等不同语⾔的测试脚本。
功能
框架底层使⽤JavaScript模拟真实⽤户对浏览器进⾏操作。测试脚本执⾏时,浏览器⾃动按照脚本代码做出点击,输⼊,打开,验证等操作,就像真实⽤户所做的⼀样,从
终端⽤户的⾓度测试应⽤程序。
使浏览器兼容性测试⾃动化成为可能,尽管在不同的浏览器上依然有细微的差别。
使⽤简单,可使⽤Java,Python等多种语⾔编写⽤例脚本。
优势
Selenium 测试直接在浏览器中运⾏,就像真实⽤户所做的⼀样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Chrome和 Firefox 中运⾏。
其他测试⼯具都不能覆盖如此多的平台。使⽤ Selenium 和在浏览器中运⾏测试还有很多其他好处。
下⾯是主要的两⼤好处:
通过编写模仿⽤户操作的 Selenium 测试脚本,可以从终端⽤户的⾓度来测试应⽤程序。通过在不同浏览器中运⾏测试,更容易发现浏览器的不兼容性。Selenium 的核⼼,也
称browser bot,是⽤ JavaScript 编写的。这使得测试脚本可以在受⽀持的浏览器中运⾏。browser bot 负责执⾏从测试脚本接收到的命令,测试脚本要么是⽤ HTML 的表布局编
写的,要么是使⽤⼀种受⽀持的编程语⾔编写的。
官⽅⽂档:
chromedriver下载:leapis/index.html
chromedriver与chrome的对应关系表:
基本使⽤
安装: pip install selenium
from selenium import webdriver
browser = webdriver.Chrome(executable_path='') # 声明⼀个浏览器对象指定使⽤路径
<("www.baidu") # 打开Chrome
input = browser.find_element_by_id("kw") # 通过id定位到input框
input.send_keys("python") # 在输⼊框内输⼊python
print(browser.current_url) # 打印url
_cookies()) # 打印Cookies
print(browser.page_source) # 打印⽹页源代码
browser.close() # 关闭浏览器
获取单节点
from selenium import webdriver
browser = webdriver.Chrome()
<("www.taobao")
# 到搜索框
input_id = browser.find_element_by_id("q") # 通过id
input_name = browser.find_element_by_name("q") # 通过name属性值
input_css = browser.find_element_by_css_selector("#q") # 根据css选择器
input_xpath = browser.find_element_by_xpath('//*[@id="q"]') # 根据xpath
print(input_id,input_name,input_css,input_xpath)
browser.close()
"""
<webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>
<webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>
<webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>
<webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>
"""
# 其他获取单个节点⽅法
"""
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
"""
# 通过⽅法
# find_element(By.ID,"q") # 参数为查⽅式和值
获取多节点
from selenium import webdriver
browser = webdriver.Chrome()
<("www.taobao")
lis = browser.find_elements_by_css_selector(".service-bd li") # 注意是elements多个s
print(lis) # 输出为列表
"""
[<webelement.WebElement (session="588f61b0d90f7bf199d3f0ede6f9fb99", element="454d656c-1730-410e-891e-210bfdf0d248")>, <webelement.WebElement (session="588f61b0d90f7bf1 """
# 其他获取多个节点⽅法
"""
find_elements_by_id("q")
find_elements_by_name("q")
find_elements_by_css_selector("#q")
find_elements_by_xpath('//*[@id="q"]')
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
"""
# 通过⽅法
# find_elements(By.CSS_SELECTOR,".service-bd li") # 参数为查⽅式和值
节点交互
import time
from selenium import webdriver
browser = webdriver.Chrome()
<("www.taobao")
"""
selenium可以驱动浏览器来执⾏⼀些动作:
输⼊⽂字⽤send_keys()
清空⽂字⽤clear()
点击按钮⽤click()
"""
input = browser.find_element_by_id("q")
input.send_keys("iPhone") #在搜索框输⼊iPhone
input.clear() # 清空搜索框的⽂字
time.sleep(2)
input.send_keys("iPad") # 在搜索框输⼊iPad
button = browser.find_element_by_class_name("btn-search") # 获取点击按钮
button.click() # 点击搜索
动作链
from selenium import webdriver
from selenium.webdriver import ActionChains # 引⼊动作链
browser = webdriver.Chrome()
url = "www.runoob/try/try.php?filename=jqueryui-api-droppable"
<(url)
browser.switch_to.frame("iframeResult") # 切换到元素所在的frame[框架]
"""
可以传⼊id、name、index以及selenium的WebElement对象,index从0开始
"""
source = browser.find_element_by_css_selector("#draggable") # 到被拖拽对象
target = browser.find_element_by_css_selector("#droppable") # 到⽬标
actions = ActionChains(browser) # 声明actions对象
actions.drag_and_drop(source,target) # 拖拽元素的起点和终点
actions.perform() # 执⾏动作
action.click_and_hold() # 点击且长按,更多⽅法查看官⽅⽂档
执⾏JavaScript代码
from selenium import webdriver
browser = webdriver.Chrome()
url = "www.zhihu/explore"
<(url)
获取节点信息
from selenium import webdriver
browser = webdriver.Chrome()
url = "www.zhihu/explore"
<(url)
"""
WebElement常⽤属性:
get_attribute 获取属性值
text 获取⽂本值
id 获取节点id
location 获取节点在页⾯中的相对位置
tag_name 获取标签名称
size 获取节点⼤⼩(宽和⾼)
"""
# 获取属性
logo = browser.find_element_by_id("zh-top-link-logo") # 获取logo节点
print(logo) # 返回值为WebElement对象
logo_class = _attribute("class") # 获取zh-top-link-logo节点的class属性值
print(logo_class)
# 获取⽂本值
text_Ele = browser.find_element_by_css_selector(".question_link") # 通过css选择器获取⽂本内容所在的标签text = # 取出标签内的⽂本内容
print(text)
# 获取ID 位置标签名和⼤⼩
test = browser.find_element_by_class_name("zu-top-add-question")
print(test.id) # 0bfe7ae6-ebd9-499a-8f4e-35ae34776687
print(test.location) # {'x': 759, 'y': 7}
print(test.tag_name) # button
print(test.size) # {'height': 32, 'width': 66}
切换frame
from selenium import webdriver
browser = webdriver.Chrome()
url = "www.runoob/try/try.php?filename=jqueryui-api-droppable"
<(url)
"""
⽹页中有⼀种节点叫做iframe,也就是⼦Frame,相当于页⾯的⼦页⾯,
他的结构和外部⽹页的结构完全⼀致。
selenium打开页⾯后,他默认是在⽗级Frame⾥⾯操作,
⽽此时如果页⾯中还有⼦Frame,他是不能获取到⼦Frame⾥⾯的节点的,
这时候就需要使⽤switch_to.frame()⽅法来切换Frame。
"""
browser.switch_to.frame("iframeResult")
logo = browser.find_elements_by_class_name("logo")
print(logo)
# [<webelement.WebElement (session="1ccb11403013c749ce9fceda50a00975", element="88e5924e-d655-44c3-a905-8af1947b9d86")>]延时等待
---------------------------隐式等待-------------------------
from selenium import webdriver
browser = webdriver.Chrome()
# 隐式等待
browser.implicitly_wait(2) # 设定等待时间
url = "www.zhihu/explore"
<(url)
input = browser.find_element_by_class_name("aaa")
print(input)
# 报错信息
"""
raise exception_class(message, screen, stacktrace)
"""
"""
如果selenium没有在DOM中到节点,将继续等待,超出设定事件后,则抛出不到节点的异常。
当查节点⽽节点并没有⽴即出现的时候,隐式等待将等待⼀段时间在查DOM,默认时间是0
"""
--------------------------显式等待------------------------
# 显⽰等待
from selenium import webdriver
from selenium.webdrivermon.by import By
from selenium.webdriver.support.ui import WebDriverWaitselenium获取cookie
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
<("www.taobao/")
wait = WebDriverWait(browser,2)
input = wait.until(EC.presence_of_element_located((By.ID,"q")))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn-search")))
print(input,button)
# 等待条件
# EC.presence_of_element_located 节点出现
# EC.element_to_be_clickable 可点击
# 更多等待条件查看260页
"""
引⼊WebDriverWait对象指定最长等待时间,调⽤它的until⽅法,
传⼊要等待的条件expected_conditions,⽐如这⾥传⼊例如presence_of_element_located
这个条件,代表节点出现的意思,其参数是节点的定位元组,也就是ID为q的搜索框。
这样可以做到的效果就是,在10秒内如果ID为q的节点(即搜索框)成功加载出来,就返回该节点,
如果10秒还没有加载出来,就抛出异常。
"""
"""
异常:
TimeoutException
"""
"""
指定要查的节点,然后指定⼀个最长等待时间,如果在规定时间内加载出来了这个节点,
就返回查的节点,如果到了规定时间依然没有加载出该节点,则抛出【超时】异常
"""
前进和后退
import time
from selenium import webdriver
browser = webdriver.Chrome()
<("www.baidu")
<("www.taobao")
<("www.jd")
browser.back() # 后退
time.sleep(2)
browser.forward() # 前进
browser.close() # 关闭浏览器
# 连续访问三个页⾯
cookies
from selenium import webdriver
browser = webdriver.Chrome()
<("www.zhihu/explore")
cookies = _cookies() # 获取cookies
print(cookies)
browser.add_cookie({"name":"name","domain":"www.zhihu","vlue":"germey"})
browser.delete_all_cookies() # 删除所有cookies
选项卡管理
import time
from selenium import webdriver
browser = webdriver.Chrome()
<("www.baidu")
print(browser.window_handles)
# ['CDwindow-7106D94FF002752ADF198B986343E31D', 'CDwindow-B669BA9559DBB78D8D6EC9C5AA699C40']
browser.switch_to.window(browser.window_handles[1])
<("www.taobao")
time.sleep(1)
browser.switch_to.window(browser.window_handles[0])
<("jd")
"""
1、打开百度⽹页
2、新开⼀个选项卡,调⽤execute_script()⽅法传⼊JavaScript语法window.open()
3、切换到新打开的选项卡,调⽤window_handles属性获取当前开启的所有选项卡,返回的是选项卡的代号列表,
要想切换选项卡只需要调⽤switch_to.window()⽅法,这⾥我们将第⼆个选项卡代号传⼊,
即跳转到第⼆个选项卡,在第⼆个选项卡⾥打开新页⾯www.taobao,然后切换回第⼀个选项卡打开jd页⾯"""
异常处理
from selenium import webdriver
browser = webdriver.Chrome()
<("www.baidu")
try:
browser.find_element_by_id("hello")
except Exception as e:
print(e) # 打印错误信息 Exception捕获所有错误信息赋给e
finally:
browser.close()
"""
在使⽤selenium的过程中,难免遇到⼀些异常,例如超时、节点未到错误,
⼀旦出现此类错误,程序便不会在继续运⾏了,这⾥我们使⽤try except语句来捕获各种异常
"""
选项卡切换
import time
from selenium import webdriver
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
browser = webdriver.Chrome(executable_path='D:\',options=option) # 声明⼀个浏览器对象option.add_experimental_option('excludeSwitches', ['enable-automation'])
<("www.baidu") # 打开Chrome
input = browser.find_element_by_id("kw") # 通过id定位到input框
input.send_keys("爱奇艺") # 在输⼊框内输⼊python
browser.find_element_by_id("su").click()
time.sleep(3)
browser.find_element_by_xpath('//*[@id="1"]/h3').click()
time.sleep(10)
browser.switch_to_window(browser.window_handles[1]) # 切换到新打开的选项卡定位爱奇艺的搜索框
search = browser.find_element_by_xpath("//input[@class='search-box-input']").send_keys("青春有你")
browser.close() # 关闭浏览器
⽆头浏览器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 创建chrome参数对象
opt = Options()
# 把chrome设置成⽆界⾯模式,不论windows还是linux都可以,⾃动适配对应参数
opt.add_argument('--headless')
# 创建chrome⽆界⾯对象
driver = webdriver.Chrome(options=opt)
<("www.baidu")
print(driver.page_source)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论