Selenium自动化

定位元素

  • 利用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提供了三种选择某一项的方法

  1. select_by_index #通过索引定位
  2. select_by_value #通过value值定位
  3. 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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容