python-web自动化测试-selenium元素定位

一、方法介绍  

  1. id定位:利用元素的id属性值进行定位
  2. By类定位:利用By类定位
  3. list定位:前面8种定位方法只能定位到符合条件的第一个元素,find_elements_by_XXX()能够获取到所有符合条件的元素,结果是一个列表
  4. css定位:利用css选择器进行定位
  5. xpath定位:利用元素的层级路径定位
  6. link_text、partial_link_text:利用超链接文本内容定位a标签
  7. tag_name定位:利用元素的标签名进行定位
  8. class定位:利用元素的class属性值进行定位
  9. name定位:利用元素的name属性值进行定位

二、id定位---利用元素的id属性值进行定位,id属性值具有唯一性

        方法:find_element_by_id("id属性值")

        

 三、name定位---利用元素的name属性进行定位,只能定位到符合条件的第一个元素

        方法:find_element_by_name(“name的属性值”)

        

四、class_name定位---利用元素的class属性值进行定位,只能定位到符合条件的第一个元素

        方法:find_element_by_class_name(“class属性值”)

        

五、tag_name定位---利用元素的标签名进行定位,只能定位到符合条件的第一个元素;由于标签名重复率较高,一般不推荐使用

        方法:find_element_by_tag_name(“标签名”)

 六、超链接定位---利用超链接的文本内容进行定位

        方法:find_element_by_link_text(“超链接全部文本内容”)

                  find_element_by_partial_link_text(“超链接的关键文本内容”)

七、xpath定位---利用元素的层级路径进行定位,只能定位到符合条件的第一个元素

         方法:find_element_by_xpath(“xpath路径”)

        (一)xpath定位策略----路径定位

                (1)绝对路径:从html标签开始到达目标元素经过的所有层级路径,以单斜线”/”开头 ---> /html/body/……。如果同级有多个相同的标签,用编号进行区分,编号从1开始/html/body/form/div/fieldset/p[2]/input

                (2)相对路径:从第一个符合条件的标签开始到达目标元素经过的所有层级路径,以双斜线”//”开头--->  //标签名。如果同级有同名标签,加下标,下标从1开始

         

        (二) xpath定位策略----元素属性定位

                利用某一个属性进行定位,相对路径+属性:

                        //标签名[@属性名=”属性值”]  标签名可以用*代替,表示任意标签名

        (三)xpath定位策略----属性与逻辑结合

                一个属性无法精确定位,就用多个属性:

                        //*[@属性名1=”属性值1”  and  @属性名2=”属性值2”]

        (四)xpath定位策略----属性与层级结合

                如果无法直接子元素,就先找到父元素,再定位子元素:

                        //父元素标签名[@属性名=”属性值”]/子元素标签名

# xpath元素属性与层级结合定位
diver.find_element_by_xpath("//p[@id='p1']/input").send_keys("lilgaage")
diver.find_element_by_xpath('//*[@id="passwordA"]').send_keys("lizhangge")
# xpath元素属性与逻辑结合定位
diver.find_element_by_xpath("//*[@name='telA' and @id='telA']").send_keys("18502791234")
# xpath元素属性定位
diver.find_element_by_xpath("//input[@placeholder='电子邮箱A']").send_keys("[email protected]")
diver.find_element_by_xpath('//*[@id="selectA"]/option[4]').click()
diver.find_element_by_xpath('//*[@id="xja"]').click()
sleep(5)
# xpath绝对路径定位
diver.find_element_by_xpath("/html/body/form/div/fieldset/button").click()
# xpath相对路径定位
diver.find_element_by_xpath("//p[6]/a").click()

        注意:xpath是最万能的定位方法,但定位速度较慢,尤其是绝对路径定位,不太推荐使用。

八、CSS定位---利用css选择器进行定位,只能定位到符合条件的第一个

        方法:find_element_by_css_selector(css选择器)

        (一)id选择器:井号修饰id的属性值  #id

        (二)类class选择器:点修饰class的属性值  .class

        (三)元素选择器:直接写标签名即可

        (四)属性选择器:利用元素的某一个属性进行定位,[属性名=”属性值”]

        (五)层级选择器:先定位父元素,然后根据父元素定位子元素。父元素>子元素 ,大于号>可以用空格代替

# css选择器定位
# 层级选择器
diver.find_element_by_css_selector("#p1>input").send_keys("李张格")
# 属性选择器
diver.find_element_by_css_selector('[type="password"]').send_keys("lizhangge")
# class选择器
diver.find_element_by_css_selector('.telA').send_keys("18502791234")
# id选择器
diver.find_element_by_css_selector('#emailA').send_keys("[email protected]")
# 元素选择器
diver.find_element_by_css_selector('button').click()
diver.find_element_by_css_selector('[value="cq"]').click()
diver.find_element_by_css_selector('[value="jza"]').click()

九、list定位---定位到符合条件的所有元素,返回的结果是一个列表,根据索引获取元素

        方法:find_elements_by_xxx()

                 

# list定位
diver.find_elements_by_tag_name("input")[0].send_keys("李张格")
diver.find_elements_by_tag_name("input")[1].send_keys("lzg")
diver.find_elements_by_css_selector('#telA')[0].send_keys("127362128932")
diver.find_elements_by_xpath('//input')[3].send_keys("[email protected]")
diver.find_elements_by_xpath("//button")[0].click()

十、By类定位---webdriver中元素的定位方法find_element_by_xxx()都是在find_element()的基础上实现的。

        需要导入By类:from selenium.webdriver.common.by import By

        方法:find_element(by=By.ID , value=None)

                   find_element(By.ID, “id的属性值“)

                   find_element(By.XPATH, “xpath路径“)

                   find_element(By.CSS_SELECTOR, “css选择器”)

                   

# By类定位
diver.find_element(By.ID, 'userA').send_keys("小瑰")
diver.find_element(By.CSS_SELECTOR, '#passwordA').send_keys("ghost")
diver.find_element(By.CLASS_NAME, "telA").send_keys("12346432234")
diver.find_element(By.XPATH, '//*[@id="emailA"]').send_keys("[email protected]")
sleep(3)
diver.find_element(By.TAG_NAME, 'button').click()

十一、xpath和css的对比和拓展

        (1)对比

        

        (2)xpath拓展

                ①text()="文本内容"

                ②starts-with(@属性名, “属性值的开头”)

                ③contains(@属性名, “属性值的某一部分”)

# text()="" 文本等于
diver.find_element_by_xpath('//*[text()="注册用户"]').click()
diver.find_element_by_xpath('//a[text()="百度一下,你就知道"]').click()
# start-with:属性值的开头
diver.find_element_by_xpath('//input[starts-with(@id,"use")]').send_keys("瑰丝")
# contains:属性值的某一部分
diver.find_element_by_xpath('//*[contains(@type,"pass")]').send_keys("guisi")

        (3)css拓展

                ①属性名^=”属性值的开头”

                ②属性名$=”属性值的结尾”

                ③属性名*=”属性值的某一部分”

# $:结尾
diver.find_element_by_css_selector('[type$="word"]').send_keys("xiaoguixiaosi")
# ^:开头
diver.find_element_by_css_selector('[class^="tel"]').send_keys("123456754322")
# *:包含某一部分
diver.find_element_by_css_selector('[id*="mail"]').send_keys("[email protected]")

十二、元素定位小结

        (1)优先id、link_text、xpath、css四种定位方法

        (2)如果有id属性就优先使用id定位

        (3)如果是超链接,就优先使用link_text定位

        (4)其次可以考虑使用css定位、name定位等

        (5)最后能用哪个用哪个,喜欢用哪个用哪个

十三、如果元素定位失败怎么办?

        (1)首先确定自己写的定位语句是否正确

        (2)其次考虑是否需要切换窗口或者切换frame表单框架

        (3)看是否有添加隐式等待implicitly_wait()、sleep()强制等待等方法

        (4)考虑元素是否可见、是否可用

猜你喜欢

转载自blog.csdn.net/chengdiyiyo/article/details/121098988