元素定位的方法---gui测试

元素定位的方法---gui测试,第1张

GUI :graphic user interface 基于图像化界面软件程序 自动化测试: 利用 工具 或 代码 代替人工对软件,系统进行自动的测试。(自动的运行用例,并判断预期和实际,生成结果。) 自动化测试环境部署: 1. 安装 : 准备 chrome ,Firefox, edge ,id ,safari 2.安装 selenium 库  ------>pip install -U selenium [ U 表示更新] 3.准备浏览器对应的驱动:每个浏览器都有自己的驱动,驱动的版本要和浏览器的版本一致. 查看浏览器的版本:以谷歌chrome为例:在谷歌浏览器中输入chrome://verson/ 4.再去下载驱动器包---------->哪里下载? [谷歌浏览器] https://chromedriver.storage.googleapis.com/index.html [火狐浏览器] https://github.com/mozilla/geckodriver/releases [微软edge浏览器] https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ [微软IE浏览器] https://selenium-release.storage.googleapis.com/index.html  5. 将驱动器解压后,exe放在python的包下面。

 6.如何验证部署是否正确?【能打开浏览器-->能访问百度网站】

1. HTML页面基本结构 --> html文档头部区域,不可见 --> html文档内容部分,可见 2. 常见的页面元素: 容器型元素:div,form,table 页面元素:link,img,input(button, text, file),select(下拉框),checkbox(复选框),radio(单选框), textarea(文本域),submit(提交) web 页面基础知识: 所有的页面元素都在 html 页面中,以元素标签的形式在源码中展现出来。 标签一般有两种形式,一种是有开始结束标签的元素,比如 . 另外一种标签是自结束标

签,比如 HTML :提供了整个页面的骨架和结构,页面上有哪些元素就由 html 语言来定义。 CSS :层叠样式表。用于美化界面元素。 Javascript :定义页面元素的行为和动作。 什么样的项目适合自动化? 1.需求稳定,不会频繁变更 2.研发和维护周期长,需要频繁执行回归测试 3.需要在多种平台上重复运行相同测试的场景(兼容性) 4.性能兼容性通过手工测试无法实现,或者手工测试成本太高 5.被测试软件的开发较为规范,能够保证系统的可测试性 6.测试人员具备一定的编程能力。 driver常用代码:
#在代码中常用开头
from selenium import webdriver # 导入webdriver模块 
import time # 导入时间相关的库 
driver = webdriver.Chrome() # 新建一个webdriver的实例 
driver.maxisize_window()  #最大化窗口
driver.get("https://www.baidu.com") # 打开百度首页 
driver.find_element('id', 'kw').click() # 定位到id为kw的元素并点击它 driver.find_element('id', 'kw').clear() # 定位到id为kw的元素并清空里面的内容 driver.find_element('id', 'kw').send_keys('webdriver') # 定位为id为kw的元素并输入webdriver driver.find_element('id', 'su').click() # 定位到id为su的元素并点击它 
time.sleep(2) # 休眠2秒 driver.close() # 关闭浏览器

#其他不太常见的 *** 作
'''获取网页源码:driver.page_source 
获取窗口名称:driver.name 
获取页面标题:driver.title 
获取当前页面url地址:driver.current_url 
获取当前页面截图:driver.get_screenshot_as_file(path)
最小化浏览器:dr.minimize_window()
设置窗口的位置: dr.set_window_position(500,500)
设置窗口的大小:dr.set_window_size(600,600)
关闭浏览器:dr.quit()
关闭当前的窗口: dr.close()
前进:dr.forward()
后退:dr.back()
刷新:dr.refresh()
获取标题:dr.title


'''
常用元素定位方法 id, name , class name(特指具有class属性的元素) ,css selector,tag name ,link text ,partial link text , xpath
from selenium import webdriver   #从selenium里面导入webdriver
import time #导入时间
driver=webdriver.Chrome()      #指明浏览器用chrom浏览器
driver.maximize_window()       #窗口最大化
driver.get("https://www.baidu.com")  #打开网页


def func1():
    driver.find_element('id','name').send_keys('saber')
def func2():
    driver.find_elements('name','sex')
    '''elements返回的是一个列表,所有元素是sex的列表,找不到就是空列表。
    不能对列表进行直接切片,用下标进行 *** 作,如drive.find_elements('name','sex')[0].click'''
    driver.find_element('name','sex')    #element返回的是找到的第一个元素,没有就是None。
def func3():
    driver.find_element('class name','border').send_keys('hello')
#填写多个class   【注意:空格用点号.代替】,如('class name','class1.class2.class3')--->有些classname不止一个值,以空格隔开。定位时空格改成点。
def func4():
    inputs=driver.find_elements('tag name','input')  #找出所有标签为input的元素
    # print(len(inputs))
def func5():
    driver.find_element('link text','打开百度').click()  #使用link text打开超链接.

def func6():
    driver.find_element('partial link text','百度').click()  #使用部分匹配定位超链接
    

xpath是一种万能的定位方法:


def func1():
    driver.find_element('xpath',"//input[@mode='sub']").send_keys('content') #元素是input,属性是mode,值是sub
def func2():
    driver.find_element('xpath',"//input[@type='text'and @mode='sub']").send_keys('content')#用多个属性进行定位
def func3():
    driver.find_element('xpath',"//tbody/tr[3]/td[2]/i").click()     #用绝对路径定义,检查中点击元素行,copy path
def func4():
    driver.find_element('xpath',"//texttera[contains(@placeholder,'introduction')]").send_keys('content')
    #用模糊匹配。texttera中有placeholder中包含了introduction。
def func5():
    driver.find_element('xpath',"a[text()='打开百度']").click()  #文本节点,中间有个打开百度的文本。

#结合使用:
#eg:路径+模糊匹配
def func6():
    driver.find_element('xpath',"//tobody/tr[contains(@placeholder,'name')]").send_keys('content')
#有相同元素和属性的可以下标表示第几个
def func7():
    driver.find_element('xpath',"(//input[@mode='add'])[2]").send_keys('content')

如何才能验证写的xpath对不对?

ctrl+f,打开选择框

第二步:输入表达式,查看是否正确定位。

举例:1.上级元素是唯一的,通过相对路径来找到元素。

 2.无文本内容,属性中包括唯一、有标志性的字符,而且内容很长的。

 3.有文本内容的,xpath写法,(‘xpath','a[text()="内容"]'),不只是a开头的文本节点,也可以

 4.在父级及以上有唯一的元素,可以通过相对路径。(和其他的xpath方法结合)

元素 *** 作:

获取元素的html : 元素对象.get_attribute("outerHTML")   【outerHTML  固定的单词】
获取元素的文本:元素对象.text
获取元素的value: 元素对象.get_attribute("value")    【输入框用的多】
获取元素的任意属性:  元素对象.get_attribute("属性值")
获取元素的标签名: 元素对象.get_attribute("tagName")
获取元素的尺寸【selenium 4 新增】:元素对象.rect
给元素输入文本:元素对象.send_keys("要输入的文本")
清空元素的文本: 元素对象.clear()
点击元素: 元素对象.click()
判断元素是否被选中:元素对象.is_selected()
判断元素是否可用:元素对象.is_enabled()   ————>结构中有disabled
判断元素是否可见:元素对象.is_displayed()  ————>可见:结构中有,style='dispaly:block',不可见:结构中有,style='display:none'

例如:

 在已有的selenium方法不够用的时候,可以使用JS脚本来 *** 作。---->常见于时间日期的选择等。

如何用selenium执行JavaScript?

第一步:拷贝js定位:检查--定位到元素---右键:copy---copy JS path

第二步:调用,driver.exexute_script(脚本,可选的参数),几乎是万能的。-

常见的命令:1 . 滑动窗口: window.scrollTo(x方向的值,y方向的值)

                      2.  设置元素的value属性: js定位元素.value=新的值

                      3. 设置元素的text : js定位元素.textContent="新的text"

代码写法:例如:

driver.execute_script("copy来的js path.value='2022-05-20'")   #给元素设置value属性,并输入值。

也可以js定位和selenium中的定位一起写。比如:

element=driver.find_element('id','springdata')

value='2014-01-01'

driver.execute_script('arguments[0].value=arguements[1]',element,value)  #arguement是占位符,必须是这个单词。原理:arguments[0]=element,arguments[1]=value

设置等待时间:

1.强制/固定等待:time.sleep() 优势:用法非常简单,一般用于项目调试,或者用于等待元素状态、文本发生改变。 劣势:等待时间固定,不够灵活,如果脚本中大量使用会导致脚本运行效率低 2.隐式等待:driver.implicitly_wait(10) 设置一次后(记住:隐式等待只需设置一次), 全局有效 ,在元素没 有出现时最多只等待指定时间,但如果在等待时间内,什么时候元素 出现什么时候停止等待。 注意,隐式等待只能解决NoSuchElementException这种异常,也就 是因为元素不存在引起的异常,因为其他原因导致的问题无法解决。 3.显式等待 可针对每一个元素进行单独设置 ,等待条件更加灵活。---最长等待时间 注意:如果显式等待和隐式等待同时设置,以最长等待时间为准。 常见EC方法 title_is(strtitle):判断当前页面的title是否精确等于预期 title_contains(strtitle): 判断当前页面title是否包含指定字符串 presence_of_element_located(locator) :判断某个元素是否被加到了dom树里,并不代表该元素一定可见 visibility_of_element_located(locator):判断某个元素是否肉眼可见,可见代表元素非隐藏,并且元素的宽和高都不等于0 invisibility_of_element_located(locator):判断某个元素是否不可见 element_to_be_clickable(locator):判断某个元素中是否可见并且 是enable的,这样的话才叫clickable text_to_be_present_in_element(locator):判断某个元素中的text 是否包含了预期的字符串
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

login=WecDriverWait(driver,10,0.5).until(EC.title_contains('百度知道'))
#driver是webdiver.chrome()的对象,10是最长等待时间,0。5是每0.5秒去查询对应的元素。
#util后面跟等待的具体条件。EC表示判断,表示在10秒内,每0.5秒就去查询一次对应的元素,直到标题含有百度知道,再去进行下一步。如果十秒内没有出现,则报错。
Webdriver常用API-元素 *** 作 clear:清除文本框内的文字 send_keys:向文本域或文件上传按钮发送文字内容 click:点击按钮 text:获取对象的文本节点信息,如果该对象没有文本节点,则为空 get_attribute(name):获取元素指定的属性信息 is_displayed:判断元素是否显示出来 Webdriver执行JS,滚动页面
driver.get('https://www.baidu.com')
driver.maximize_window()
driver.find_element('id', 'kw').send_keys('python')
driver.find_element('id', 'su').click()
time.sleep(1)
driver.execute_script('window.scrollTo(0, 3000);')  #纵向滚动,从0到3000
#解决问题---》element is not attached to page document

下拉列表:

from  selenium.webdriver.support.ui import Select
Select (driver.find_element('id','name')).select_by_visible_text('小明')  #下拉框的定位在id=name,用文本选择小明
Select (driver.find_element('id','name')).select_by_value('50') #用value属性来选择
Select (driver.find_element('id','name')).select_by_index(1) #用下标来选择,选择下标为1的值。
#随机选择一个:
#第一种:
options=driver.find_elements(By.XPATH,"//selecet/option")
random.chioce(options).click()   #随机选择一个进行点击
time.sleep(2)
#第二种
select_element=driver.find_element(By.ID,"city")
my_city_select=Select(select_element) #必须是Select元素
options=my_city_select.options   
random.choice(options).click() #随机选择一个进行点击

报错及其解决方法:

element not interactable exception:元素不可交互异常

1.该元素的属性的值不只一个地方

2.元素的属性或者值写错了。

3.一般是由于元素在界面上不可见,或者被遮挡引起的。(被隐藏,或者窗口未完全打开,找不到)被隐藏-----》.is_display,查看是否展现;窗口被遮挡----->maxisize_window)

No suchelementexception:

1.检查代码是否写对。(尤其注意大小写)

2.设置隐性等待

3.检查目标元素是否包含在iframe中

4.检查目标元素是否在多窗口中。

iframe *** 作:

#1、先切进来,找到元素
#切换并进入的方法:dr.switch_to.frame( ID  或 name 或 index  )
[1]dr.switch_to.frame("baidu") #通过id
[2]dr.switch_to.frame("zhidao") #通过name
[3]dr.switch_to.frame(0) #通过index 从0开始的
[4]dr.switch_to.frame( 定位的iframe元素 )
   如:driver.swich_to.frame(driver.find_element('id','login_frame')).send_keys()
#2.再切出去,切到最外面
driver.switch_to.default_content()

#3.其他 *** 作--->切换到上一级的方法:dr.switch_to.parent_frame()

alert窗---->d窗,且右键没有检查,无法通过元素定位:先点击click,一旦出现d窗,必须先处理d窗的内容

driver.switch_to.alert  #切入到d窗里
print(driver.switch_to.alert .text)  #打印d窗里的内容
driver.switch_to.alert.accept()  #点击确定按钮
driver.switch_to.alert.dismiss() #点击取消按钮

 dr.switch_to.alert.send_keys("想要输入的文本")  #在d窗中输入文本

文件上传:

driver.find_element('xpath',"//input[@type='file']").send_keys(绝对路径)

多窗口 *** 作:

from selenium import webdriver
curhandle = driver.current_window_handle #获取当前窗口
allhandles = driver.window_handles #获取所有窗口,是一个列表
#print(allhandles)
for handle in allhandles: #循环判断窗口是否为当前窗口
    if handle != curhandle: #不是当前窗口即进行切换.
       driver.switch_to.window(handle)      #切换过去
driver.find_element_by_id('test_id1').click()  #切过去的 *** 作
driver.close()
driver.switch_to.window(curhandle) #切换回来,断续进行其它 *** 作
driver.find_element_by_id('test_id2').click()

driver.switch_to.window(driver.window_handles[1]) #切到第二个窗口

定位悬浮类(鼠标放在上面出现,有提示;鼠标移走,消失)--->导入动作链

import ActionChains  #导入动作链

setting=driver.find_element('id','name')   #浮点的定位
ActionChains(driver).move_to_element(setting)
perform()

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/940962.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-17
下一篇2022-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存