需要继续学习断言,js方法,以及ddt数据驱动.最后了解unittest的实现机制.
4. ChromeDriver(Chrome浏览器驱动):
下载地址:http://chromedriver.storage.googleapis.com/index.html
- 下载对应版本的driverChrome(64的浏览器兼容32位的driverchrome)
- 放到chrome的家目录和python的家目录
- chrome的家目录要添加到系统变量上
5.css与xpath的差异链接(xpath定位更强大?)
单右斜线“/”,在 XPATH 里面任何地方的单右斜代表要查找的元素是挨着上一级节点的子节点中的一个,中间不能跳级。
双右斜线“//”,代表查找下级任何子节点或者任何嵌套子节点中的一个,可以跳级。
//tag[@attribute='value']
//查找下级任何子节点
tag:标签
attribute:属性
valuse:属性值
Target CSS 3 XPath 所有元素 * //* 所有的P元素 p //p 所有的p元素的子元素 p > * //p/* 根据ID获取元素 /转义/#id //*[@id= ‘id’] 根据Class获取元素 .class //*[contains(@class, ‘class’)] 拥有某个属性的元素 *[title] //*[@title] 所有P元素的第一个子元素 p > *:first-child //p/*[0] 所有拥有子元素a的P元素 无法实现 //p[a] 下一个兄弟元素 P + * //p/following-sibling::*[0]
conn.find_element_by_id('kw').send_keys('holle!')
conn.find_element_by_css_selector('#su').click()
driver.find_element_by_xpath('//*[@id="root"]/div/div[4]/div[1]/form/div[2]/button').click()
driver.find_element_by_css_selector('li.ant-select-dropdown-menu-item:nth-child(%s)' % num).click()
find_element
只返回查找到的第一个元素,如果没有查找到元素,则返回NoSuchElementException的异常
find_elements
返回一个包含所有元素的列表,如果没有元素,则返回空列表
4.https://blog.csdn.net/lonlon29/article/details/79112830 ,别人家的笔记
常用的api:
1. 跳转至指定网页
driver.get('http://www.baidu.com')
2. 获取当前页面标题内容
driver.title
3. 获取当前网页地址
driver.current_url
4. 获取当前页面元素
driver.page_source
5. 回退到之前打开的页面
driver.back()
6. 前进到回退之前的页面
driver.forward()
7. 获取页面上的元素
driver.find_element_by_id('su')
#寻找id为’su’的元素
driver.find_element_by_name('wd')
#寻找name为’wd’的元素
driver.find_element_by_link_text('贴吧')
#寻找链接文本信息为’贴吧’的元素
driver.find_element_by_class_name('c-tips-container')
#寻找classname为’c-tips-container’的元素
driver.find_element_by_xpath('//*[@id="kw"]')
#寻找xpath中带有id名为kw的元素
driver.find_element_by_tag_name('div')
#寻找标签名带有’div’的元素
driver.find_element_by_partial_link_text('新')
#寻找链接文本部分带有’新’的元素
8. 设置浏览器窗口大小
driver.set_window_size(800,600)#将浏览器窗口大小设置为800*600
driver.maximize_window() #将浏览器窗口设置最大化
9. 对寻找到的元素进行一些操作 (clear(),click(),send_keys(),submit())
以百度搜索首页为例,进行操作:
driver.find_element_by_name('wd').send_keys(‘PythonSelenium’)
#在百度文本搜索框内输入内容Python Selenium
driver.find_element_by_name('wd').clear()
#清空文本搜索框的所有内容
driver.find_element_by_id('su').click()
#点击搜索按钮
driver.find_element_by_id('su').submit()
#提交搜索按钮,这里效果同点击搜索按钮
10. 获取元素的属性(.size(), .text, get_attribute('type'))
以百度搜索首页为例,进行操作:
driver.find_element_by_id('kw').size
#获取搜索框的大小
driver.find_element_by_id('jgwab').text
#获取控件id为’jgwab’所显示的内容
driver.find_element_by_id('su').get_attribute('type')
#获取控件id为’su’的属性,例如button,radio等
driver.find_element_by_name('wd').is_displayed()
#判断搜索文本框当前是否被显示
11. 模拟鼠标的操作
以百度搜索首页为例,进行操作:
需要引入包ActionChains:
from selenium.webdriver.common.action_chainsimportActionChains
ActionChains(driver).context_click(driver.find_element_by_id('kw')).perform()
#在搜索文本框利用context_click()进行鼠标右击,perform() 是执行方法的语句
ActionChains(driver).double_click(driver.find_element_by_id('kw')).perform()
#在搜索文本框利用double_click()进行双击, perform() 是执行方法的语句
ActionChains(driver).drag_and_drop(driver.find_element_by_id('kw'),driver.find_element_by_id('su')).perform()
#利用drag_and_drop(source,target)从搜索文本框移动到点击按钮, perform() 是执行方法的语句
ActionChains(driver).move_to_element(driver.find_element_by_id('kw')).perform()
#利用move_to_element()停留在文本搜索框上, perform() 是执行方法的语句
ActionChains(driver).click_and_hold(driver.find_element_by_id('su')).perform()
#利用click_and_hold()可以点击并且停留在搜索按钮上, perform() 是执行方法的语句
12. 模拟键盘操作
以百度搜索首页为例,进行操作:
需要引入包ActionChains:
from selenium.webdriver.common.keysimportKeys
driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE)#Backspace键
driver.find_element_by_id('kw').send_keys(Keys.SPACE)#Space键
driver.find_element_by_id('kw').send_keys(Keys.DELETE)#Delete键
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')# CTRL + A
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')# CTRL + X
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'v')# CTRL + V
driver.find_element_by_id('kw').send_keys(Keys.ENTER)#ENTER键
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'c') # CTRL + C
driver.find_element_by_id('kw').send_keys(Keys.TAB)# TAB键
13. 智能等待方法
需要引入包 WebDriverWait
fromselenium.webdriver.support.uiimport WebDriverWait
WebDriverWait(driver,10).until(lambda driver : driver.find_element_by_id('kw'))
#利用WebDriverWait方法 等待10秒,直到id为’kw’控件出现
driver.implicitly_wait(30)#在页面上隐式等待30 秒
import time #引入time包
time.sleep(5) # 等待5秒
窗口跳转:
driver.switch_to_frame('f1')# 切换到框架f1
driver.find_element_by_name('button').click()#点击网页中的上图按钮
Alert = driver.switch_to_alert()
#利用switch_to_alert()方法去获取当前页面中的Alert 对话框
14. 定位元素
checkboxs = driver.find_elements_by_tag_name('input')
#用find_elements 方法去寻找所有标签名’input’的元素
radios = driver.find_elements_by_css_selector('input[type=radio]')
#用find_elements 方法去寻找所有 css选择器名为input[type=radio]的元素
for mycheckbox in checkboxs: #循环遍历所有input元素控件
if mycheckbox.get_attribute('type') == 'checkbox':
#找到’属性type’为’checkbox’
mycheckbox.click() #点击
for myradiobutton in radios: #循环遍历所有radio元素单选控件
myradiobutton.click()#全部点击
len(checkboxs) #计算复选框的数量
len(radios) #计算单选框的数量
checkboxs.pop(1).click()
#去掉勾选复选框的1序号的元素,pop() 为空时,默认去选最后一个元素
15. 定位层级
driver.find_element_by_link_text('Link1').click()
#点击Link1 之后会弹出下拉列表
dropdownlist = driver.find_element_by_id('dropdown1').find_element_by_link_text('Anotheraction')
#找到下拉列表后弹出的'Another action'文字
ActionChains(driver).move_to_element(dropdownlist).perform()
#光标会移动到该元素上
16. 定位框架
driver.switch_to_frame('f1')# 切换到框架f1
driver.switch_to_frame('f2') # 切换到框架f2
17. 处理对话框
driver.find_element_by_id('u1').find_element_by_name('tj_login').click()
#在百度首页找到登录按钮
driver.find_element_by_class_name('tang-content').find_element_by_id('TANGRAM__PSP_10__userName').send_keys('Selenium')
#通过二级定位找到用户名输入框,输入框在控件名为’ tang-content’之下,并输入用户名
driver.find_element_by_class_name('tang-content').find_element_by_name('password').send_keys('Selenium')
#通过二级定位找到密码框,密码框在控件名为’ tang-content’之下,并输入密码
driver.find_element_by_class_name('tang-content').find_element_by_css_selector('input[type=submit]').click()
#通过二级定位找到登录按钮,登录按钮在控件名为’ tang-content’之下,并点击
18. Alert框处理
driver.find_element_by_name('button').click()#点击网页中的上图按钮
Alert = driver.switch_to_alert()
#利用switch_to_alert()方法去获取当前页面中的Alert 对话框
print(Alert.text)#输出Alert对话框中的文字
Alert.accept() #.accept 点击Alert对话框的确定按钮
19. Confirm框
driver.find_element_by_css_selector('input[type=button]').click()
#点击网页中的上图按钮
Confirm = driver.switch_to_alert()
#利用switch_to_alert()方法去获取当前页面中的 Confrim 对话框
print(Confirm.text)#输出Confirm对话框中的文字
Confirm.dismiss()#利用.dismiss() 去点击Confirm的取消按钮
20. Prompt框
driver.find_element_by_id('button').click()#点击网页中的上图按钮
Prompt = driver.switch_to_alert()#利用switch_to_alert()方法去获取当前页面中的 Prompt 对话框
print(Prompt.text)#输出Prompt对话框中的文字
Prompt.send_keys(“Hello Selenium”)
#在输入框内输入HelloSelenium
Prompt.accept() #点击Prompt对话框的确定按钮
21. 操作下拉列表(多元素用find_elements_by_)
#遍历寻找方法
dropdownlist =driver.find_elements_by_tag_name('option')
#利用find_elements去寻找标签名为option的所有元素
for mychoose in dropdownlist: #遍历整个options列表
if mychoose.get_attribute('value')== '10.69':
#找到value属性为10.69的并点击
mychoose.click()
#利用层级定位去寻找value为7.45的选项并点击
driver.find_element_by_id('ShippingMethod').find_element_by_xpath("//option[@value='7.45']").click()
#利用两次点击,寻找到value为11.61的选项并点击
driver.find_element_by_id('ShippingMethod').click()
driver.find_element_by_xpath("//option[@value='11.61']").click()
22. 分页处理
pages =driver.find_element_by_class_name('yem').find_elements_by_tag_name('option')
#利用二层定位找到下拉列表分页元素
print("total page is : " +str(len(driver.find_element_by_id('pageE1m_a74e_ce2c').find_elements_by_tag_name('option'))))
#利用二层定位输出下拉列表分页的长度
for page in pages: #遍历整个下拉列表,且将value属性值为6的点击选中
if page.get_attribute('value')== '6':
page.click()
23. 模拟上传文件
driver.find_element_by_name('file').send_keys(‘C:\\123.txt’)
#利用send_keys方法,输入文件路径C:\\123.txt,模拟上传文件
24. 使用JavaScript语言
driver.execute_script('$("#tooltip").fadeOut();')
#.execute_script是执行JavaScript语句的的方法,fadeout()方法可以隐藏特地元素,这里是指"#tooltip"
说明:因为fadeOut()的Jquery语言的一个方法,所以它必须遵循Jquery的语法,必须在语言头加一个$号
Button =driver.find_element_by_class_name('btn')
driver.execute_script('arguments[0].click()',Button)
#因.click()不是Jquery的语法,所以不需要加$号,该语句的作用是点击’btn’按钮,效果同Button.click(),这里用js语法实现
25. 控制浏览器滚动条
ScrollToBottom = 'window.scrollTo(0,document.body.scrollHeight)'
#将滚动条拖到最底
ScrollToTop= 'window.scrollTo(document.body.scrollHeight,0)'
#将滚动条拖到顶
ScrollUp ='window.scrollTo(document.body.scrollHeight,500)'
#将滚动条向上移动500px单位
ScrollDown= 'window.scrollTo(500,1500)'
#将滚动条从 500px的地方移动到1500px的地方
driver.execute_script(ScrollToBottom)
driver.execute_script(ScrollUp)
driver.execute_script(ScrollDown)
driver.execute_script(ScrollToTop)
#利用execute_script方法,执行JavaScript语句
26. 操作Cookie
打开有道官网 http://www.youdao.com
driver.add_cookie({'name':'name_aaaaaa', 'value':'value_bbbb'})
#使用add_cookie()去添加cookie方法.添加cookie必须在读取去完成,否则会把新添加的值给覆盖掉
cookies = driver.get_cookies()
#get_cookies()方法可以获取当前页面所有的cookie
for cookie in cookies:
print("%s-> %s" % (cookie['name'],cookie['value']))
#在当前页面获取所有name和value的cookie
driver.delete_cookie('CookieName')#删除名为CookieName的cookie
driver.delete_all_cookies()# 删除所有cookie
27. 获取其他的属性元素
Checkboxs =driver.find_elements_by_css_selector('input[type=checkbox]')
#找到checkobox复选框元素
for mycheckbox in Checkboxs:
if mycheckbox.get_attribute('data-node') =='594434498':
#找到data-node的值为'594434498'的复选框,并勾选
mycheckbox.click()
if mycheckbox.get_attribute('data-convert')=='1':
#找到data-convert的值为'1'的复选框,并勾选
mycheckbox.click()
if mycheckbox.get_attribute('data-type') == 'file':
#找到data-type的值为'file'的复选框,并勾选
mycheckbox.click()
28. 退出浏览器
driver.quit()
29. Assert验证
结合unittst框架
self.asserIn(‘百度一下’,driver.title)
self.assertEqual(‘百度一下’,driver.title)
#验证’百度一下’,是不是在百度首页标题内,格式例如:asserIn(期望值,实际值). asserIn不需要全字匹配,assertEqual需要全字匹配
30. Demo
结合JavaScript语句,在搜狗搜索中进行搜索内容的相关验证
import unittest
import os
import time
import Getbrowser
import sys
from selenium.webdriver.support.ui importWebDriverWait from selenium.webdriver.common.action_chains import ActionChains
classUseJavaScriptOnSogou(unittest.TestCase):
def setUp(self):
self.driver = Getbrowser.Chrome()
deftestUseJavaScriptOnSogou(self):
driver = self.driver
URL = 'http://www.sogou.com'
driver.get(URL)
Content = 'Hello Selenium'
time.sleep(3)
TitleName = driver.execute_script('return document.title')
if '搜狗搜索引擎 - 上网从搜狗开始' == TitleName:
print("Title name is correct!")
else:
print("Current title name is " + TitleName)
SearchBox = driver.find_element_by_id('query')
SearchButton = driver.find_element_by_id('stb')
driver.execute_script('arguments[0].value= "'+ Content + '"',SearchBox)#效果同send_keys
time.sleep(2)
driver.execute_script('arguments[0].click()',SearchButton)
#效果同.click()
time.sleep(2)
TitleName2 = driver.execute_script('return document.title')
#效果同driver.title
if Content + ' - 搜狗搜索' == TitleName2:
print("Title name of search is correct!")
else:
print("Current title name is " + TitleName2)
time.sleep(2)
deftearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
————————————————
版权声明:本文为CSDN博主「lonlon29」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lonlon29/article/details/79112830
1.选择下拉列表元素(包括选择时间的弹框)是要设置等待时间
用: time.sleep() ,不能用driver.implicitly_wait()
2.加载同个文件夹下的全部测试用例
diascover加载测试用例
1.discover方法里面有三个参数:
-case_dir:这个是待执行用例的目录。
-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本(正则表达匹配)。
-top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。
2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,这样就可以用unittest里面的TextTestRunner这里类的run方法去执行。
如:
# 用例路径
case_path = os.path.join(os.getcwd(), "case")discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py", top_level_dir=None)
print(discover)
runner = unittest.TextTestRunner()
runner.run(discover)
3.http://www.51testing.com/html/11/n-3711311.html,异常
2. 根据相对关系定位
根据其附近的父节点、子节点、兄弟节点定位,关于这方面,博主之前的一篇文章可作为参考:Python selenium —— 父子、兄弟、相邻节点定位方式详解
3. 根据DOM顺序index定位
这个很简单,找到该元素在主文档或某级父节点中的index,然后根据index可轻松定位,不过这种方式可能不够稳定,如果可以,还是用其他的方法定位更加合适。
4. 根据部分元素属性定位
xpath中提供了三个非常好的方法来为我们定位部分属性值:
1
2
3
driver.find_element_by_xpath(
"//p[contains(@id, 'btn-attention')]"
)
driver.find_element_by_xpath(
"//p[starts-with(@id, 'btn-attention')]"
)
driver.find_element_by_xpath(
"//p[ends-with(@id, 'btn-attention')]"
) # 这个需要结尾是‘btn-attention’
contains(a, b) 如果a中含有字符串b,则返回true,否则返回false
starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false
ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false
6. 根据父,子, 兄弟节点定位元素
https://blog.csdn.net/huilan_same/article/details/52541680
7.目前很多H5的页面,前端开发的框架如果使用的是vue,用$就不行,所以此方法行不通,后来用js就解决了
# 这个命令不行
$('.btn').trigger('click')
$('.btn').eq(0).trigger('click')
# 执行js,在vue框架下可以用
js = 'document.getElementsByClassName("btn")[0].click();'
driver.execute_script(js)