zoukankan      html  css  js  c++  java
  • selenium无法定位元素问题

    在用自动化测试工具selenium完成下载任务时,经常会遇到定位不到元素的情况,总结如下:

    1.frame/iframe原因定位不到元素:

    这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而selenium每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位。

    解决方案:

    如果iframe有name或id的话,直接使用switch_to_frame("name值")或switch_to_frame("id值")。如下:

    driver = webdriver.Chrome()

    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()方法跳回最外层的页面。

    2.页面还没有加载出来,就对页面上的元素进行的操作:

    这种情况一般说来,可以设置等待,等待页面显示之后再操作,这与人手工操作的原理一样:

    2.1设置等待时间;缺点是需要设置较长的等待时间,页面多了测试就很慢;

    3.2设置等待页面的某个元素出现,比如一个文本、一个输入框都可以,一旦指定的元素出现,就可以做操作。

    2.3在调试的过程中可以把页面的html代码打印出来,以便分析。

    解决方案:

    导入时间模块。

    import time

    time.sleep(3)

    3.二次定位,如弹出框登录

    如百度登录弹出框登录百度账号,需先定位到百度弹出框,然后再定位到用户名密码登录。

    # coding=utf-8

    from selenium import webdriver

    import time

    driver = webdriver.Chrome()

    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

    4.不可见元素定位

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

  • 相关阅读:
    【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用
    【iCore4 双核心板_ARM】例程十一:DMA实验——存储器到存储器的传输
    【iCore1S 双核心板_FPGA】例程八:触发器实验——触发器的使用
    【iCore4 双核心板_ARM】例程十:RTC实时时钟实验——显示时间和日期
    【iCore4 双核心板_ARM】例程九:ADC实验——电源监控
    WebBrowser的Cookie操作之流量刷新机
    网站受攻击的常用手段
    八爪鱼招标网的百度权重升为2了,独立IP也从0快速发展为1000
    网站添加数据出错,原来是MS SQL Server2008日志文件占据空间过大导致的
    当你的网站被疯狂攻击时你能做什么?
  • 原文地址:https://www.cnblogs.com/niansi/p/6666319.html
Copyright © 2011-2022 走看看