一:基于python + selenium + unittest 自动化测试框架元素定位的常用几种方法:
定义一个页面中的元素:
1:find_element_by_id() (通过查看元素属性 id 来进行定位)
2:find_element_by_name() (通过查看元素属性 name 来进行定位)
3: find_element_by_class_name() (通过查看元素属性 class name 来进行定位)
4:find_element_by_xpath() (对于一个元素没有 id、name、class属性,那么可以通过 xptah来进行定位;2:还可以通过xpath标签来通过筛选,如果不想用标签名可用 * 号表示任意标签:3:如果想用具体标签可直接写标签名称;4:还可通过xpath的层级关系来进行定位查找;
5:如果想通过xpath 索引来进行定位则需要注意xpath 这里的索引是从1 开始的,和python 的索引有点不一样;)
eg:再加上xpath模糊匹配的功能有些时候用的还是比较多:
driver.find_element_by_xpath("//*[contains(text(),‘hao123']") .click 模糊匹配
driver.find_element_by_xpath("//*[contains(@id,'kw']") .click 模糊匹配某个属性
driver.find_element_by_xpath("//*[starts-with(@id,'s_kw_']") .click 模糊匹配以什么开头
driver.find_element_by_xpath("//*[starts-with(@id,'kw_warp']") .click 模糊匹配以什么结尾
driver.find_element_by_xpath("//*[matchs(text(),'hao13']") .click 支持正则表达式
5:find_element_by_tag_name() (通过查看元素 tag属性来进行定位,也就是最前面的 input标签(一般在一个页面中相同的标签比较多所以一般建议不用标签来定位)
6:find_element_by_link_text() (通过页面链接文字来进行定位)
7:find_element_by_partial_link_text() (有时候链接字符串文字较长,这时候可用模糊匹配方式来截取其中一部分字符串来进行定位)
8:find_element_by_css_selector() (通过css 来进行定位;2:css 也有对应的索引来定位,层级中可通过索引 option:nth-child(1)来定位该层级的子元素,)
同样的也有对应查找多个元素,那么这些方法返回的就是一个列表:
1:find_elements_by_id()
2:find_elements_by_name()
3:find_elements_by_class_name()
4:find_elements_by_xpath()
5:find_elements_by_tag_name()
6:find_elements_by_link_text()
7:find_elements_by_partial_link_text()
8:find_elements_by_css_selector()
二:对于select 下拉框的元素定位:
1:二次定位 先定位到 select 框,再定位 select 里的选项;
eg : driver.find_elements_by_class_name("ui-select-txt")[1].click() ; tt=driver.find_elements_by_class_name("ui-select-pop")[4].click() (ERP 中选择仓库下拉select选择)
2:通过xpath 直接定位,这个就需要看这个select 是否支持直接定位,比如我们项目中的下拉选择如果直接定位则会一直提示元素找不到 会报错
3: 还有一些select 中的其他方法定位
select_by_index() (通过索引定位) eg: s = driver.find_element_by_id("nr") Select(s).select_by_index(2)
select_by_value() (通过value值定位) eg : s = driver.find_element_by_id("nr") Select(s).select_by_value("20")
select_by_visible_text() (通过文本值定位)
deselect_all() (取消所有选项)
deselect_by_index() (取消对应 index 选项)
deselect_by_value() (取消对应 value 选项)
deselect_by_visible_text() (取消对应文本选项)
first_selected_option() : (返回第一个选项)
all_selected_options() : (返回所有的选项)
三:存在 frame 和 iframe,导致使用上面元素定义一直定义不到,这时候需要考虑是否存在这两个frame 和 iframe 的页面框架, frame 指的是整个页面的框架,iframe是内嵌的网页元素
<frame></frame>所包含的内容是一个独立的可独立显示的; <iframe></iframe> 是在网页中嵌入这段内容代码,所包含的内容与整个页面的一个整体
如果存在iframe ,定位的时候需要先定位到 iframe 上,可用 switch_to_frame() 方法 进入到 iframe 内,再进行元素的定位操作,操作完成之后需要跳出 iframe ,重新回到当前页面进行其他元素的操作,可以用 switch_to_default_content()方法返回到主页面 ;
四:通过WebElement接口可以获取常用的值 eg:
1: size 获取元素尺寸; size = driver.find_element_by_name("wd").size print size;
2: text 获取元素文本; news= driver.find_element_by_name("wd").text print news;
3: get_attribute(name) 获取属性值; href = driver.find_element_by_xpath("//div[@id='u1']/a[2]").get_attribute('href') print href;
4: driver.title 返回页面标题
5: current_url 获取当前页面的URL
6: is_displayed() 设置该元素是否可见
7: is_enabled() 判断元素是否被使用
8: is_selected() 判断元素是否被选中
五:总结
1: 如果属性有 id 或者 name 那可最好使用这个来定位;
2:第二个就是根据自己比较喜欢并且比较简单的定位方式去定位到元素,比如我就喜欢用 xpath 或者 css 或者 class name 等,如果这些也定位不到元素再去试着用其他的方式进行定位;