selenium用于web应用程序的自动化测试工具,支持多种浏览器、多种脚本语言编写及录制的工具。
测试过程可以使用python+selenium进行做UI界面自动化,UI界面自动化一个基础核心是元素定位。
selenium提供了单元素定位和多元素定位,2种方式都有8种元素定位方式:
单元素定位方法:
find_element_by_id:通过元素id属性定位 (find_elements_by_id:多元素定位,返回是列表定位位置,默认定位到第一个,索引是从0开始,其他几种多元素定位类似)
find_element_by_name:通过元素name属性定位
find_element_by_xpath:通过元素xpath定位
find_element_by_tag_name:通过元素标签名属性定位
find_element_by_link_text:通过元素文本链接属性定位
find_element_by_partial_link_text:通过元素部分文本链接属性定位
find_element_by_class_name:通过元素类属性名定位
find_element_by_css_selector:通过元素css定位
多元素定位方法:
find_elements_by_id:通过元素id属性定位,多元素定位,返回是列表定位位置,默认定位到第一个,索引是从0开始,其他几种多元素定位类似
find_elements_by_name:通过元素name属性定位
find_elements_by_xpath:通过元素xpath定位
find_elements_by_tag_name:通过元素标签名属性定位
find_elements_by_link_text:通过元素文本链接属性定位
find_elements_by_partial_link_text:通过元素部分文本链接属性定位
find_elements_by_class_name:通过元素类属性名定位
find_elements_by_css_selector:通过元素css定位
下面看一下实例:
定位百度输入框,下面是对应的html代码
1 from selenium import webdriver 2 from selenium.webdriver.common.by import By 3 4 driver = webdriver.Chrome() 5 driver.find_element_by_id("kw") 6 driver.find_element_by_name("wd") 7 driver.find_element_by_xpath('//*[@id="kw"]') 8 driver.find_element_by_css_selector('#kw') 9 driver.find_element_by_class_name('s_ipt')
定位新闻链接:
1 driver.find_element_by_link_text("新闻") 2 driver.find_element_by_partial_link_text('新')
tag_name标签名称定位一般用于定位多元素定位
通过input标签查找百度输入框,返回是列表,索引是从0开始
1 s = driver.find_elements_by_tag_name("input") 2 print(s[7].get_attribute('id'))
在做界面测试时经常会遇到因页面加载慢或者网速问题,导致元素加载出来时间不确定,脚本执行不稳定,因此在找出元素时可以进行增加显示等待时间,
增加脚本的稳定性,可以对定位元素的方法进行二次封装
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By class Page(): def __init__(self,driver): self.driver = driver def find_element(self,*loc): try: wait = WebDriverWait(self.driver,timeout = 10) wait.until(lambda x:x.find_element(*loc).is_displayed()) return self.find_element(*loc) except TimeoutException: raise "Time out" def find_elements(self,*loc): try: wait = WebDriverWait(self.driver,timeout = 10) wait.until(lambda x:x.find_elements(*loc).is_displayed()) return self.find_elements(*loc) except TimeoutException: raise "Time out"