zoukankan      html  css  js  c++  java
  • Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)

         在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException),一般可以从以下几个方面着手解决:
    1.Frame/Iframe原因定位不到元素:
      这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位。
    解决方案:
    如果iframe有name或id的话,直接使用switch_to_frame("name值")或switch_to_frame("id值")。如下:
    driver=webdriver.Firefox()
    driver.get(r'http://www.126.com/')
    driver.switch_to_frame('x-URS-iframe')  #需先跳转到iframe框架
    username=driver.find_element_by_name('email')
    username.clear()
     
    如果iframe没有name或id的话,则可以通过下面的方式定位:
    #先定位到iframe
    elementi= driver.find_element_by_class_name('APP-editor-iframe')
    #再将定位对象传给switch_to_frame()方法
    driver.switch_to_frame(elementi) 
     
    如果完成操作后,可以通过switch_to.parent_content()方法跳出当前iframe,或者还可以通过switch_to.default_content()方法跳回最外层的页面。
    另:可前往我另外一篇博文了解下html的iframe标签:w3school之HTML学习笔记-框架标签
     
    2.Xpath描述错误原因:
         由于Xpath层级太复杂,容易犯错。但是该定位方式能够有效定位绝大部分的元素,建议掌握。
    解决方案:
    2.1可以使用Firefox的firePath,复制xpath路径。该方式容易因为层级改变而需要重新编写过xpath路径,不建议使用,初学者可以先复制路径,然后尝试去修改它。
    2.2提高下写xpath的水平。
    可以详看笔者另外一篇博文总结:Selenuim+Python之元素定位总结及实例说明
    该博文详细总结了Xpath的使用,多组合定位一般都能实现定位问题。
     
    如何检验编写的Xpath是否正确?编写好Xpath路径,可以直接复制到搜狐浏览器的firebug查看html源码,通过Xpath搜索:如下红色框,若无报错,则说明编写的Xpath路径没错。
    find_element_by_xpath("//input[@id='kw']")
     
     
     
    3.页面还没有加载出来,就对页面上的元素进行的操作:
         这种情况一般说来,可以设置等待,等待页面显示之后再操作,这与人手工操作的原理一样:
    3.1设置等待时间;缺点是需要设置较长的等待时间,案例多了测试就很慢;
    3.2设置等待页面的某个元素出现,比如一个文本、一个输入框都可以,一旦指定的元素出现,就可以做操作。
    3.3在调试的过程中可以把页面的html代码打印出来,以便分析。
    解决方案:
    导入时间模块。
    import time
    time.sleep(3)
     
    4.动态id定位不到元素:
    解决方案:
    如果发现是动态id,直接用xpath定位或其他方式定位。
     
     
    5.二次定位,如弹出框登录
         如百度登录弹出框登录百度账号,需先定位到百度弹出框,然后再定位到用户名密码登录。
     
    # coding=utf-8
    '''
    Created on 2016-7-20
    @author: Jennifer
    Project:登录百度账号
    '''
    from selenium import webdriver
    import time
    
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com/")
    
    time.sleep(3)
    
    #点击登录:有些name为tj_login的元素为不可见的,点击可见的那个登录按钮即可。
    #否则会报:ElementNotVisibleException
    element0=driver.find_elements_by_name("tj_login")
    for ele0 in element0:
        if ele0.is_displayed():
            ele0.click()
    
    #在登录弹出框,需先定位到登录弹出框
    #否则会报:NoSuchElementException
    element1=driver.find_element_by_class_name("tang-content")
    element11=element1.find_element_by_id("TANGRAM__PSP_8__userName")
    element11.clear()
    element11.send_keys("登录名")
    
    element2=element1.find_element_by_id("TANGRAM__PSP_8__password")
    element2.clear()
    element2.send_keys("密码")
    
    element3=element1.find_element_by_id("TANGRAM__PSP_8__submit")
    element3.click()
    element3.submit()
    
    try:
        assert "登录名" in driver.page_source
    except AssertionError:
        print "登录失败"
    else:
        print "登录成功"
        time.sleep(3)
    finally:
        print "测试记录:已测试"
    driver.close()

    补充:报:selenium.common.exceptions.ElementNotVisibleException

    6.不可见元素定位

         如上百度登录代码,通过名称为tj_login查找的登录元素,有些是不可见的,所以加一个循环判断,找到可见元素(is_displayed())点击登录即可。

  • 相关阅读:
    oracle 10g 免安装客户端在windows下配置
    sql2005 sa密码
    使用windows live writer 有感
    windows xp SNMP安装包提取
    汉化groove2007
    迁移SQL server 2005 Reporting Services到SQL server 2008 Reporting Services全程截图操作指南
    foxmail 6在使用中的问题
    AGPM客户端连接不上服务器解决一例
    SpringSource Tool Suite add CloudFoundry service
    Java 之 SWing
  • 原文地址:https://www.cnblogs.com/yufeihlf/p/5689042.html
Copyright © 2011-2022 走看看