selenium笔记

需要继续学习断言,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:属性值

TargetCSS 3XPath
所有元素*//*
所有的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)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值