xpath灵活的高级语法与python UI自动化测试

xpath灵活的高级语法与python UI自动化测试

一、xpath中更灵活的两种语法
1、 contains: 某个元素的某个属性或者文本值包含了什么,例如://[contains(@class,'test')],表示该元素的class的值包含了 test
例子://
[@id='su'] 获取id 的属性为'su' 的值或//input[contains(@class,'bg s_btn')]

image.png

//input[contains(@value,"百度")]

image.png

//input[contains(@type,"submit")]

image.png

//a[contains(text(),"搜索历史")]

image.png

//a[text()=" 搜索历史 "]
最好复制,历史后面有空格

image.png

2、starts-with:某个元素的某个属性或者文本值以什么开始,例如://[starts-with(@class,'test')],表示该元素的class的值以test开始
例子://
[starts-with(@class,'btn self')]

image.png

//*[starts-with(@type,'sub')]

image.png

2、切换frame:frameset跟其他普通标签没有区别,不会影响到正常的定位,跟普通元素写xpath是一样的,但是frame与iframe里面的元素,需要切换进去才能操作到其中的元素。
如果脚本报什么元素找不到:在你确认xpath没写错的情况下,先去观察该元素上下级有没有frame标签。或者F12,CTRL+F直接frame 或者iframe搜索

image.png

image.png

切换frame:switch_to_frame(id,name,frame的xpath)

3、常用js方法:JavaScript可以获取浏览器提供的很多对象,并进行操作。
浏览器开发者工具F12-elements-console:
window就是一个对象;表示浏览器窗口
window.open(url)
window.innerWidth
window.innerHeight
window.outerWidth
window.outerHeight

image.png

滚动条:window.scrollTo(0,document.body.scrollHeight)

image.png

window. scrollBy(0,document.body.scrollHeight)

image.png

下面这样才行
image.png

window.scroll(x,y)是让window滚动条滚动到那个x,y坐标。//x是水平坐标,y是垂直坐标。
window.scrollBy(-x,-y)是让window滚动条相对滚动到某个坐标,- 10即相对向左/向上滚动10像素。
window.scrollTo(x,y)和window.scroll(x,y)一样。

image.png

非页面类型的滚动条:document.getElementsById(id)[0].scrollTop=''
document:表示当前页面对象,先找到滚动条所在的页面元素,再用scrollTop
scrollTop元素滚动条内的顶部隐藏部分的高度。
scrollTop属性只有DOM元素才有,window/document没有。
例子:待补充

HTML在浏览器中以DOM形式表示为树形结构,document对象就是整个DOM树的根节点,然后去操作子节点
获取当前标题:document.title
输入文本的值:document.getElementById(id).value=''
document.getElementsById(id)[0].value=''
操作标签: document.getElementById(id).click()
document.getElementsById(id)[0].click()

image.png

更改属性: document.getElementById('vip').style.visibility='visible'
例子:待补充

如果该元素没有id或者name,可以用querySelect方法
document.querySelector("该元素的css").click()

4、自动化用例动态读取excel表里面的数据,典型的数据驱动实例
a.安装python操作excel依赖的模块: pip install xlrd
xlrd(读取excel) xlwt(写入excel)

import xlrd,xlwt   
#excel =xlrd.open_workbook(r'C:\Users\MIME\Desktop\test.xlsx')
#获取本地绝对路径的excel
excel =xlrd.open_workbook('test.xlsx')  #本python文件所在的路径下
sheet = excel.sheet_by_index(0)       #取该excel的第一个sheet
print(sheet.nrows,sheet.ncols)        #表示获取sheet中的行,列数

实例:新建excel,写入用户名和密码的测试数据,写一个测试用例(登录),依次去读取excel表的数据,
     实现打开一次浏览器,和打开多次浏览器登录
实现打开x(excel表中的数据多少组)次浏览器
    #定义登录方法:
    def login(username,password):
        driver = webdriver.Chrome()
        driver.get("http://127.0.0.1:5000/")
        driver.find_element_by_xpath("").click()   点击登录按钮
        driver.find_element_by_xpath("").send_keys()  输入用户名
        driver.find_element_by_xpath("").send_keys() 输入密码
        driver.find_element_by_xpath("").click()   点击signin 按钮登录
    #循环去取excel数据,循环的是excel的行数(sheet.nrows)
    for i in range(sheet.nrows):
        username = int(sheet.row_values(i)[0])
        password = int(sheet.row_values(i)[1])
        print('第{0}行,用户名{1},密码{2}'.format(i,username,password))            获取每一行的数据:用户名和密码
        login(username,password)                                                       调用登录方法
仅打开一次浏览器
    #定义登录方法:
    def login():
        driver = webdriver.Chrome()
        driver.get("http://127.0.0.1:5000/")
        driver.find_element_by_xpath("").click()   点击登录按钮
        #循环去取excel数据循环的是excel的行数(sheet.nrows)
        for i in range(sheet.nrows):
            username = int(sheet.row_values(i)[0])
            password = int(sheet.row_values(i)[1])
            print('第{0}行,用户名{1},密码{2}'.format(i,username,password))            获取每一行的数据:用户名和密码
            driver.find_element_by_xpath("").send_keys  输入用户名
            driver.find_element_by_xpath("").send_keys  输入密码
            driver.find_element_by_xpath("").click()   点击signin 按钮登录
    login()     #方法记得需要调用,才会执行

郑州大学官网:俩个用例,灵活运用学过的xpath,鼠标操作,切换frame,切换window

from selenium import  webdriver
from selenium.webdriver.common.action_chains import ActionChains
    俩个用例:
    1.点击院系专业-临床医学系=
    driver = webdriver.Chrome()
    driver.get("http://www.zzu.edu.cn/")
    #切换frame
    driver.switch_to.frame("zzu_top_6")
    tag=driver.find_element_by_xpath("//*[text()='院系专业']")
    ActionChains(driver).move_to_element(tag).perform()
    driver.find_element_by_xpath("//*[text()='临床医学系']").click()
    2.再返回首页点击院系专业下的“更多按钮”
    window_list = driver.window_handles
    driver.switch_to.window(window_list[0])
    #返回首页后需要继续切换frame
    driver.switch_to.frame("zzu_top_6")
    tag=driver.find_element_by_xpath("//*[text()='院系专业']")
    ActionChains(driver).move_to_element(tag).perform()
driver.find_element_by_xpath("//*[text()='临床医学系']/../..//*[contains(text(),"更多")]").click()


只打开一次浏览器
条件:不管excel表中的某一行的用户名和密码,是否是正确的数据,都不影响自动化脚本去读excel表下一行中的数据,实现登录,
例如excel表中的数据可能是这样的:
15902127953 123456 第一行 正确的用户名和密码
159021 123 第二行 错误的用户名和密码
15902127953 123456 第三行 正确的用户名和密码
159021279 123 第四行 错误的用户名和密码


import xlrd, xlwt

excel = xlrd.open_workbook(r'C:\Users\MIME\Desktop\test.xlsx')
sheet = excel.sheet_by_index(0)
def login():
    driver = webdriver.Chrome()
    driver.get("http://127.0.0.1:5000/")
    driver.find_element_by_xpath("/html/body/a").click()
    # 循环去取excel数据循环的是excel的行数(sheet.nrows)
    for i in range(sheet.nrows):
        username = int(sheet.row_values(i)[0])
        password = int(sheet.row_values(i)[1])
        print('第{0}行,用户名{1},密码{2}'.format(i, username, password))
        driver.find_element_by_xpath("/html/body/form/p[1]/input").send_keys(username)
        driver.find_element_by_xpath("/html/body/form/p[2]/input").send_keys(password)
        driver.find_element_by_xpath("/html/body/form/p[3]/button").click()
        '''第一种方法'''
        # ele=driver.find_elements_by_xpath("//*[text()='welcome15902127953']")
        # if len(ele)>0:
        #     driver.back()
        try:
            driver.find_element_by_xpath("//*[text()='welcome15902127953']")
            return True
        except NoSuchElementException as e:
    return False