前言:执行自动化测试过程中遇到下拉框,包含:单选、多选,如何定位到下拉框并选中某个选项?

1 下拉框的分类

  • select 标签

  • 非 select 标签

2 Select 下拉列表处理

针对 select 标签的下拉列表,Selenium 提供了 Select 类进行操作:

from selenium.webdriver.support.select import Select

下面这种方式一样可以使用 Select,原理是 ui 中又去调用的 Select 类:

from selenium.webdriver.support.ui import Select

Select 方法列表

Select 单选

针对单选的下拉框,每次仅能选择一个选项,可以在不同的选项中切换。

如图:

 代码:

 
  1. from selenium.webdriver.support.select import Select

  2. # 打开Chrome浏览器

  3. driver = webdriver.Chrome("../login/chromedriver.exe")

  4. # 浏览器访问本地html地址

  5. driver.get("file:///D:/ac/select.html")

  6. # 根据select下拉框的id定位

  7. select = driver.find_element_by_id("traffic")

  8. # 获取select的所有选项

  9. options_list = Select(select).options

  10. # 循环把select所有选项读取出来

  11. for option in options_list:

  12. print(option.text) # 打印每个选项的文本值

  13. time.sleep(1)

  14. # 选中索引值为1的选项"地铁"(index从0开始)

  15. Select(select).select_by_index(1)

  16. time.sleep(1)

  17. # 选中标签的value=train选项"火车"

  18. Select(select).select_by_value("train")

  19. time.sleep(1)

  20. # 选中文本名称为"轻轨"选项

  21. Select(select).select_by_visible_text("轻轨")

  22. # 获取当前选中的下拉框中的选项

  23. first = Select(select).first_selected_option.text

  24. print("当前选中的下拉框:", first)

Select 多选

如图:

 代码:

 
  1. from selenium.webdriver.support.select import Select

  2. # 打开Chrome浏览器

  3. driver = webdriver.Chrome("../login/chromedriver.exe")

  4. # 浏览器访问本地html地址

  5. driver.get("file:///D:/ac/select.html")

  6. # 根据select下拉框的id定位

  7. select = driver.find_element_by_id("discipline")

  8. time.sleep(1)

  9. # 选中索引值为1的选项"语文"

  10. Select(select).select_by_index(1)

  11. time.sleep(1)

  12. # 选中索引值为4的选项"物理"

  13. Select(select).select_by_index(4)

  14. time.sleep(1)

  15. # 选中索引值为5的选项"生物"

  16. Select(select).select_by_index(5)

  17. time.sleep(1)

  18. # 选中标签的value=English的选项"英语"

  19. Select(select).select_by_value("English")

  20. time.sleep(1)

  21. # 选中文本名称为"数学"选项

  22. Select(select).select_by_visible_text("数学")

  23. # 获取所有选中的选项

  24. options = Select(select).all_selected_options

  25. for option in options:

  26. print(option.text) # 打印选项的文本值

  27. time.sleep(1)

  28. # 取消选中标签的value=organism的选项"生物"

  29. Select(select).deselect_by_value("organism")

  30. time.sleep(1)

  31. # 取消选中文本名称为"语文"选项

  32. Select(select).deselect_by_visible_text("语文")

  33. time.sleep(1)

  34. # 取消选中索引值为4的选项"物理"

  35. Select(select).deselect_by_index(4)

  36. time.sleep(1)

  37. # 取消选中所有的选项

  38. Select(select).deselect_all()

select 下拉框(隐藏)

隐藏式的下拉框必须在点击了下拉框之后,才会把所有的可选项的元素显示在html中,如果采用常规的 select 方式无法定位,一般此种采用 ul + li 标签的方式开发的下拉框。

如下图所示:禅道的提交bug的"操作系统"下拉框,我们直接通过 select 的下拉框操作方式进行定位:

 代码:

 
  1. from selenium import webdriver

  2. # 打开Chrome浏览器

  3. driver = webdriver.Chrome("../login/chromedriver.exe")

  4. # 设置全局等待时间,最大超时时间为10秒

  5. driver.implicitly_wait(10)

  6. # 浏览器最大化

  7. driver.maximize_window()

  8. # 打开禅道的地址

  9. driver.get("http://127.0.0.1/zentao")

  10. # 根据登录页面的id定位用户名输入框并输入用户名

  11. driver.find_element_by_id("account").send_keys("admin")

  12. # 根据登录页面的name定位密码输入框并输入密码

  13. driver.find_element_by_name("password").send_keys("123456")

  14. # 根据id定位登录按钮,并点击

  15. driver.find_element_by_id("submit").click()

  16. # 根据超文本连接的文本"测试"定位并点击

  17. driver.find_element_by_link_text("测试").click()

  18. # 根据xpath定位"Bug"并点击

  19. driver.find_element_by_xpath("//*[@id='subNavbar']/ul/li[1]/a").click()

  20. # 根据css定位"+提Bug"并点击

  21. driver.find_element_by_css_selector(".btn-toolbar.pull-right > .btn.btn-primary").click()

  22. # 根据id定位到"操作系统"的select下拉框

  23. sel = driver.find_element_by_id("os")

  24. # 根据下拉框中选项的index选择第三个选项

  25. Select(sel).select_by_index(2)

执行结果如下:

元素当前不可见,不能被操作。

 
  1. selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: Element is not currently visible and may not be manipulated

  2. (Session info: chrome=111.0.5563.146)

而实际真正的元素必须要点击了页面的下拉框的箭头才能把所有下拉框中的选项显示出来,所以执行的过程中,就不能使用原始的 select 下拉框定位的方式去做。

此处使用方法,先定位下拉框的箭头或者整个输入框,点击之后,html页面的元素显示出来后使用常规的8大定位方式来进行定位其中一个选项,再执行点击的动作:

 
  1. from selenium import webdriver

  2. # 打开Chrome浏览器

  3. driver = webdriver.Chrome("../login/chromedriver.exe")

  4. # 设置全局等待时间,最大超时时间为10秒

  5. driver.implicitly_wait(10)

  6. # 浏览器最大化

  7. driver.maximize_window()

  8. # 打开禅道的地址

  9. driver.get("http://127.0.0.1/zentao")

  10. # 根据登录页面的id定位用户名输入框并输入用户名

  11. driver.find_element_by_id("account").send_keys("admin")

  12. # 根据登录页面的name定位密码输入框并输入密码

  13. driver.find_element_by_name("password").send_keys("123456")

  14. # 根据id定位登录按钮,并点击

  15. driver.find_element_by_id("submit").click()

  16. # 根据超文本连接的文本"测试"定位并点击

  17. driver.find_element_by_link_text("测试").click()

  18. # 根据xpath定位"Bug"并点击

  19. driver.find_element_by_xpath("//*[@id='subNavbar']/ul/li[1]/a").click()

  20. # 根据css定位"+提Bug"并点击

  21. driver.find_element_by_css_selector(".btn-toolbar.pull-right > .btn.btn-primary").click()

  22. # 根据id定位到"操作系统"的select下拉框

  23. # sel = driver.find_element_by_id("os")

  24. #

  25. # # 根据下拉框中选项的index选择第三个选项

  26. # Select(sel).select_by_index(2)

  27. # 1、根据css定位查找下拉框旁边的按钮

  28. # driver.find_element_by_css_selector("#os_chosen > a > div:nth-child(2)").click()

  29. # 2、根据css定位查找下拉列表的输入框(点击输入框后html中才会有所有下拉选项的元素)

  30. driver.find_element_by_css_selector(" #os_chosen > a > span").click()

  31. # 根据其中要选择的选项使用css定位,点击后显示在下拉框的输入框中

  32. driver.find_element_by_css_selector("#os_chosen > div > ul > li:nth-child(2)").click()

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

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐