(A) 기준 셀레늄
튜토리얼 시작하기 : 셀레늄 공식 웹 사이트 자습서를
1.Selenium 프로필
셀레늄은 phantomJS에게 어떤 브라우저 인터페이스를 지원하지 않습니다, 크롬, 파이어 폭스, 사파리 및 기타 주류 브라우저 인터페이스를 포함한 다양한 브라우저를 지원하는 자동화 된 테스트 도구에 대한 테스트 사이트입니다.
여러 운영 체제 2. 지원
윈도우, 리눅스, IOS, 안드로이드 등등과 같은.
3. 셀레늄 설치
pip install Selenium
4. 브라우저 드라이버를 설치합니다
드라이버 파일 webdriver이 있어야합니다 Selenium3.x 전화 브라우저
- 크롬 드라이버 파일 다운로드 : chromedrive 다운로드
- 파이어 폭스 드라이버 파일 다운로드 : 다운로드해야하는 이유는 무엇 geckodriver
5. 환경 변수
설정 브라우저의 주소는 매우 간단합니다. \ GeckoDriver (예 : chromedriver, geckodriver) 브라우저 드라이버 파일 다운로드 : F : 우리는 수동으로 같은 브라우저 기반의 디렉토리에 저장을 만들 수 있습니다이 디렉토리에 던져합니다.
내 컴퓨터 -> 속성 -> 시스템 설정 -> 고급 -> 환경 변수 -> 시스템 변수 -> 경로는 것이다 경로의 값에 "F \ GeckoDriver"디렉토리를 추가합니다. 예를 들어 경로 필드, F : \ GeckoDriver
(B) 셀레늄 빠른 시작
1.Selenium 타겟팅 8 종류의 제공
- 신분증
- 이름
- 클래스 이름
- 태그 이름
- 링크 텍스트
- 부분 링크 텍스트
- XPath는
- CSS 선택기
위치 결정 요소 (2) 여덟 가지
위치 결정 소자 | 여러 요소를 위치 지정 | 의미 |
---|---|---|
find_element_by_id | find_elements_by_id | 포지셔닝 부재 ID별로 |
find_element_by_name | find_elements_by_name | 포지셔닝 부재 이름으로 |
find_element_by_xpath | find_elements_by_xpath | 위치 XPath 식 바이 |
find_element_by_link_text | find_elements_by_link_tex | 전체 하이퍼 링크의 대상으로 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 위치 결정 부에 의해 링크 |
find_element_by_tag_name | find_elements_by_tag_name | 라벨을 위치시킴으로써 |
find_element_by_class_name | find_elements_by_class_name | 클래스 이름에 의해 위치 |
find_elements_by_css_selector | find_elements_by_css_selector | 선택기 CSS를 배치하여 |
프리젠 테이션 3. 예
우리는 웹 페이지가있는 경우, 요소의 특성이 프런트 엔드 도구 (예를 들어, 방화범)입니다 볼 수 있습니다.
<html>
<head>
<body link="#0000cc">
<a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})">
<form id="form" class="fm" name="f" action="/s">
<span class="soutu-btn"></span>
<input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">
- 위치 ID별로 :
dr.find_element_by_id("kw")
- 이름으로 포지셔닝 :
dr.find_element_by_name("wd")
- 클래스가 위치한 이름 :
dr.find_element_by_class_name("s_ipt")
- 위치 태그 이름으로 :
dr.find_element_by_tag_name("input")
- XPath를 위치시킴으로써, 일반적으로 여기 나열된 여러 사용 작성 기입 된 XPath N 종류 위치 :
dr.find_element_by_xpath("//*[@id='kw']")
dr.find_element_by_xpath("//*[@name='wd']")
dr.find_element_by_xpath("//input[@class='s_ipt']")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("//span[@class='soutu-btn']/input")
dr.find_element_by_xpath("//form[@id='form']/span/input")
dr.find_element_by_xpath("//input[@id='kw' and @name='wd']")
- 위치 CSS함으로써 CSS는 일반적으로 여기에 나열된 여러 사용 쓰기 기록의 N 종류의 위치 :
dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html > body > form > span > input")
dr.find_element_by_css_selector("span.soutu-btn> input#kw")
dr.find_element_by_css_selector("form#form > span > input")
다음으로, 우리의 페이지에 텍스트 링크의 세트가있다.
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
- 텍스트 링크의 위치로 :
dr.find_element_by_link_text("新闻")
dr.find_element_by_link_text("hao123")
- 일부 링크에 의해 배치 텍스트 :
dr.find_element_by_partial_link_text("新")
dr.find_element_by_partial_link_text("hao")
dr.find_element_by_partial_link_text("123")
4.Selenium 아래 webdriver 공통 라이브러리 모듈의 사용 방법
1. 브라우저의 동작을 제어하는 방법 중 일부
방법 | 설명 |
---|---|
set_window_size () | 브라우저의 크기를 설정 |
뒤() | 다시 브라우저를 제어 |
앞으로() | 앞으로 브라우저의 제어 |
새롭게 하다() | 현재 페이지를 새로 고침 |
명확한() | 클리어 텍스트 |
send_keys (값) | 아날로그 입력 키 |
딸깍 하는 소리() | 요소를 클릭 |
() 제출 | 양식을 제출 |
get_attribute (이름) | 요소 특성 값을 가져 |
is_displayed () | 요소가 사용자에게 표시할지 여부를 설정합니다 |
크기 | 요소의 사이즈를 돌려줍니다 |
본문 | 텍스트 요소를 가져옵니다 |
프리젠 테이션의 예
from selenium import webdriver
from time import sleep
#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
browser = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
#2.通过浏览器向服务器发送URL请求
browser.get("https://www.baidu.com/")
sleep(3)
#3.刷新浏览器
browser.refresh()
#4.设置浏览器的大小
browser.set_window_size(1400,800)
#5.设置链接内容
element=browser.find_element_by_link_text("新闻")
element.click()
element=browser.find_element_by_link_text("习近平的“下团组”时间")
element.click()
2. 마우스 이벤트
WebDriver, 이러한 방법에 마우스를 ActionChains 클래스에서 포장 작업을 제공합니다.
방법 | 설명 |
---|---|
ActionChains (드라이버) | 개체 건설 ActionChains |
context_click () | 마우스를 가져가 작업을 수행 |
move_to_element 위 | 마우스 오른쪽 단추로 클릭 |
더블 클릭() | 두 번 클릭 |
끌어서 놓기() | 드래그 |
move_to_element 위 | 마우스를 가져가 작업을 수행 |
context_click () | 마우스 오른쪽 버튼을 시뮬레이션하는 데 사용됩니다, 당신은 호출 할 때 위치 요소를 지정해야 |
행하다() | ActionChains이 저장된 모든 행위를 수행, 전체 작업의 작용에 제출하는 것으로 이해 될 수있다 |
프리젠 테이션의 예
from selenium import webdriver
#1.引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver= webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
driver.get("https://www.baidu.cn")
#2.定位到要悬停的元素
element= driver.find_element_by_link_text("设置")
#3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(element).perform()
3. 키보드 이벤트
키 모듈의 셀레늄은 우리를 위해 키보드 키를 시뮬레이션하는 방법을 제공하고, 그 send_keys () 방법이다. 그것은뿐만 아니라 키보드 입력을 시뮬레이션 할 수 있습니다, 또한 키보드의 작동을 시뮬레이션 할 수 있습니다.
다음과 같이 일반적으로 사용되는 키보드 동작합니다
키 입력을 시뮬레이션 | 설명 |
---|---|
send_keys (Keys.BACK_SPACE) | 키 삭제 (Backspace를) |
send_keys (Keys.SPACE) | 스페이스 (공간) |
send_keys (Keys.TAB) | 도표 작성 (탭) |
send_keys (Keys.ESCAPE) | 백 스페이스 키 (ESC) |
send_keys (Keys.ENTER) | 키를 입력 (입력) |
키 조합을 사용하여
키 입력을 시뮬레이션 | 설명 |
---|---|
send_keys (Keys.CONTROL, 'A') | 모두 선택 (Ctrl + A) |
send_keys (Keys.CONTROL, 'C') | 복사 (Ctrl + C) |
send_keys (Keys.CONTROL, 'X') | 잘라 내기 (Ctrl 키 + X) |
send_keys (Keys.CONTROL, 'V') | 붙여 넣기 (Ctrl 키 + V) |
send_keys (Keys.F1 ... FN) | 키보드 F1 ... FN |
정보의 주장을 얻으십시오
不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。通过我们获取title 、URL和text等信息进行断言。
属性 | 说明 |
---|---|
title | 用于获得当前页面的标题 |
current_url | 用户获得当前页面的URL |
text | 获取搜索条目的文本信息 |
实例演示
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
driver.get("https://www.baidu.com")
print('Before search================')
# 打印当前页面title
title = driver.title
print(title)
# 打印当前页面URL
now_url = driver.current_url
print(now_url)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
print('After search================')
# 再次打印当前页面title
title = driver.title
print(title)
# 打印当前页面URL
now_url = driver.current_url
print(now_url)
# 获取结果数目
user = driver.find_element_by_class_name('nums').text
print(user)
#关闭所有窗口
driver.quit()
打印输出结果
Before search================
百度一下,你就知道
https://www.baidu.com/
After search================
selenium_百度搜索
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium&rsv_pq=a1d51b980000e36e&rsv_t=a715IZaMpLd1w92I4LNUi7gKuOdlAz5McsHe%2FSLQeBZD44OUIPnjY%2B7pODM&rqlang=cn&rsv_enter=0&rsv_sug3=8&inputT=758&rsv_sug4=759
搜索工具
百度为您找到相关结果约7,170,000个
5.设置元素等待:参考文献
6.定位一组元素
定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数。
实例演示
from selenium import webdriver
from time import sleep
driver =webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
#1.定位一组元素
elements = driver.find_elements_by_xpath('//div/h3/a')
print(type(elements))
#2.循环遍历出每一条搜索结果的标题
for t in elements:
print(t.text)
element=driver.find_element_by_link_text(t.text)
element.click()
sleep(3)
driver.quit()
7.多表单切换
在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
方法 | 说明 |
---|---|
switch_to.frame() | 将当前定位的主体切换为frame/iframe表单的内嵌页面中 |
switch_to.default_content() | 跳回最外层的页面 |
<html>
<body>
...
<iframe id="x-URS-iframe" ...>
<html>
<body>
...
<input name="email" >
126邮箱登录框的结构大概是这样子的,想要操作登录框必须要先切换到iframe表单。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.126.com")
driver.switch_to.frame('x-URS-iframe')
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()
driver.quit()
switch_to.frame() 默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。
……
#先通过xpth定位到iframe
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')
#再将定位对象传给switch_to.frame()方法
driver.switch_to.frame(xf)
……
driver.switch_to.parent_frame()
8.多窗口切换
在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。
方法 | 说明 |
---|---|
current_window_handle | 获得当前窗口句柄 |
window_handles | 返回所有窗口的句柄到当前会话 |
switch_to.window() | 用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。 |
实例演示
from selenium import webdriver
import time
driver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
#1.获得百度搜索窗口句柄
sreach_windows = driver.current_window_handle
driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text("立即注册").click()
#1.获得当前所有打开的窗口的句柄
all_handles = driver.window_handles
#3.进入注册窗口
for handle in all_handles:
if handle != sreach_windows:
driver.switch_to.window(handle)
print('跳转到注册窗口')
driver.find_element_by_name("account").send_keys('123456789')
driver.find_element_by_name('password').send_keys('123456789')
time.sleep(2)
driver.quit()
9.警告框处理
在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作。
方法 | 说明 |
---|---|
text | 返回 alert/confirm/prompt 中的文字信息 |
accept() | 接受现有警告框 |
dismiss() | 解散现有警告框 |
send_keys(keysToSend) | 发送文本至警告框。keysToSend:将文本发送至警告框。 |
实例演示
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
# 鼠标悬停至“设置”链接
link = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(link).perform()
# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
#在此处设置等待2s否则可能报错
time.sleep(2)
# 保存设置
driver.find_element_by_class_name("prefpanelgo").click()
time.sleep(2)
# 接受警告框
driver.switch_to.alert.accept()
driver.quit()
10.下拉框选择操作
导入选择下拉框Select类,使用该类处理下拉框操作。
from selenium.webdriver.support.select import Select
Select类的方法
方法 | 说明 |
---|---|
select_by_value(“选择值”) | 相当于我们使用鼠标选择下拉框的值 |
有时我们会碰到下拉框,WebDriver提供了Select类来处理下拉框。 如百度搜索设置的下拉框,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WUxrkEj-1571973999629)(http://orru5lls3.bkt.clouddn.com/select.png)]
from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep
driver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
#1.鼠标悬停至“设置”链接
driver.find_element_by_link_text('设置').click()
sleep(1)
#2.打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
sleep(2)
#3.搜索结果显示条数
sel = driver.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('50') # 显示50条
sleep(3)
driver.quit()
11.文件上传
对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过send_keys()指定本地文件路径的方式实现文件上传。
通过send_keys()方法来实现文件上传:
from selenium import webdriver
import os
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)
# 定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')
driver.quit()
12.cookie操作
有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试进行的。WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息。
WebDriver操作cookie的方法:
方法 | 说明 |
---|---|
get_cookies() | 获得所有cookie信息 |
get_cookie(name) | 返回字典的key为“name”的cookie信息 |
add_cookie(cookie_dict) | 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值 |
delete_cookie(name,optionsString) | 删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域” |
delete_all_cookies() | 删除所有cookie信息 |
实例演示
from selenium import webdriver
import time
browser = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
browser.get("http://www.youdao.com")
#1.打印cookie信息
print('=====================================')
print("打印cookie信息为:")
print(browser.get_cookies)
#2.添加cookie信息
dict={'name':"name",'value':'Kaina'}
browser.add_cookie(dict)
print('=====================================')
print('添加cookie信息为:')
#3.遍历打印cookie信息
for cookie in browser.get_cookies():
print('%s----%s\n' %(cookie['name'],cookie['value']))
#4.删除一个cookie
browser.delete_cookie('name')
print('=====================================')
print('删除一个cookie')
for cookie in browser.get_cookies():
print('%s----%s\n' %(cookie['name'],cookie['value']))
print('=====================================')
print('删除所有cookie后:')
#5.删除所有cookie,无需传递参数
browser.delete_all_cookies()
for cookie in browser.get_cookies():
print('%s----%s\n' %(cookie['name'],cookie['value']))
time.sleep(3)
browser.close()
13.调用JavaScript代码
虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了execute_script()方法来执行JavaScript代码。
用于调整浏览器滚动条位置的JavaScript代码如下:
<!-- window.scrollTo(左边距,上边距); -->
window.scrollTo(0,450);
window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下:
from selenium import webdriver
from time import sleep
#1.访问百度
driver=webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
driver.get("http://www.baidu.com")
#2.搜索
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
#3.休眠2s目的是获得服务器的响应内容,如果不使用休眠可能报错
sleep(2)
#4.通过javascript设置浏览器窗口的滚动条位置
js="window.scrollTo(100,450);"
driver.execute_script(js)
sleep(3)
driver.close()
通过浏览器打开百度进行搜索,并且提前通过set_window_size()方法将浏览器窗口设置为固定宽高显示,目的是让窗口出现水平和垂直滚动条。然后通过execute_script()方法执行JavaScripts代码来移动滚动条的位置。
14.窗口截图
自动化用例是由程序去执行的,因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因。WebDriver提供了截图函数get_screenshot_as_file()来截取当前窗口。
截屏方法:
方法 | 说明 |
---|---|
get_screenshot_as_file(self, filename) | 用于截取当前窗口,并把图片保存到本地 |
from selenium import webdriver
from time import sleep
driver =webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()
sleep(2)
#1.截取当前窗口,并指定截图图片的保存位置
driver.get_screenshot_as_file("D:\\baidu_img.jpg")
driver.quit()
15.关闭浏览器
在前面的例子中我们一直使用quit()方法,其含义为退出相关的驱动程序和关闭所有窗口。除此之外,WebDriver还提供了close()方法,用来关闭当前窗口。例多窗口的处理,在用例执行的过程中打开了多个窗口,我们想要关闭其中的某个窗口,这时就要用到close()方法进行关闭了。
方法 | 说明 |
---|---|
close() | 关闭单个窗口 |
quit() | 关闭所有窗口 |