zoukankan      html  css  js  c++  java
  • selenium+python元素定位总计及实例说明

    文档来自:http://www.cnblogs.com/yufeihlf/p/5717291.html

    网页自动化最基本的要求就是要定位到各个元素,然后才能对该元素进行各种操作(输入,点击,清除,提交等)

     一.通过id定位元素  find_element_by_id("id_vaule")

    二.通过class_name定位元素 find_element_by_class_name("class_name_vaule")

    三.通过tag_name定位元素find_element_by_tag_name("input")

    四.通过name定位元素find_element_by_name("wd")

    五.通过link文字精确定位元素  find_element_by_link_text("登录")

    六.通过link文字模糊定位元素  find_element_by_partial_link_text("登")

    七.通过CSS定位元素  find_element_by_css_selector("CSS")

     7.1通过id属性定位元素  #号表示通过id属性来定位元素

           find_element_by_css_selector("#kw")

    7.2通过class属性定位元素  .号表示通过class属性来定位元素

          find_element_by_css_selector(".s_ipt")

    7.3通过标签名定位元素

         find_element_by_css_selector("input")

    7.4通过属性定位元素(挺常用的)

         find_element_by_css_selector("[name='wd']")

         find_element_by_css_selector("[maxlength='255']")

         属性值包含某个值,属性值包含wd:适用于由空格分隔的属性值。   

         find_element_by_css_selector("[name~='wd']")

    7.5父子定位元素  查找有父亲元素的标签名为span,它的所有标签名叫input的子元素

         find_element_by_css_selector("span>input") 

    7.6组合定位元素

    标签名#id属性值:指的是该input标签下id属性为kw的元素

    find_element_by_css_selector("input#kw")

    标签名.class属性值:指的是该input标签下class属性为s_ipt的元素

    find_element_by_css_selector("input.s_ipt")

    标签名[属性=’属性值‘]:指的是该input标签下name属性为wd的元素

    find_element_by_css_selector("input[name='wd']")

    父元素标签名>标签名.class属性值:指的是span下的input标签下class属性为s_ipt的元素

    find_element_by_css_selector("span>input.s_ipt")

     

    多个属性组合定位元素(挺常用的)

    指的是input标签下id属性为kw且name属性为wd的元素

    find_element_by_css_selector("input.s_ipt[name='wd']")

    指的是input标签下name属性为wd且maxlength为255的元素

    find_element_by_css_selector("input[name='wd'][maxlength='255']")

     

    比较复杂的CSS定位可查看

    http://www.360doc.com/content/13/1105/10/11675837_326750173.shtml

    http://www.360doc.com/content/13/1105/10/11675837_326750240.shtml

     

    八.通过XPath定位元素

       find_element_by_xpath("XPath")

    8.1通过属性定位元素

        find_element_by_xpath("//标签名[@属性='属性值']")

    id属性:find_element_by_xpath("//input[@id='kw']")

    class属性:find_element_by_xpath("//input[@class='s_ipt']")

    name属性:find_element_by_xpath("//input[@name='wd']")

    maxlength属性:find_element_by_xpath("//input[@maxlength='255']")

    8.2通过标签名定位元素,指所有input标签元素

        find_element_by_xpath("//input")

    8.3父子定位元素,查找有父亲元素的标签名为span,它的所有标签名叫input的子元素

        find_element_by_xpath("//span/input") 

    8.4根据元素内容定位元素(非常实用)

        find_element_by_xpath("//p[contains(text(),'京公网')]") 

    8.5组合定位元素,//父元素标签名/标签名的属性值:指的是span下的input标签下class属性为s_ipt的元素

        find_element_by_xpath("//span/input[@class='s_ipt']")

    多个属性组合定位(挺常用的)

    指的是input标签下id属性为kw且name属性为wd的元素

    find_element_by_xpath("//input[@class='s_ipt' and @name='wd']")

    指的是p标签下内容包含“京公网”且id属性为jgwab的元素

    find_element_by_xpath("//p[contains(text(),'京公网') and @id='jgwab']")  

    九.通过By定位元素

    使用:find_element(定位的类型,具体定位方式)

    定位的类型包含By.ID,By.NAME,By.CLASS_NAME,By.TAG_NAME,By.LINK_TEXT,By.PARTIAL_LINK_TEXT,By.XPATH,By.CSS_SELECTOR

    实例:find_element(By.ID,'kw')

     

    下方例子是登陆126邮件,然后发送邮件。

    # coding=utf-8

    '''

    Created on 2016-7-27

    @author: Jennifer

    Project:发送邮件

    '''

    from selenium import webdriver

    import time

     

    from test_5_2_public import Login  #由于公共模块文件命名为test_5_2_public

    driver=webdriver.Firefox()

    driver.implicitly_wait(30)

    driver.get(r'http://www.126.com/')  #字符串加r,防止转义。

    time.sleep(3)

    driver.switch_to.frame('x-URS-iframe')

    #调用登录模块

    Login().user_login(driver)

    time.sleep(10)

    #发送邮件

    #点击发件箱

    #_mail_component_61_61是动态id,所以不能用于定位

    #driver.find_element_by_css_selector('#_mail_component_61_61>span.oz0').click()

    #不能加u"//span[contains(text(),u'写 信')]",否则定位不到。

    #以下定位是查找span标签有个文本(text)包含(contains)'写 信' 的元素,该定位方法重要

    driver.find_element_by_xpath("//span[contains(text(),'写 信')]").click()

    #填写收件人

    #driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys(r'xxx@doov.com.cn')

    driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys(r'xxx@163.com')

    #填写主题

    #通过and连接更多的属性来唯一地标志一个元素

    driver.find_element_by_xpath("//input[@class='nui-ipt-input' and @maxlength='256']").send_keys(u'自动化测试')

    #填写正文

    #通过switch_to_frame()将当前定位切换到frame/iframe表单的内嵌页面中

    driver.switch_to_frame(driver.find_element_by_class_name('APP-editor-iframe'))

    #在内嵌页面中定位邮件内容位置

    emailcontext=driver.find_element_by_class_name('nui-scroll')

    #填写邮件内容

    emailcontext.send_keys(u'这是第一封自动化测试邮件')

    #通过switch_to().default_content()跳回最外层的页面

    #注:不要写成switch_to().default_content(),否则报AttributeError: SwitchTo instance has no __call__ method

    driver.switch_to.default_content()

    #driver.switch_to.parent_frame()

    #点击发送

    time.sleep(3)

    #有可能存在元素不可见(查看元素是灰色的),会报ElementNotVisibleException错误

    #包含发送二字的元素很多,所以还得再加上其他限制

    #sendemails=driver.find_element_by_xpath("//span[contains(text(),'发送')]")

    sendemails=driver.find_element_by_xpath("//span[contains(text(),'发送') and @class='nui-btn-text']")

    time.sleep(3)

     

    #校验邮件是否发送成功

    try:

        assert '发送成功' in driver.page_source

    except AssertionError:

        print '邮件发送成功'

    else:

        print '邮件发送失败'

     

    #调用退出模块    

    Login().user_logout(driver)

     

    元素定位说明:

    1.代码22行,定位不到是因为id是动态的,所以需采取其他方式定位元素。

    2.代码25行,是根据元素内容来定位的,具体用法详看8.4.

    3.代码28行,是根据class名来定位元素的,由于该值在该页面上是唯一的,所以可以用它来定位。

    4.代码31行,是使用逻辑运算符and连接更多的属性从而唯一的标志一个元素,具体用法详看8.5.

    5.代码34行,由于使用内嵌的iframe框架,所以需要先使用switch_to_frame()移到该表单上,才能定位该表单上的元素,非常重要,否则无论怎么定位都会报“NoSuchElementException”,找不到该元素。

    6.代码41行,跳出iframe框架,当框架内的动作操作完毕后,需要使用switch_to.default_content跳出iframe框架,非常重要。

    7.代码47行,由于内容包括“发送”的元素中包含不可见元素(html查看元素可以看到此行是灰色的),这样有可能定位到不可见元素,会报“ElementNotVisibleException”。

    8.代码48行,是使用逻辑运算符and连接更多的属性从而唯一的标志一个元素,具体用法详看8.5.这样可以排除掉那个不可见元素。

     

  • 相关阅读:
    iframe框架
    HTML 中 id与name 区别
    使用display:inline-block产生间隙
    html5新增语义化标签
    子选择器与后代选择器的区别
    各种居中问题
    腾讯 地图 机器学习岗 春招实习123面(猝)
    腾讯 微信春招nlp实习生一面二面(猝)
    264. Ugly Number II(丑数 剑指offer 34)
    263. Ugly Number(判断是否是丑数 剑指offer34)
  • 原文地址:https://www.cnblogs.com/lhx0827/p/9799469.html
Copyright © 2011-2022 走看看