【selenium自动化测试】多种下拉框定位及选择

2019-06-08  本文已影响0人  玉米fight

最近在忙项目的测试工作,需要频繁操作一个功能模块,可通过UI自动化的方式去实现,最适用于WEB端的就是selenium框架了,一般来说关于页面元素不同类型有对应的xpath、css定位和属性操作方法,input输入框有sendkeys属性,button按钮有click属性等,自己的项目中涉及很多下拉属性框,在实际操作中,总结有2种类型定位的区别:

1、普通select下拉框定位&选择
若页面HTML代码为以下格式:

<select id="selectId">
<option></option>
<option value="1" id="id1">1</option>
<option value="2" id="id2">2</option>
<option value="3" id="id3">3</option>
</select>

可以通过导入select类来操作

from selenium.webdriver.support.ui import Select

select类提供的方法有如下:

select_by_index(index)     #获取下标,下标从0开始
select_by_value(value)     #选择option标签的一个属性值value=xxx的项
select_by_visible_text(text)    #option标签中间值

具体实现如下:

from selenium import webdriver
from selenium.webdriver.support.ui import Select

browser = webdriver.Chrome()
browser.get('http://localhost/index.html')

s1 = Select(driver.find_element_by_id('selectId'))      # 查找select下拉框并实例化Select
s1.select_by_index(0)  # 选择第一项:1
s1.select_by_value("2")  # 选择value="2"的项
s1.select_by_visible_text("3")  # 选择text="3"对应项
driver.quit()

2、下拉列表包含另外一个文档的内联框架&下拉列表需调用接口返回值(本项目涉及)
现提示对于xpath、css定位准确度校验的方式:
1)打开开发者工具,选择console
2)键入xpath【格式为:$x("")】或css【$$("")】的元素路径,当下方内容存在值时则表示定位正确

开发者工具-consle控制台.png
根据上面的定位,我们试着在代码中实现一下:
browser.find_element_by_id("s2id_autogen19")       #查询下拉框id,但这个id是随机生成的,所以查询不到元素
browser.find_element_by_xpath(".//*[@class='row ac'][1]/div[1]/a").click()    #根据下拉框class的xpath定位,依然无法查询到元素

疑问点就来了,上述通过xpath定位为什么会找不到呢?明明在console里面可以查到?这里的解决思路在于:①解决内联框架xpath定位问题;②选取下拉列表值


内嵌框架的下拉框.png

①内联框架xpath定位和触发接口
重新再来看看我们下拉框在整个HTML中的位置,我们可以看到,我们的输入框是嵌在另一个iframe中的,在console中是可以识别的,但是通过脚本是没有办法自己去iframe中去定位元素的,这时候需要切换到iframe中,再进行xpath定位

    browser.switch_to.frame("undefined")   #切换新的frame
    browser.find_element_by_xpath(".//*[@class='row ac'][1]/div[1]/a").click()   #调用get方法获取后台返回数据
    time.sleep(3)

②选取下拉列表值
获取值有几种方式,这里等同于普通下拉框的选择,index、value、title等

browser.find_element_by_xpath("//option[@title='xxx公司']").click()

这里之所以用title,是为了后续的数据扩展性,毕竟value、index值不适合做传参处理。

另外,若下拉列表不需要请求数据,可直接选择我们要的元素

driver.find_element_by_xpath(".//*[@class='row ac'][1]/div[1]/a/option[2]").click()
上一篇 下一篇

猜你喜欢

热点阅读