1、selenium安装配置
2、Selenium的基本使用
(1)声明浏览器对象
(2)定位元素
(3)元素对象(element)
(4)动作链
(5)弹出对话框
(6)键盘操作
(7)延时等待
(8)异常处理
(9)实例:抓取淘宝页面商品信息
selenium是一个用于web应用程序测试工具,selenium测试直接运行在浏览器中,就像真正的用户在操作一样,支持的浏览器包括IE(7,8,9,10,11),mozilla firefox,safari,google chrom,opera等,可使用java,python等多种语言编写用例脚本。
Selenium Python绑定提供了一个简单的API,可以使用Selenium WebDriver编写功能/验收测试。通过Selenium Python API,您可以直观地访问Selenium WebDriver的所有功能。
Selenium Python绑定提供了一个方便的API来访问Selenium WebDrivers,如Firefox,Ie,Chrome,Remote等。目前支持的Python版本是2.7,3.5及更高版本
回到顶部
1、selenium安装配置
pip安装:
pip install selenium
wheel安装:
复制代码
#下载wheel安装文件:https://pypi.python.org/pypi/selenium/#downloads
pip install selenium-3.13.0-py2.py3-none-any.whl
复制代码
chrome浏览器支持的chromeDriver驱动配置:
注意:此前必须安装好chrome浏览器
chromedriver下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads
首先查看chrome浏览器版本,然后选定支持浏览器版本的chromDriver选择适合的平台包进行下载,下载完后需要配置环境:
在windows系统中可以将chromedriver.exe文件直接拖到python的scripts目录中即可,也可以将路径加入到环境变量中。
在linux下需要将可执行文件配置到环境变量或将文件移动到属于环境变量的目录中
验证安装是否成功,可执行命令chromedriver,如果可以看到chromeDriver的版本号说明安装成功
使用python脚本测试:
复制代码
from selenium import webdriver
browser=webdriver.Chrome()
#如果能弹出一个空白的chrome浏览器页面,说明配置成功
复制代码
其他浏览器的驱动安装配置一样,附上其他浏览器的驱动下载链接地址:
Firefox:https://github.com/mozilla/geckodriver/releases
safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
我们还可以使用phantomJS一个无界面的webkit浏览器引擎,它原生支持多种web标准:DOM操作,CSS选择器,JSON,Canvas以及SVG
下载地址:http://phantomjs.org/download.html
下载完成后,将PhantomJS可执行文件所在的路径配置到环境变量中,如在windows下降下载的文件解压之后打开会看到一个bin文件夹,里面包含一个可执行文件phantomjs.exe,我们需要将它直接放在配置好的环境变量路径下或者将它所在的路径配置到环境变量里,或直接将它复制到python的scripts文件夹下
测试安装:
复制代码
(virtualenv-36) C:\Users\Administrator\PycharmProjects\untitled\pachong>phantomjs -v
2.1.1
#在python的terminal环境下执行命令phantomjs -v,如果能打印版本信息说明安装成功
复制代码
Selenium支持PhantomJS,不过phantomJS官方说明已不再更新了,在selenium中使用phantomJS将弹出警告信息,建议使用chrome或firefox无头版,下面将重点介绍chrome和firefox
回到顶部
2、Selenium的基本使用
回到顶部
(1)声明浏览器对象
Selenium支持很多浏览器包括chrome、Firefox、Edge、Safari等,各浏览器初始化对象方法:
复制代码
from selenium import webdriver
#browser=webdriver.Firefox()
browser=webdriver.Chrome()
#browser=webdriver.Edge()
#browser=webdriver.Safari()
print(type(browser))
#返回的是一个WebDriver对象
复制代码
WebDriver对象的方法和属性:(获取节点方法在后续介绍)
add_cookie(cookie_dict): 为当前会话添加一个cookie,为字典类型
back(): 在浏览器历史记录中后退一步
forward(): 在浏览器历史上前进一步
close(): 关闭当前窗口
create_web_element(element_id): 使用指定的id创建Web元素
delete_all_cookies(): 删除会话范围内的所有cookie
delete_cookie(name): 删除具有给定名称的单个cookie
execute(driver_command,params=None): 发送command执行的命令
execute_async_script(script,*args): 异步执行当前窗口或框架中的JavaScript
execute_script(script,*args): 同步执行当前窗口或框架中的JavaScript
复制代码
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.execute_script("alert('are you sure');")
#它基本可以实现JavaScript的所有功能
复制代码
fullscreen_window():调用窗口管理器特定的全屏操作
get(url):在当前浏览器会话中加载网页
get_cookie(name):按名称获取单个cookie
get_cookies():返回一组字典的cookies
get_log(log_type):获取给定日志类型的日志
get_screenshot_as_base64():获取当前窗口的屏幕截图,作为base64编码的字符串
get_screenshot_as_file(filename):将当前窗口中的截屏保存为png图形
get_screenshot_as_png():获取当前窗口的屏幕截图作为二进制数据
get_window_position(windowhandle='current'):获取当前窗口的x,y位置
get_window_rect():获取窗口的x,y坐标以及当前窗口的高度和宽度
get_window_size():获取当前窗口的高度和宽度
maximize_window():最大化webdriver正在使用的当前窗口
minimize_window():最小化当前webdricer使用窗口
quit():退出驱动程序并关闭每个关联的窗口
refresh():刷新当前页面
save_screenshot(filename):将当前窗口的屏幕截图保存为PNG图形文件
set_page_load_timeout(time_to_wait):设置等待页面加载完成的时间
set_script_timeout(time_to_wait):设置脚本在执行期间等待的时间
set_window_position(x,y,windowHandle='current'):设置当前窗口的x,y位置
set_window_rect(x=None,y=None,width=None,height=None):设置窗口的x,y坐标以及当前窗口的高度和宽度
set_window_size(width,height,windowHandle='current'):设置当前窗口的高度和宽度
current_url:获取当前页面的URL
current_window_handle:返回当前窗口的句柄
desired_capabilities:返回驱动程序当前使用的所需功能
log_types:获取可用日志类型的列表
name:返回此实例的基础浏览器的名称
page_source:获取当前页面的源码
switch_to:将焦点切换到所有选项的对象上driver.switch_to.alert
title:返回当前页面的标题
window_handles:返回当前会话中所有窗口的句柄
复制代码
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('http://selenium-python.readthedocs.io')
browser.execute_script('window.open("https://www.baidu.com");') #在标签页打开URL
browser.execute_script('window.open("https://www.taobao.com");')
browser.back() #后退到前一个页面
browser.set_page_load_timeout(5)
browser.forward() #前进到下一个页面
print(browser.name)
print(browser.title)
print(browser.current_url)
print(browser.current_window_handle)
print(browser.get_cookies())
print(type(browser))
#
chrome
Selenium with Python — Selenium Python Bindings 2 documentation
http://selenium-python.readthedocs.io/
CDwindow-243FD31239F20FCC0195DD522A60A0DA
[{'domain': '.readthedocs.io', 'expiry': 1530766561, 'httpOnly': False, 'name': '_gid', 'path': '/', 'secure': False, 'value': 'GA1.2.1126774326.1530680157'}, {'domain': '.readthedocs.io', 'expiry': 1593752161, 'httpOnly': False, 'name': '_ga', 'path': '/', 'secure': False, 'value': 'GA1.2.2096958532.1530680157'}, {'domain': '.readthedocs.io', 'expiry': 1530680217, 'httpOnly': False, 'name': '_gat_rtfd', 'path': '/', 'secure': False, 'value': '1'}]
复制代码
获取页面截图:
复制代码
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('http://www.python.org')
driver.save_screenshot('screenshot.png') #保持页面截图到当前路径
driver.quit()
复制代码
将页面滚动到底部:
复制代码
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('http://www.python.org')
#通过DOM中的window对象的scrollTo方法,将窗口位置滚动到指定位置,document.body.scrollHeight返回整个body的高度,所以页面将滚动到页面底部
driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
复制代码
cookies操作:
复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/7/5 16:19
# @Author : Py.qi
# @File : test7.py
# @Software: PyCharm
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('https://www.baidu.com')
print(driver.get_cookies()) #获取所有cookies
driver.add_cookie({'name':'name','domain':'www.baidu.com','value':'germey'}) #添加cookie
print(driver.get_cookies())
driver.delete_all_cookies()
print(driver.get_cookies())
复制代码
回到顶部
(2)定位元素
class selenium.webdriver.common.by.By
有各种策略来定位页面中的元素。你可以使用最适合你的情况。Selenium提供了以下方法来定位页面中的元素:
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
要查找多个元素(这些方法将返回一个列表):
find_elements_by_name
find_elements_by_xpath
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
除了上面给出的公共方法之外,还有两个私有方法可能对页面对象中的定位器有用。这些是两个私有方法:find_element和find_elements
复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/7/4 13:03
# @Author : Py.qi
# @File : test2.py
# @Software: PyCharm
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.get('http://selenium-python.readthedocs.io/locating-elements.html#locating-elements')
data=driver.find_element(By.CLASS_NAME,'simple')
#driver.find_element(By.ID,'IDname') #获取ID标签定位元素
#driver.find_element(By.CSS_SELECTOR,'cssname')#CSS选择器定位元素
#driver.find_element(By.LINK_TEXT,'linktext') #链接文本定位元素
#driver.find_element(By.PARTIAL_LINK_TEXT,'linktext') #部分链接文件定位元素
#driver.find_element(By.NAME,'name') #属性名定位元素
#driver.find_element(By.TAG_NAME,'tagname') #标签名定位元素
print(data.text) #打印元素文本内容
#
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
复制代码
复制代码
#如获取多个,可是使用:
data=driver.find_elements(By.CLASS_NAME,'simple')
复制代码
除了使用上面的方法外,还可以使用更细致的方法定位元素:
通过Id定位:
当您知道元素的id属性时使用此选项。使用此策略,将返回id属性值与该位置匹配的第一个元素,如使用find_elements_by_id将返回多个匹配的元素。如果没有元素具有匹配的id 属性,NoSuchElementException则会引发
复制代码
driver.find_element_by_id('idname')
driver.find_elements_by_id('idname')
复制代码
按名称定位:
当您知道元素的name属性时,请使用此选项。使用此策略,将返回名称属性值与位置匹配的第一个元素,如使用find_elements_by_name将返回多个匹配的元素。如果没有元素具有匹配的name 属性,NoSuchElementException则将引发
复制代码
driver.find_element_by_name('name')
driver.find_elements_by_name('name')
复制代码
通过XPath定位:
XPath是用于在XML文档中定位节点的语言。由于HTML可以是XML(XHTML)的实现,因此Selenium用户可以利用这种强大的语言来定位其Web应用程序中的元素。XPath扩展了通过id或name属性定位的简单方法,并打开了各种新的可能性,例如在页面上查找第三个复选框。
使用XPath的主要原因之一是当您没有适合您要查找的元素的id或name属性时。您可以使用XPath以绝对术语或相对于具有id或name属性的元素来定位元素。XPath定位器也可以用来通过id和name之外的属性指定元素。
XPaths包含根(html)中所有元素的位置,因此可能会失败,只需对应用程序进行最轻微的调整。通过查找具有id或name属性的附近元素(理想情况下是父元素),可以根据关系找到目标元素。这不太可能改变,可以使您的测试更加健壮
复制代码
driver.find_element_by_xpath("//from[1]") #查看第一个表单元素
friver.dind_element_by_xpath("//from[@id='loginform']") #查找id为loinform的表单元素
复制代码
通过链接文本查找超链接:
当您知道锚标记中使用的链接文本时,请使用此选项。使用此策略,将返回链接文本值与位置匹配的第一个元素。如果没有元素具有匹配的链接文本属性,NoSuchElementException则将引发
复制代码
你确定要这么做吗? p>
继续
取消
BODY>
driver.find_element_by_link_text('继续) #通过链接文本定位到元素
复制代码
按标签名称定位元素:
如果要按标签名称查找元素,请使用此选项。使用此策略,将返回具有给定标记名称的第一个元素。如果没有元素具有匹配的标记名称,NoSuchElementException 则将引发
driver.find_element_by_tag_name('h1')
按类名定位元素:
如果要按类属性名称定位元素,请使用此选项。使用此策略,将返回具有匹配类属性名称的第一个元素。如果没有元素具有匹配的类属性名称,NoSuchElementException则将引发
driver.find_element_by_class_name('content')
通过CSS选择器定位元素:
当你想通过CSS选择器语法找到一个元素时使用它。使用此策略,将返回具有匹配的CSS选择器的第一个元素。如果没有元素具有匹配的CSS选择器,NoSuchElementException则会引发
driver.find_element_by_css_selector('p.content')
回到顶部
(3)元素对象(element)
当我们通过上面 的方法定位到元素后返回的对象称为web元素对象,我们可以对元素对象再进行交互或继续查找等操作
复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/7/4 13:55
# @Author : Py.qi
# @File : test3.py
# @Software: PyCharm
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
opt=Options()
opt.add_argument('headless')
driver=webdriver.Chrome(chrome_options=opt)
driver.get('http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement')
element=driver.find_element_by_id('module-selenium.webdriver.remote.webelement')
print(element)
print(type(element))
#返回一个webelement对象
复制代码
selenium.webdriver.remote.webelement.WebElement为一个DOM元素,它的方法和属性包括:
clear() :清除文本元素
click() :单击元素按钮
get_attribute(name) :获取元素的给定属性的属性值
get_property(name) :获取元素的给定属性
is_displayed() :判断元素是否存在
is_enable() :判断元素是否被启用
is_selected() :返回元素是否被选中
screenshot(filename) :将当前元素的屏幕截图保存到文件
send_keys() #发送元素值
submit() :提交表单
value_of_css_property() :CSS属性的值
id :selenium使用的内部ID
location :元素在可渲染画布中的位置
location_once_scrolled_into_view :发现元素在屏幕视图中的位置
rect :返回包含元素大小和位置的字典
screenshot_as_base64 :获取当前元素的截屏,作为base64编码的字符串
size :获取元素的大小
tag_name :获取元素的tagName属性
text :获取元素的文本
与页面交互,实现输出文本搜索功能,并打印搜索结果源码:
复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/7/4 13:55
# @Author : Py.qi
# @File : test3.py
# @Software: PyCharm
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('http://www.cnblogs.com/zhangxinqi/')
element=driver.find_element_by_id('q') #获取输入框元素
element.send_keys('python3之requests') #发送元素
button=driver.find_element_by_id('btnZzk') #获取搜索按钮
button.click() #发送搜索动作
data=driver.page_source
print(driver.current_url) #打印URL
print(data)
print(type(element))
driver.close()
#
http://zzk-s.cnblogs.com/s?w=blog%3Azhangxinqi%20python3%E4%B9%8Brequests
blog:zhangxinqi python3之requests - 博客园找找看......
复制代码
回到顶部
(4)动作链
class selenium.webdriver.common.action_chains.ActionChains(driver)
在上面的实例中我们针对的是某个节点元素的操作,如果要对没有特定元素的对象操作如鼠标拖拽、键盘按键等,这些动作就称为动作链,selenium使用ActionChains()类来实现鼠标移动,鼠标按钮操作,按键操作和上下文菜单交互,悬停和拖放等
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
将元素拖拽到目标位置:
复制代码
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
复制代码
执行鼠标操作的流程:
复制代码
menu = driver.find_element_by_css_selector(".nav") #获取element对象
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1") #获取点击对象
#创建鼠标对象
actions = ActionChains(driver)
#移动鼠标到对象
actions.move_to_element(menu)
#点击对象
actions.click(hidden_submenu)
#执行操作
actions.perform()
复制代码
回到顶部
(5)弹出对话框
class selenium.webdriver.common.alert.Alert(driver)
Alert内置支持处理弹窗对话框,方法:
accept() :确认弹窗,用法:Alert(driver).appept()
authenticate(username,password) :将用户名和密码发送到authenticated对话框,隐含点击确定,用法:driver.switch_to.alert.authenticate('username','password')
dismiss() :取消确认
send_keys(keysToSend) :将密钥发送到警报,keysToSend为要发送的文本
text :获取Ale