关于web自动化定位元素失败的分析

问题分析

  1. 首先-明确范围 -- web自动化测试

  2. 其次-明确条件 -- 元素定位都正确

  3. 然后-明确现象 -- 元素定位会失败

  4. 最后-得出结论

    1. 判断定位的元素属性信息是否正确(已经确定正确),但是业务逻辑是否正确需要确定

    2. 受到网络/服务器/浏览器影响,页面加载过慢会造成定位失败,需要通过元素等待处理

    3. 目标元素是否直接可见/是否需要鼠标动作才能显现出来

    4. 默认浏览器大小的页面加载范围过小造成部分元素遮挡,需要启动浏览器后最大化窗口

    5. 受前端动态加载技术影响,页面动态加载数据有时需要监听滚动条动作(长页面翻页),需要操作滚动条

    6. 页面操作过程中的窗口弹框alert也会影响页面定位和操作,需要先处理alert

    7. 页面部分超链接点击后会在新窗口中打开,目标元素在新窗口中时,需要进行窗口切换

    8. 收到前端页面框架影响,页面内容可能会在frame子页中,需要frame切换

 

 

问题总结

由于这个问题回答清楚需要很多Selenium的API常用操作,所以针对这个问题的回答要特别注意代码实现

  1. 业务逻辑

    # 注意业务逻辑的先后顺序 -- 打开首页就直接登录操作
    # 2.输入网址
    # 驱动对象调用get("协议://URL")
    driver.get("http://www.xxx.com")

    # 3.业务操作
    # 登陆操作 输入用户名/密码/验证码
    driver.find_element_by_id("username").send_keys("xxxxxx")
    driver.find_element_by_id("password").send_keys("123456")
    driver.find_element_by_id("verify_code").send_keys("8888")
    driver.find_element_by_name("sbtbutton").click()
  1. 元素等待


    # 硬等待
    # 使用sleep,暂停程序执行
    time.sleep(3)
    driver.find_element_by_id("q").send_keys("iphone")

    # 隐式等待 -- 设置一次 -- 针对全局--所有元素定位
    # selenium.common.exceptions.NoSuchElementException
    # 调用-使用浏览器驱动对象调用 参数-等待时长秒
    driver.implicitly_wait(10)
    driver.find_element_by_id("q").send_keys("iphone")

    # 显式等待 -- 针对指定的元素定位 -- 定位失败是的抛出异常
    # selenium.common.exceptions.TimeoutException
    # 实例化一个WebDriverWait类的对象, WebDriverWait类的对象调用until
    wait = WebDriverWait(driver, timeout=10, poll_frequency=1)
    userA_element = wait.until(lambda d: d.find_element_by_id("q"))
    userA_element.send_keys("iphone")
  1. 鼠标动作


    # 实例化一个动作链对象
    # 动作链对象调用动作方法--move_to_element(目标元素对象)
    # 动作链对象调用perfom()
    ActionChains(driver).move_to_element(driver.find_element_by_class_name("u-g-cart")).perform()
  1. 最大化窗口


    # 1.打开浏览器
    # 实例化浏览器驱动对象
    # obj = 类名()
    driver = webdriver.Chrome()
    # 浏览器窗口最大化
    driver.maximize_window()
  1. 操作滚动条


    # 操作滚动条
    driver.execute_script("window.scrollTo(0,100000)")
    # 点击回到顶部
    driver.find_element_by_class_name("ico-slidebar4").click()
  1. 处理alert


    # 关闭弹出框
    driver.switch_to.alert.dismiss()
  1. 窗口切换


    # 切换窗口 -- 一般规律默认最后一个就是新窗口句柄
    driver.switch_to.window(driver.window_handles[-1])
  1. frame切换

    # frame切换  主页--子页
    driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
    # 点击去购物车结算
    driver.find_element_by_link_text("去购物车结算").click()
    # frame切换 子页--主页
    driver.switch_to.default_content()

 

posted on 2019-09-14 11:01  Ray(Mr.huang)  阅读(608)  评论(0编辑  收藏  举报

导航