定位元素
- 利用ID定位
driver.find_element_by_id("xx")
- 利用tag name定位
driver.find_element_by_tag_name("form")
- 利用link text定位
driver.find_element_by_link_text("新闻")
- 利用class name定位
driver.find_element_by_class_name("")
- 利用name定位
driver.find_element_by_name("")
- 利用css定位
driver.find_element_by_css_selector("")
Selenium自动化之高亮显示
- 目的:
在UI自动化的时候,有时候我们需要查看运行的过程。
为了更好的显示这个过程,可以进行元素高亮,以显眼的颜色来提示测试人员目前的操作在哪一步。
- 解决方法;
使用js代码来将元素的背景颜色和边框颜色设置成绿色和红色
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @创建时间: 2018/11/22 16:01
ele = driver.find_element('id','xxx') # 定位元素
driver.execute_script("arguments[0].setAttribute('style', arguments[1]);",ele, "background: green; border: 2px solid red;") # 元素的背景色和边框设置成绿色和红色
ele.click() # 元素高亮一般用于点击事件之前,检查元素定位是否正确,方便查看UI自动化的过程
Selenium妙招
利用select模块处理下拉框
select提供了三种选择某一项的方法
- select_by_index #通过索引定位
- select_by_value #通过value值定位
- select_by_visible_text #通过文本值定位
Selenium无法定位元素的9中解决方案
一、rame/iframe表单嵌套
- WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌的页面元素无法直接定位
- 解决方法:
xf = driver.find_element_by_xpath('//*[@class="if"]')
driver.switch_to.frame(xf)
driver.switch_to.parent_frame() #切到父frame。影响性能。
driver.switch_to.default_content() #跳回最外层到页面
二、页面跳转到新的标签页,或者弹出到警告框等
- 解决方法:
driver.switch_to.window(window_handle)切换到新窗口。
首先获取当前窗口等句柄deiver.current_window_handle,接着打开弹出新窗口,获得当前打开的所有窗口的句柄driver.window_handles。
通过for循环遍历handle,如果不等于第一次打开窗口的句柄,那么一定是新窗口的句柄,因为执行过程只打开了两个窗口;
改变条件,如果等于第一次打开窗口的句柄,那么可以切换回第一次打开的窗口。
三、使用Xpath或CSS定位
- 如果一个元素没有唯一属性,那么我们可以一级一级向上查找,直到找到可以唯一定位元素的属性,在向下查找其子元素
find_element_by_xpath("//form[@id='form']/span[2]/input") #首先通过唯一标识属性id=form定位最外层元素,接着找到最外层元素下的第2个span标签为父元素,最后向下查找定位到父元素下标签为input的子元素。
- 如果一个元素不能唯一的区分一个元素,那么使用多个属性来唯一地定位一个元素。
find_element_by_xpath('//input[@id='kw' and @class='su']/span/input) #首先找到标签为input,id=kw且class=su的元素,接着找到其下标签为span的子元素,继续向下查找找到标签为input的子元素。
- 检查Xpath描述是否有误,导致无法定位到元素。
四、页面还没有加载出来,就对页面上到元素进行操作。
- time.sleep()
五、元素被遮挡,不可用,不可见
- 方法1:
driver.maximize_window() #由于窗口大小改变引起的页面元素布局发生变化,被测元素被遮挡,可以先将窗口最大化,再进行元素定位
- 方法2:
.is_enabled() #由于业务原因元素在某些情况下不可用(元素属性disabled,灰显),首先检查测试步骤是否符合业务逻辑,其次确认是否为业务流程上的Bug。
- 方法3:
.is_displayed() 对于属性不一定可见的元素,在定位前首先判断其属性是否可见,是否被隐藏。
使用WebDriver调用JavaScript代码代替无法实现到功能
"""选择日期"""
day = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
# 去掉开始日期元素的readonly属性
js = 'document.getElementById("beginDate").removeAttribute("readonly");'
driver.execute_script(js)
# 清空文本后输入值
driver.find_element_by_id("beginDate").clear()
driver.find_element_by_id("beginDate").send_keys(day)
WX20190820-154834@2x.png