selenium学习1:元素定位

#web自动化基本理论

,自动化简介
需求分类:
    显性需求:需求文档
    隐性需求:用户习惯
        	行业标准
            竞品功能
删除:硬删除:直接在数据库中将数据删除
     软删除:在数据库中做标记
自动化测试可以用于兼容性测试
在测试流程中,分析和设计是重中之重
1软件系统三层结构:
    1,客户端

	2,服务端

	3,数据库
 协议:

自动化测试的分类:代码级,接口级,页面级
    优先级别 :接口级>页面级>代码级
二,适合做自动化项目的要求
1,需求变动不频繁
2,项目周期较长
3,自动化测试脚本可重复使用
自动化适合用的地方
1,回归测试
2,兼容性测试
3,迭代项目中,成熟功能

三,自动化常用测试工具
XUnit:Junit,Cppunit,UNnit,PyUnit...单元测试工具
XMock:JMock,NMock...
    2,接口级自动化常用工具:
        loadRunner:支持全协议,重点支持HTTP...
         SOAPUI
        Webload
        PPT(IBM)
        JMeter(APache)
        浏览器插件:postman,RESTClient

web 自动化一:浏览器的基本操作和元素定位

一,搭建环境

1,安装selenium
 pip install selenium
2,安装浏览器驱动
https://chromedriver.storage.googleapis.com/index.html---->谷歌浏览器驱动地址
    安装步骤:
        1,下载对应版本的浏览器驱动文件
        2,解压下载文件,将里面的exe文件复制到python的安装根目录下
        3,将下载
        注意事项:
               1)浏览器驱动必须和测试的浏览器相对于,即谷歌浏览器必须用谷歌浏览器驱动,火狐浏览器必须用火狐浏览器驱动
               2)驱动的版本必须和浏览器版本一致


二,浏览器的基本操作

#f12可以查看网页源码

1.1 打开浏览器,关闭浏览器,窗口最大化,自定义窗口大小
	步骤:
	#导包
   from selenium import webdriver
    import time
    #打开浏览器--->语法:变量=webdriver.浏览器名
    driver=webdriver.Chrome()#driver是一个变量接收,也可以定义成其它的,一般是这个,浏览器首字母必须大写
    #传入要打开的网页
    driver.get("http://www.baidu.com")#地址一定要写全,也可以先定义一个变量来保存地址,然后在这儿传入变量
    
    #操作页面
    driver.set_window_size(300,300)#浏览器当前页面宽,高进行设置
    time.sleep(4)#等待时间
    driver.maximize_window()#窗口最大化(经常用到)
    time.sleep(4)#等待时间
    driver.quit()#退出浏览器
1.2浏览器的前进,后退,刷新
    #导入模块
    from selenium import webdriver
    from time import sleep
    #打开浏览器
    driver=webdriver.Chrome()
    #窗口最大化
    driver.maximize_window()
    sleep(2)
    driver.get('http://www.baidu.com')#访问百度
    sleep(1)
    driver.get('http://www.jd.com')#访问京东
    sleep(1)
    driver.get('http://www.taobao.com')#访问淘宝
    sleep(1)
    #后退
    driver.back()
    sleep(1)
    #前进
    driver.forward()
    sleep(1)
    #刷新
    driver.refresh()
    sleep(3)
    driver.quit()#关闭窗口和驱动
     driver.close()#只关闭当前窗口
1.3,打开手机百度网页
	#1,导入selenium
    from selenium import webdriver
    from time import sleep
    #2,选择让谷歌浏览器模拟的设备
    mobileEmulation={"deviceName":"iPhone X"}---->deviceName固定名称,不可变
    #实例化谷歌浏览器加载项
    options=webdriver.ChromeOptions()
    #3,将设备加载到浏览器加载项
    options.add_experimental_option("mobileEmulation",mobileEmulation)
    #带着加载项打开浏览器
    driver=webdriver.Chrome(options=options)
    #打开百度
    driver.get("http://www.baidu.com")#打开手机百度网页
    sleep(3)
    #退出浏览器
    driver.quit()

三,元素定位

3.1浏览器中F12作用
f12开发者工具
    elements---->做页面自动化
    console---->web项目手工测试
    network--->接口测试
3.2什么是元素定位
元素定位就是查找HTML元素的过程,操作页面元素之前,首先要对元素进行定位,所以定位是自动化脚本编写的开始.
find_element 使用给定的方法定位和查找一个元素
find_elements 使用给定的方法定位和查找所有的元素
通过标签属性定位包括:ID,name,class_name
3.3,元素定位的八大方法
一,通过id定位
当所定位的元素具有id属性的时候,我们就可以通过by_id来定位.
语法:driver.find_element_by_id('id的属性值')
 完整步骤:
      from selenium import webdriver
        #打开浏览器
        driver=webdriver.Chrome()
        #输入网址
        driver.get('E:\web\练习页面\注册A.html')
        #id 元素定位
        A=driver.find_element_by_id('userA')
        如果是find_elements_by_id('userA'),找到是一个列表,后面就不能用get_attribute来查看源码.
        #打印元素
        #print(A)
        print(A.get_attribute('outerHTML'))#查看元素对应的源码
        #关闭浏览器
        driver.quit(), 通过name 定位
 driver.find_element_by_name('name的属性值')
   案例:   #导包
        from selenium import webdriver
        #打开浏览器
        driver=webdriver.Chrome()
        #获取打开的地址
        driver.get('E:\web\练习页面\注册A.html')
        #通过name查找元素
        a=driver.find_element_by_name('userA')
        #查找元素所在的源码
        print(a.get_attribute('outerHTML'))
        driver.quit(),通过class_name定位:找到class就可以用class_name定位
    使用范围:
        1,定位元素有class属性
        2,class属性不是动态的
        3,如果同一个元素,有多个class属性值,class='bg s_ipt_wr quickdelete-wrap',只选取其中一个值即可
    语法: driver.find_element_by_class_name('class 的属性值')
        #导入模快
        from selenium import  webdriver
        #打开浏览器
        driver=webdriver.Chrome()
        #获得网址
        driver.get('http://www.baidu.com')
        #元素定位
        A=driver.find_element_by_class_name("c-tips-container" )
        #打印元素的源码
        print(A.get_attribute('outerHTML'))
        #关闭浏览器
        driver.quit():在HTML页面中,ID是唯一的,而name,class_name不一定是唯一的.,通过tag_name 定位元素---->通过标签定位
语法:单数形式
    driver.find_element_by_tag_name('标签名')
    复数形式
   driver.find_elements_by_tag_name('标签名') 返回的是列表,要取出元素需要遍历
#当页面中有唯一的标签的时候,可以使用单数模式查找
#当页面中有多个标签相同的元素时,使用单数模式,查找出来的是第一次出现的标签源码
#当有多个标签相同的元素时,使用复数形式查找,得到所有标签相同的元素,使用列表遍历的形式对列表具体元素做操作.
单数形式案例:
       from selenium import  webdriver
        #打开浏览器
        driver=webdriver.Chrome()
        #获得网址
        driver.get('E:\web\练习页面\注册A.html')
        #元素定位
        B=driver.find_element_by_tag_name('input')
        #打印元素源码
        print(B.get_attribute('outerHTML'))
        #关闭浏览器
        driver.quit()
复数形式案例:
        #打开浏览器
        driver=webdriver.Chrome()
        #获得网址
        driver.get('E:\web\练习页面\注册A.html')
        #元素定位
        B=driver.find_elements_by_tag_name('input')
        print(len(B))
        #遍历列表
       for i in B:
        #打印元素源码
        	print(i.get_attribute('outerHTML'))
        #关闭浏览器
        driver.quit(),通过超链接定位
  语法: driver.find_element_by_link_text('超链接文本')--->必须输入全部链接文字
        driver.find_element_by_partial_link_text('超链接的文本的部分文字')-->可以输入链接文字里的部分文字,部分内容必须是连续的内容
     精准定位案例:
	#导入模块
    from selenium import webdriver
    #打开浏览器
    driver=webdriver.Chrome()
    #获取网址
    driver.get('http://www.baidu.com')
    #定位元素
    A=driver.find_element_by_link_text('贴吧')
    #打印元素源码
    print(A.get_attribute('outerHTML'))
    #关闭浏览器
    driver.quit()
    模糊定位案例:
        #导入模块
        from selenium import webdriver
        #打开浏览器
        driver=webdriver.Chrome()
        #获取网址
        driver.get('E:\web\练习页面\注册A.html')
        #定位元素
     	#A=driver.find_element_by_partial_link_text('新浪')-->只有一个新浪时用单数模式
        A=driver.find_elements_by_partial_link_text('新浪')
        #打印元素源码--->复数模式要先遍历,才能获取源码
        print(len(A))
        for i in A:
            print(i.get_attribute('outerHTML'))
        #关闭浏览器
        driver.quit(), xpath定位
语法:driver.find_element_by_xpath("xpath表达式")
    xpath表达式:
        路径:绝对路径 /表示绝对路径
            相对路径 //表示相对路径
        1,标签+属性
        //标签名[@属性名='属性值']
        案例:
        from selenium import webdriver
        driver=webdriver.Chrome()#打开浏览器
        url="file:///"+"E:/web/练习页面/Test_Xpath.html"#获取网页地址
        driver.get(url)#打开网页
        A=driver.find_element_by_xpath("//input[@name='name1']")#查找元素
        print(A.get_attribute('outerHTML'))

        2,层级定位:当子标签没有可以供定位的元素时,可以通过定位它的父标签来定位子标签
         语法:变量=driver.find_element_by_xpath("//父标签名[@父标签属性名='属性值']/子标签名")://表示相对路径
            层级定位不仅限于2,可以是多层
        from selenium import webdriver
        #打开谷歌浏
        driver=webdriver.Chrome()
        #打开网页
        driver.get('E:\web\练习页面\注册A.html')
        #用层级定位方法定位元素
        A=driver.find_element_by_xpath("//p[@id='p1']/input")
        #查看元素所在源码
        print(A.get_attribute('outerHTML'))
        #关闭浏览器
        driver.quit()
       3, 索引:
            当一个父标签有多个相同的子标签时,需要加索引
            //父标签[@父标签属性名='父标签属性值']/子标签名[索引值]#xpath索引从1开始
            如果定位的是父标签下的第一个子标签,可以不写索引值.
          案例:       
                #打开浏览器
                driver=webdriver.Chrome()
                #打开网页
                driver.get('E:\web\练习页面\Test_Xpath.html')
                #元素定位
                A=driver.find_element_by_xpath("//form[@id='formID']/input[2]")
                B=driver.find_element_by_xpath("//form[@id='formID']/input[3]")
                #查看元素所在源码
                print(A.get_attribute('outerHTML'))
                print(B.get_attribute('outerHTML'))
                #关闭浏览器
                driver.close()
            4,逻辑:
                当元素属性与其他元素属性有相同部分的时候,不能只利用一个属性定位,需要多个元素属性来进行定位,and
                语法://标签名[@属性名='值' and @属性名='属性值'and.....]
                    案例:
                  # 多个属性定位
                        from selenium import webdriver
                        import  os
                        driver = webdriver.Chrome()
                        url="file:///"+os.path.abspath('练习页面/xpath.html')
                        #os.path.abspath--->返回一个目录的绝对路径
                        #os.path.realpath--->返回指定文件的标准路径,而非链接所在的路径
                        print(url)
                        driver.get(url)
                        # 定位元素
                        A = driver.find_element_by_xpath("//input[@name='user'and @class='login-test']")
                        #打印元素所在源码
                        print(A.get_attribute('outerHTML'))
                        #关闭浏览器
                        driver.close()  
          5,模糊匹配
        contains
        //标签名[contains(@[属性名,属性值或者部分属性值)]]:driver.find_element_by_xpath("//input[contains(@name,'1')]")
                       
         ---->当常用方法无法定位到元素时,可以用Xpath定位方法
     七,css选择器定位
           语法: driver.find_element_by_css_selector('css表达式')
              css表达式:
               1,ID,class 属性
                   .表示class属性
                    #表示id
              2,其它属性--标签+属性
                 标签名[属性名=属性值]
                 案例1,使用标签定位      
                from selenium import webdriver
                import os
                driver=webdriver.Chrome()
                url="file:///"+os.path.abspath("练习页面/注册A.html")
                driver.get(url)
                css_selector=driver.find_element_by_css_selector("#userA")--->#表示ID,使用标签定位
                 css_selector1=driver.find_element_by_css_selector(".TelA")--->使用class定位
                  				              css_selector2=driver.find_element_by_css_selector("input[placeholder='电话A']")-->使用标签+其它属性定位
                print(css_selector.get_attribute('outerHTML'))
                driver.quit()
            3,层级定位
       父标签[父标签属性名=父标签属性值]>子标签或者将'>'换成空格
       B=driver.find_element_by_css_selector("p[id='p1']>input")
       或B=driver.find_element_by_css_selector("p#p1 input")
     4,索引
                       
     父标签[父标签的属性名=父标签的属性值]>:nth-child(索引值),索引从1开始#表示父标签下的第n 个子标签          password=driver.find_element_by_css_selector("div#zc>fieldset>:nth-child(2)>input")
     父标签[父标签的属性名=父标签的属性值]>子标签:nth-of-type(索引),索引从1开始#表示父标签下第n个指定名称的子标签
            5,逻辑
              标签名[属性名1=属性值1][属性名2=属性值2]:password=driver.find_element_by_css_selector('input[type="password"][placeholder="密码A"]')  
            6,模糊匹配
     ^....开头 
        password=driver.find_element_by_css_selector('input[type^="pass"]')               
     $以.....结尾       
        password=driver.find_element_by_css_selector('input[type$="word"]')   
     *匹配所有  :  语法 标签名[属性名*='部分属性值']              password=driver.find_element_by_css_selector('input[type*="word"]')

                       
设置python模板
file-->setting--->file and code templates---->python script
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值