Selenium元素定位全攻略,让你轻松玩转自动化测试

一、什么是元素定位

  • 元素定位就是查找HTML元素的过程,操作页面元素之前,首先要对元素进行定位,所以定位是自动化脚本编写的开始。
  • 通常使用find_element或find_elements方法来定位元素(find_element 使用给定的方法定位和查找一个元素;find_elements 使用给定的方法定位和查找所有的元素)

二、Selenium元素定位常用API

1.By_id定位

当所定位的元素具有id属性的时候我们可以通过by_id来定位该元素

例如:打开百度,定位搜索框

搜索框页面源代码:属性id值为kw

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="255" autocomplete="off">
 
  1. '''

  2. 1.学习目标

  3. 必须掌握selenium中元素定位方法,id定位方法

  4. 2.操作步骤(语法)通过元素id属性定位

  5. driver.find_element_by_id(id属性的值)

  6. 3.需求

  7. 在百度页面中使用id属性定位百度输入框

  8. '''

  9. # 1.导入selenium

  10. from selenium import webdriver

  11. from time import sleep

  12. # 2.打开浏览器(获取浏览器对象)

  13. driver = webdriver.Chrome()

  14. # 3.输入网址

  15. url = "http://www.baidu.com"

  16. driver.get(url)

  17. sleep(2)

  18. # 4.元素定位(id定位方法),百度输入框

  19. '''

  20. 注意:

  21. 如果有多个相同属性值的元素,单数形式,定位第一个.

  22. '''

  23. srk = driver.find_element_by_id("kw")

  24. # 打印srk对象

  25. print(srk)

  26. # 查看元素对应的源码

  27. print(srk.get_attribute("outerHTML"))

  28. # 5.关团浏览器

  29. driver.quit()

  30. '''

  31. 输出结果:

  32. <selenium.webdriver.remote.webelement.WebElement

  33. (session="6fbad6d63614e1cae6cd346153a7105e",

  34. element="0dd374b6-74ed-4f4c-b610-5c772fd8c366")>

  35. 我们可以看到srk是一个WebElement类型的对象。

  36. 查看元素对应的源码如下:

  37. <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

  38. 说明我们已经把百度首页的输入框获取到了。

  39. '''

复数形式:

 
  1. '''

  2. 学习目标

  3. 复数形式

  4. 复数定位形式:driver.find_elements_XXX

  5. 复数定位,返回的列表类型数据<list>

  6. 遍历列表操作具体元素

  7. '''

  8. # 1.导入selenium

  9. from selenium import webdriver

  10. from time import sleep

  11. # 2.打开浏览器

  12. driver = webdriver.Chrome()

  13. # 3.输入网址

  14. url = "http://www.baidu.com"

  15. driver.get(url)

  16. sleep(2)

  17. # 4.通过by_id复数定位

  18. srk = driver.find_elements_by_id("kw")

  19. # 5.查看返回结果数据类型

  20. print("结果数据类型", type(srk))

  21. print("元素个数", len(srk))

  22. # 6.遍历结果,查看源码

  23. for i in srk:

  24. # 查看元素对应的源码

  25. print(i.get_attribute("outerHTML"))

  26. # 7.关团浏览器

  27. driver.quit()

  28. '''

  29. 结果数据类型 <class 'list'>

  30. 元素个数 1

  31. <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

  32. '''

异常总结:

异常1:AttributeError:'list' object has no attribute 'get_attribute' :表示定位元素返回的是一个列表格式,原因:使用复数定位方式 find_elements获取的定位

异常2 :NoSuchElementException : 表示元素没找到元素,原因是定位方式出现问题,有一种情况是属性值写错了。

2.by_name 定位

当所定位的元素具有name属性的时候,我们可以通过by_name来定位该元素

如上图中的百度搜索页面,搜索框页面源代码:属性name值为wd

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

使用name属性定位百度搜索框

 
  1. '''

  2. 1.学习目标:

  3. 必须掌握selenium的元素定位方法by_name

  4. 2.语法

  5. name定位

  6. driver.find_element_by_name(name属性的值)

  7. 3.需求

  8. 使用name属性定位百度搜索框

  9. 4.总结

  10. 当元素中有name属性时才能使用上述定位方法

  11. '''

  12. # 1.导入selenium

  13. from selenium import webdriver

  14. from time import sleep

  15. # 2.打开浏览器(获取浏览器对象)

  16. driver = webdriver.Chrome()

  17. # 3.输入网址

  18. url = "http://www.baidu.com"

  19. driver.get(url)

  20. sleep(2)

  21. # 4. 使用name定位百度搜索框

  22. '''

  23. 注意:

  24. 如果有多个相同属性值的元素,单数形式,定位第一个.

  25. '''

  26. srk = driver.find_element_by_name("wd")

  27. # 打印srk对象

  28. print(srk)

  29. # 打印定位元素所在行的源码

  30. print(srk.get_attribute("outerHTML"))

  31. # 5.关闭浏览器

  32. driver.quit()

  33. '''

  34. 输出结果:

  35. <selenium.webdriver.remote.webelement.WebElement

  36. (session="3149d334336f0eab9e4d8d394e4efd72",

  37. element="0.1359081202533734-1")>

  38. <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

  39. '''

复数形式:

 
  1. '''

  2. 学习目标

  3. 复数形式

  4. 复数定位形式:driver.find_elements_XXX

  5. 复数定位,返回的列表类型数据<list>

  6. 遍历列表操作具体元素

  7. '''

  8. # 1.导入selenium

  9. from selenium import webdriver

  10. from time import sleep

  11. # 2.打开浏览器

  12. driver = webdriver.Chrome()

  13. # 3.输入网址

  14. url = "http://www.baidu.com"

  15. driver.get(url)

  16. sleep(2)

  17. # 4.通过by_id复数定位

  18. srk = driver.find_elements_by_name("wd")

  19. # 5.查看返回结果数据类型

  20. print("结果数据类型", type(srk))

  21. print("元素个数", len(srk))

  22. # 6.遍历结果,查看源码

  23. for i in srk:

  24. # 查看元素对应的源码

  25. print(i.get_attribute("outerHTML"))

  26. # 7.关团浏览器

  27. driver.quit()

  28. '''

  29. 结果数据类型 <class 'list'>

  30. 元素个数 1

  31. <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

  32. '''

3.by_class_name 定位

当所定位的元素具有class属性的时候,我们可以通过by_class_name来定位该元素

搜索框页面源代码:属性classname值为s_ipt

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="255" autocomplete="off">

使用class属性定位百度搜索框

 
  1. '''

  2. 1.学习目标:

  3. 必须掌握selenium的元素定位方法by_class_name

  4. 2.语法

  5. classname定位

  6. driver.find_element_by_class_name(class属性值)

  7. 3.需求

  8. 使用class属性定位百度搜索框

  9. 4.总结

  10. 当元素中有class属性时才能使用上述定位方法

  11. '''

  12. # 1.导入selenium

  13. from selenium import webdriver

  14. from time import sleep

  15. # 2.打开浏览器(获取浏览器对象)

  16. driver = webdriver.Chrome()

  17. # 3.输入网址

  18. url = "http://www.baidu.com"

  19. driver.get(url)

  20. sleep(2)

  21. # 4. 使用name定位百度搜索框

  22. '''

  23. 注意:

  24. 如果有多个相同属性值的元素,单数形式,定位第一个.

  25. '''

  26. srk = driver.find_element_by_class_name("s_ipt")

  27. # 打印srk对象

  28. print(srk)

  29. # 查看元素对应的源码

  30. print(srk.get_attribute("outerHTML"))

  31. # 5.关闭浏览器

  32. driver.quit()

  33. '''

  34. 输出结果:

  35. <selenium.webdriver.remote.webelement.WebElement

  36. (session="e4f97a48e7f113e681950b62c7789966",

  37. element="0.5782514739919584-1")>

  38. <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

  39. '''

复数形式:

 
  1. '''

  2. 学习目标

  3. 复数形式

  4. 复数定位形式:driver.find_elements_XXX

  5. 复数定位,返回的列表类型数据<list>

  6. 遍历列表操作具体元素

  7. '''

  8. # 1.导入selenium

  9. from selenium import webdriver

  10. from time import sleep

  11. # 2.打开浏览器

  12. driver = webdriver.Chrome()

  13. # 3.输入网址

  14. url = "http://www.baidu.com"

  15. driver.get(url)

  16. sleep(2)

  17. # 4.通过by_id复数定位

  18. srk = driver.find_elements_by_class_name("s_ipt")

  19. # 5.查看返回结果数据类型

  20. print("结果数据类型", type(srk))

  21. print("元素个数", len(srk))

  22. # 6.遍历结果,查看源码

  23. for i in srk:

  24. # 查看元素对应的源码

  25. print(i.get_attribute("outerHTML"))

  26. # 7.关团浏览器

  27. driver.quit()

  28. '''

  29. 结果数据类型 <class 'list'>

  30. 元素个数 1

  31. <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

  32. '''

4.by_tag_name 定位

by_tag_name方法可以通过元素的标签名来查找元素。由于搜索到的标签名通常不 止一个,所以一般结合使用find_elements方法来使用

假设页面中有一个button按钮

 
  1. <button type="submitA" value="注册A" title="加入会员A">注册用户A</button>

  2. '''

  3. 1.学习目标:

  4. 必须掌握selenium中tag_name定位方法

  5. 2.语法

  6. driver.find_element_by_tag_name(标签名) # 单数形式

  7. driver.find_elements_by_tag_name(标签名) # 定位一组标签名相同的元素

  8. 3.需求

  9. 在页面中,使用tag_name对按钮注册用户A定位

  10. '''

  11. # 1.导入selenium

  12. from selenium import webdriver

  13. from time import sleep

  14. import os

  15. # 2.打开浏览器(获取浏览器对象)

  16. driver = webdriver.Chrome()

  17. # 3.打开注册A页面

  18. url = "file:///" + os.path.abspath("./练习页面/注册A.html")

  19. driver.get(url)

  20. sleep(2)

  21. # 4.使用tag_name定位按钮

  22. '''

  23. 注意:

  24. 如果有多个相同标签的元素,单数形式,定位第一个.

  25. '''

  26. button = driver.find_element_by_tag_name("input")

  27. print(button.get_attribute("outerHTML"))

  28. # 5.关闭浏览器

  29. sleep(2)

  30. driver.quit()

  31. '''

  32. 输出结果:

  33. <input type="textA" name="userA" id="userA" placeholder="账号A" required="" value="">

  34. '''

复数形式:

 
  1. '''

  2. 1.学习目标:

  3. 必须掌握selenium中tag_name定位方法

  4. 2.语法

  5. driver.find_element_by_tag_name(标签名) # 单数形式

  6. driver.find_elements_by_tag_name(标签名) # 定位一组标签名相同的元素

  7. 3.需求

  8. 在页面中,使用tag_name复数形式定位 input标签

  9. '''

  10. # 1.导入selenium

  11. from selenium import webdriver

  12. from time import sleep

  13. import os

  14. # 2.打开浏览器

  15. driver = webdriver.Chrome()

  16. # 3.打开注册A页面

  17. url = "file:///" + os.path.abspath("./练习页面/注册A.html")

  18. driver.get(url)

  19. sleep(2)

  20. # 4.使用tag_name复数形式定位 input标签

  21. input_elements = driver.find_elements_by_tag_name("input")

  22. # 查看结果类型

  23. print(type(input_elements))

  24. print(len(input_elements))

  25. # 5.遍历列表打印每个元素的源码

  26. for element in input_elements:

  27. print(element.get_attribute("outerHTML"))

  28. # 6.关闭浏览器

  29. driver.quit()

  30. '''

  31. 输出结果:

  32. <class 'list'>

  33. 16

  34. <input type="textA" name="userA" id="userA" placeholder="账号A" required="" value="">

  35. <input type="password" name="passwordA" id="passwordA" placeholder="密码A" value="">

  36. <input type="telA" name="telA" id="telA" placeholder="电话A" class="telA" value="">

  37. <input type="emailA" name="emailA" id="emailA" placeholder="电子邮箱A" value="">

  38. ......等等

  39. '''

tag_name定位:

单数形式
当页面中如果定位的标签是唯一的,可以直接使用tag_name方法定位
如果所定位的标签在页面中的索引位置是第一个,也可以用tag_name方法定位

复数形式
复数定位形式:driver.find_elements_XXX
复数定位,返回的列表类型数据
遍历列表操作具体元素

5.by_link_text 定位

by_link_text通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接

例如打开百度首页,定位点击超链接地图

<a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a>

使用link_text定位百度首页地图链接

 
  1. '''

  2. 1.学习目标:

  3. 必须掌握selenium中超链接的定位方法

  4. 2.语法

  5. link_text # 需要链接的全部文本

  6. driver.find_element_by_link_text(全部文本)

  7. 3.需求

  8. 在页面中,使用定位连接的方法,访问百度网站,定位点击超链接地图。

  9. '''

  10. # 1.导入selenium

  11. from selenium import webdriver

  12. from time import sleep

  13. import os

  14. # 2.打开浏览器

  15. driver = webdriver.Chrome()

  16. # 3.打开页面

  17. url = "http://www.baidu.com"

  18. driver.get(url)

  19. sleep(2)

  20. # 4.使用link_text定位

  21. '''

  22. 注意:

  23. 连接的全部文本,表示<a>标签中的全部内容,有空格也要算。

  24. 如果有相同部分文本的元素,单数形式,定位第一个。

  25. '''

  26. linkText = driver.find_element_by_link_text("地图")

  27. print(linkText.get_attribute("outerHTML"))

  28. # 5.关闭浏览器

  29. driver.quit()

  30. '''

  31. 输出结果:

  32. <a href="http://map.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地图</a>

  33. '''

复数形式:

 
  1. # 定位一组标超链接文本全部内容相同的元素,很少用到。# 1.导入selenium

  2. from selenium import webdriver

  3. from time import sleep

  4. # 2.打开浏览器

  5. driver = webdriver.Chrome()

  6. # 3.打开页面

  7. url = "http://www.baidu.com"

  8. driver.get(url)

  9. sleep(2)

  10. # 4.使用link_text定位

  11. '''

  12. 注意:

  13. 连接的全部文本,表示<a>标签中的全部内容,有空格也要写。

  14. '''

  15. linkText = driver.find_elements_by_link_text("地图")

  16. # 5.遍历列表打印每个元素的源码

  17. for element in linkText:

  18. print(element.get_attribute("outerHTML"))

  19. # 6.关闭浏览器

  20. driver.quit()

  21. '''

  22. 输出结果:

  23. <a href="http://map.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地图</a>

  24. '''

6.by_partial_link_text 定位

当你不能准确知道超链接上的文本信息或者只想通过一些关键字进行匹配时,可以使 用by_partial_link_text这个方法来通过部分链接文字进行匹配

例如打开百度首页,定位点击超链接<hao123>

<a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>

使用partial_link_text方法定位百度首页<hao123>链接

 
  1. '''

  2. 1.学习目标:

  3. 必须掌握selenium中超链接的定位方法

  4. 2.语法

  5. partial_link_text # 需要连接部分文本

  6. driver.find_element_by_partial_link_text(部分文本)

  7. 部分文本必须是连续的文字(中可包含空格)

  8. 3.需求

  9. 在页面中,使用定位连接的方法,访问百度网站,定位点击超链接<hao123>。

  10. '''

  11. # 1.导入selenium

  12. from selenium import webdriver

  13. from time import sleep

  14. # 2.打开浏览器

  15. driver = webdriver.Chrome()

  16. # 3.打开页面

  17. url = "http://www.baidu.com"

  18. driver.get(url)

  19. sleep(2)

  20. # 4.使用by_partial_link_text定位

  21. '''

  22. 注意:

  23. 连接的部分文本,表示<a>标签中的连续的部分内容,之中有空格也要算。

  24. 如果有相同部分文本的元素,单数形式,定位第一个。

  25. '''

  26. pLinkText = driver.find_element_by_partial_link_text("ao1")

  27. print(pLinkText.get_attribute("outerHTML"))

  28. # 6.关闭浏览器

  29. sleep(2)

  30. driver.quit()

  31. '''

  32. 输出结果:

  33. <a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>

  34. '''

复数形式:

 
  1. # 定位一组标超链接文本目标内容相同的元素,很少用到。# 1.导入selenium

  2. from selenium import webdriver

  3. from time import sleep

  4. # 2.打开浏览器

  5. driver = webdriver.Chrome()

  6. # 3.打开页面

  7. url = "http://www.baidu.com"

  8. driver.get(url)

  9. sleep(2)

  10. # 4.使用by_partial_link_text定位

  11. '''

  12. 注意:

  13. 连接的部分文本,表示<a>标签中的连续的部分内容,之中有空格也要算。

  14. '''

  15. pLinkText = driver.find_elements_by_partial_link_text("ao1")

  16. # 5.遍历列表打印每个元素的源码

  17. for element in pLinkText:

  18. print(element.get_attribute("outerHTML"))

  19. # 6.关闭浏览器

  20. driver.quit()

  21. '''

  22. 输出结果:

  23. <a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>

  24. '''

以上就是selenium的基础元素定位,下次讲解xpath和css定位方法,感兴趣的可以关注下。

 

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值