彻底学会Selenium元素定位( 五 )

元素定位二次封装在之前的文章中我们介绍过UI自动化测试框架,可参考往期文章「五分钟搞懂 POM 设计模式」 。
框架中的base_page模块对Selenium一些常用的API进行二次封装,其中就有对find_element的封装 。
base_page.py:
class BasePage(object):def __init__(self, driver):self.logger = GetLogger().get_logger()self.driver = driverdef wait_ele_visible_(self, loc, loc_doc, times=3, poll_frequency=0.5):"""等待元素可见:param loc: 元素定位:param loc_doc: 元素描述:param times: 最长等待时间:param poll_frequency: 轮询频率,调用 until 或 until_not方法中的间隔时间,默认为0.5秒:return:"""try:@do_timedef fun():WebDriverWait(self.driver, times, poll_frequency).until(EC.visibility_of_element_located(loc))self.logger.info("等待【{}】元素【{}】出现 , 耗时:{}豪秒".format(loc_doc, loc, fun()))except Exception:self.logger.error("等待【{}】元素【{}】出现失败".format(loc_doc, loc))raisedef find_element_(self, loc, loc_doc):"""查找元素:param loc: 元素定位 例如:login_icon_loc = (By.ID, "sb_form_q"):param loc_doc: 对元素的描述:return:"""try:self.logger.info("开始查找【{}】元素【{}】".format(loc_doc, loc))self.wait_ele_visible_(loc, loc_doc)return self.driver.find_element(*loc)except Exception:self.logger.error("查找【{}】元素【{}】失败".format(loc_doc, loc))raise元素定位总结

  • 首先考虑id定位 , id定位是效率最高的
    一般情况下id属性在当前页面是唯一的 。
    在实际企业项目中,可能需要前端同学的配合,保证元素唯一属性命名规则 。所有可操作元素 , 例如输入框、点击按钮等均需要加id字段 , 并且id字段的命名为元素含义的英文;若当前页面存在两个或多个一样的元素,则第二个开始命名为id=username2,以此类推;多层级元素一般最外层定义即可 。
  • 如果没有id,再选择xpath,一般使用相对路径
  • css_selector比xpath更加稳定
    为什么说css_selector比xpath更稳定?因为我们通过Chrome浏览器的开发者工具可以看出蓝色线代表DOM出现,红色线代表图片等资源已加载完,如果用xpath定位元素,其实是在DOM出现的时候进行查找,而当你使用css_selector进行元素定位的时候 , 它会等待图片资源加载完成后进行查找,也就是红线的位置,所以css_selector比xpath更稳定,当你使用xpath定位不到元素时,不妨尝试使用css_selector 。
    彻底学会Selenium元素定位

    文章插图
  • tag_name使用频率最低
  • 尽量不要用href属性、纯数字的属性(纯数字可能是个动态值)去定位
  • 对于Toast提示框,很快消失的提示框 , 可以点击 开发者工具-sources中的暂停键 后再去定位
    彻底学会Selenium元素定位

    文章插图
  • 添加适当的等待时间,避免等待时间不够,元素还未加载出来
  • 多窗口时需考虑窗口句柄是否还处在上一个窗口 , 导致无法定位新窗口的元素,是否需要切换窗口句柄
  • iframe/frame,这是个常见的定位不到元素的原因 , frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别 , 因此需要先定位到相应的frame , 再对那个页面里的元素进行定位
  • 如果使用xpath或css_selector,请在浏览器开发者工具中调试测试正确后再写入代码中

推荐阅读