
功能成熟(需求变动较小)
产品更新维护周期长
项目进度不太大
比较频繁的回归测试
软件开发比较规范,具有可测试性
可以脚本具有可复用性
元素定位的几种方法
WebDriver API ,selenium IDE,selenium grid
python 技术:
函数、类、方法;读写文件,unitest单元测试框架,HTMLTestRunner.py,发邮件模块,多线程技术等。
开源,免费
多浏览器支持:firefox、chrome、IE
多平台支持:linux 、windows、MAC
多语言支持:java、python、ruby、php、C#、
对web页面有良好的支持
简单(API 简单)、灵活(用开发语言驱动)
支持分布式测试用例执行

selenium 2.0 = selenium 1.0 + WebDriver
简易安装:
第一步、安装Python
第二步、安装selenium
在cmd里面输入命令: pip install -U selenium

第三步、Selenium 与 浏览器驱动 - Firefox 驱动下载 下载火狐驱动
或者Releases · mozilla/geckodriver · GitHub
从https://npm.taobao.org/mirrors/geckodriver下载chromedriver驱动,
或者http://chromedriver.storage.googleapis.com/index.html
官网下载:ChromeDriver - WebDriver for Chrome
放入c:\python27目录下即可,即使python目录下
第四步、安装firefox浏览器
安装chrome浏览器,这里需要注意浏览器版本和驱动的版本需要对应
否则启动浏览器会报错;
浏览器版本与驱动对应可以参考以下图片:

案例1,百度搜索
百度搜索:
# coding = utf-8
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")
browser.find_element_by_id("kw1").send_keys("selenium")
browser.find_element_by_id("su1").click()
browser.quit()
元素的定位
WebDriver 提供的八种定位方法:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
id\name\class name\tag name :
百度搜索框前端代码(通过firebug查看)
<input id="kw1" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">
find_element_by_id(‘kw1’)
find_element_by_name(‘wd’)
find_element_by_class_name(‘s_ipt’)
find_element_by_tag_name(‘input’)
注:页面上的元素tag name 相同的几率很高
link\partial link :
百度首页文字链接:
<a href="http://news.baidu.com" name="tj_news">新 闻</a>
<a href="http://tieba.baidu.com" name="tj_tieba">贴 吧</a>
<a href="http://zhidao.baidu.com" name="tj_zhidao">知 道</a>
find_element_by_link_text(u‘新 闻’)
find_element_by_partial_link_text(‘新’)
find_element_by_link_text(u‘贴 吧’)
...
注:中文字符串加u 是将中文转换成unicode,防止编码问题。
path:

find_element_by_xpath(‘//*[@id='kw1']’)
find_element_by_xpath(‘//input[@id='kw1']’)
find_element_by_xpath(‘//input[@name='wd']’)
find_element_by_xpath(‘//input[@class='s_ipt']’)
find_element_by_xpath(‘//span[@class='bg s_iptwr']/input’)
find_element_by_xpath(‘//form[@id='form1']/span/input’)
....
find_element_by_xpath(‘/html/body/div/div[4]/div[2]/div/form/span/input’)
CSS 常见语法:

CSS :

定位</from>
find_element_by_css_selector(‘from’)
定位<div class="subdiv">
find_element_by_css_selector(‘.subdiv’)
find_element_by_css_selector(‘from+div’)
定位<ul id="recordlist">
find_element_by_css_selector(‘#recordlist’)
find_element_by_css_selector(‘ul#recordlist’)
find_element_by_css_selector(‘div>ul’)
定位<p>Heading</p>
find_element_by_css_selector(‘div>ul’)
find_element_by_css_selector(‘div.subdiv > ul > p’)
浏览器最大化:
maximize_window()
设置浏览器宽、高:
set_window_size(480, 800)
控制浏览器后退,前进:
back()
forward()
clear 清除元素的内容
send_keys 在元素上模拟按键输入
click 单击元素
submit 提交表单
size 返回元素的尺寸
text 获取元素的文本
get_attribute(name) 获得属性值
is_displayed() 设置该元素是否用户可见
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停在一个元素上
click_and_hold() 按下鼠标左键在一个元素上
context_click() 右击
#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
....
#定位到要右击的元素
right =driver.find_element_by_xpath("xx")
#对定位到的元素执行鼠标右键操作
ActionChains(driver).context_click(right).perform()
....
drag_and_drop() 拖动
#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位元素的原位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("xxx")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element,target).perform()
move_to_element() 鼠标悬停
#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位元素的原位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("xxx")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element,target).perform()
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(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)
move_to_element() 鼠标悬停
...
#输入框输入内容
driver.find_element_by_id("kw1").send_keys("seleniumm")
time.sleep(3)
#删除多输入的一个m
driver.find_element_by_id("kw1").send_keys(Keys.BACK_SPACE)
time.sleep(3)
...
title
返回当前页面的标题
current_url
获取当前加载页面的URL
text
获取元素的文本信息
#获得前面title,打印
title = driver.title
print title
#获得前面URL,打印
now_url = driver.current_url
print now_url
#获得登录成功的用户,打印
now_user=driver.find_element_by_id("spnUid").text
print now_user
sleep():
python提供设置固定休眠时间的方法。
implicitly_wait():
是webdirver 提供的一个超时等待。
WebDriverWait():
同样也是webdirver 提供的方法。
webdriver提供定位一组对象的方法:
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
定位一组对象,例一:
……
# 选择页面上所有的tag name 为input的元素
inputs = driver.find_elements_by_tag_name('input')
#然后从中过滤出tpye为checkbox的元素,单击勾选
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
……
定位一组对象,例二:
……
# 选择所有的type为checkbox的元素并单击勾选
checkboxes = driver.find_elements_by_css_selector('input[type=checkbox]')
for checkbox in checkboxes:
checkbox.click()
……
层级定位:
……
#点击Link1链接(弹出下拉列表)
driver.find_element_by_link_text('Link1').click()
#在父亲元件下找到link为Action的子元素
menu = driver.find_element_by_id('dropdown1').find_element_by_link_text('Another action')
#鼠标移动到子元素上
ActionChains(driver).move_to_element(menu).perform()
……
frame表单嵌套的定位:
switch_to_frame 方法
……
#先找到到ifrome1(id = f1)
driver.switch_to_frame("f1")
#再找到其下面的ifrome2(id =f2)
driver.switch_to_frame("f2")
#下面就可以正常的操作元素了
driver.find_element_by_id("kw1").send_keys("selenium")
……
div弹窗的处理:
……
#点击登录链接
driver.find_element_by_name("tj_login").click()
#通过二次定位找到用户名输入框
div=driver.find_element_by_class_name("tang-content").find_element_by_name("userName")
div.send_keys("username")
……
多窗口的处理:
current_window_handle
获得当前窗口句柄
window_handles
返回的所有窗口的句柄到当前会话
switch_to_window()
用于处理多窗口之前切换
多窗口的处理:
#获得当前窗口
nowhandle=driver.current_window_handle
#打开注册新窗口
driver.find_element_by_name("tj_reg").click()
#获得所有窗口
allhandles=driver.window_handles
#循环判断窗口是否为当前窗口
for handle in allhandles:
if handle != nowhandle:
driver.switch_to_window(handle)
print 'now register window!'
#切换到邮箱注册标签
driver.find_element_by_id("mailRegTab").click()
driver.close()
driver.switch_to_window(nowhandle)#回到原先的窗口
alert/confirm/prompt处理:
switch_to_alert()
用于获取网页上的警告信息。
text
返回 alert/confirm/prompt 中的文字信息。
accept
点击确认按钮。
dismiss
点击取消按钮,如果有的话。
send_keys
输入值,这个alert\confirm没有对话框就不能用了,不然会报错。
下拉框处理:
二次定位:
driver.find_element_by_xx('xx').find_element_by_xx('xx').click()
……
#先定位到下拉框
m=driver.find_element_by_id("ShippingMethod")
#再点击下拉框下的选项
m.find_element_by_xpath("//option[@value='10.69']").click()
……
文件上传:
driver.find_element_by_xx('xx').send_keys('d:/abc.txt')
……
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\selenium_use_case\upload_file.txt')
……
文件下载:
确定Content-Type : 下载文件的类型
方法一:
curl -I URL | grep "Content-Type"
方法二:
import requests
print
requests.head(’http://www.python.org’).headers[’content-type’]
文件下载:
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir", os.getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")
browser = webdriver.Firefox(firefox_profile=fp)
browser.get("http://pypi.python.org/pypi/selenium")
browser.find_element_by_partial_link_text("selenium-2").click()
调用javaScript:
execute_script() 调用js方法
#隐藏文字信息
driver.execute_script('$("#tooltip").fadeOut();')
#隐藏按钮:
button = driver.find_element_by_class_name('btn')
driver.execute_script('$(arguments[0]).fadeOut()',button)
滚动条处理
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
#将滚动条移动到页面的顶部
js_="var q=document.documentElement.scrollTop=0"
driver.execute_script(js_)
cookie处理:
get_cookies()
获得所有cookie信息
get_cookie(name)
返回特定name 有cookie信息
add_cookie(cookie_dict)
添加cookie,必须有name 和value 值
delete_cookie(name)
删除特定(部分)的cookie信息
delete_all_cookies()
删除所有cookie信息
验证码的解决方法:
去掉验证码
设置万能码
验证码识别技术
记录cookie
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem
是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案