9U WebDriver – 通过两种方式选择项目(下拉菜单和多项选择)

原文: https://javabeginnerstutorial.com/selenium/9u-webdriver-select-items-two-ways/

嗨呀摇滚明星(虽然不包括吉他和音乐)! 在本文中,我们将深入研究下拉菜单以及如何以两种方式选择项目。 是的,我们还讨论了多个选择! 所有概念都将与演示站点中的示例一起进行说明。

方法 1:

使用可用定位策略之一使用相同年代的传统元素定位方法。 首先,我们找到下拉列表元素,然后找到需要选择的项目。 由于选项没有唯一的标识符,因此这并不困难。

示例:让我们通过 ID 查找“编程语言”下拉列表。 要从可用的下拉菜单中找到“C++”,我们将必须找到标记名称为“options”的所有元素,并将其放在列表中。 遍历列表,或者如果知道其索引,则相应地检索元素并执行单击操作。

右键单击所需元素,然后选择检查元素,将给出相应的 HTML 代码,如下所示,

  1. <select id="programming-languages" class="input-xlarge" name="languages">
  2. <option value="Java">Java</option>
  3. <option value="C++">C++</option>

代码:

  1. // Locate 'Programming Languages' dropdown using id
  2. WebElement progLanguages = driver.findElement(By.id("programming-languages"));
  3. //Get all options in a list
  4. List<WebElement> options = progLanguages.findElements(By.tagName("option"));
  5. //Iterate thorough options
  6. for (WebElement option : options) {
  7. if("C++".equals(option.getText()))
  8. option.click();
  9. }

(或者)

  1. WebElement progLanguages = driver.findElement(By.id("programming-languages"));
  2. List<WebElement> options = progLanguages.findElements(By.tagName("option"));
  3. //Selecting “C++” based on its index
  4. options.get(1).click();

0、1、2、3 是下拉列表的索引值。

方法 2:使用Select类。

让我们深入研究并了解Select类的工作原理,并看一下它是否具有魔力。 以及为什么您首先要使用它?

使用方法 1 具有主要缺点。 由于没有唯一标识符,因此选择特定选项变得非常困难。 另外,要选择多个选项,请取消选择特定的项目,这会变得很复杂。 Selenium Webdriver 再次为我们解救! 它为Select类提供了预定义的方法,专门用于处理下拉菜单和多选方案。

步骤 1:该选择类在“org.openqa.selenium.support.ui.Select”包中可用。 因此,必须将此包导入我们的测试脚本中。

  1. import org.openqa.selenium.support.ui.Select;

步骤 2:通过传递所需的下拉标识符为Select类创建一个实例。

  1. Select languages = new Select(driver.findElement(By.id("element_ID")));

可以使用前面讨论的任何定位策略(https://javabeginnerstutorial.com/selenium/9j-webdriver-locating-elements-1/)来定位下拉列表。

步骤 3:找到下拉 Web 元素并创建Select类的对象后,就可以访问其所有方法来执行选择和取消选择。

注意:

Select类仅适用于具有<select>标签的 Web 元素。

下面是Select类中所有可用方法的快照。

Select class methods

这里有很多要讨论和讨论的要点。 让我们通过示例和代码片段介绍一些常用的方法。

注意:

如果找不到匹配的选项,则所有selectdeselect方法可能会碰到NoSuchElementException

1. selectByVisibleText(String arg0)和deselectByVisibleText(String arg0)

这些方法选择和取消选择一个显示的文本与传递的String参数完全匹配的选项。

语法selectObject.selectByVisibleText("displayed_option_text")

selectObject.deselectByVisibleText("displayed_option_text")

示例:让我们从“编程语言”下拉菜单中选择“JavaScript”。

代码:(选择)

  1. // Locate 'Programming Languages' dropdown using id
  2. WebElement languagesDD = driver.findElement(By.id("programming-languages"));
  3. // Create an instance of 'Select' class by passing the dropdown web element
  4. Select languages = new Select(languagesDD);
  5. // Select 'JavaScript' language by its visible text
  6. languages.selectByVisibleText("JavaScript");

(取消选择)

  1. languages.deselectByVisibleText("JavaScript");

2. selectByValue(String arg0)和deselectByValue(String arg0)

这些方法选择和取消选择其value属性与传递的String参数匹配的选项。

语法selectObject.selectByValue("value_attribute_text")

selectObject.deselectByValue("value_attribute_text")

示例:让我们从 Selenium 工具套件多选选项中选择“Selenium RC”。

右键单击所需的 Web 元素,然后选择检视元素,将给出相应的 HTML 代码,如下所示,

  1. <select id="selenium_suite" multiple="multiple" name="selenium_suite">
  2. <option value="IDE">Selenium IDE</option>
  3. <option value="WebDriver">Selenium WebDriver</option>
  4. <option value="RC">Selenium RC</option>

value属性的值“RC”将作为参数传递给selectByValue方法。

代码:

  1. multiSelect.selectByValue("RC");

3. selectByIndex(int arg0)和deselectByIndex(int arg0)

这些方法选择和取消选择指定索引值处的选项。 重要的是要注意,索引值始终以零开头。

语法selectObject.selectByIndex("option_index");

selectObject.deselectByIndex("option_index");

示例:让我们从 Selenium 工具腰间多选选项中取消选择“Selenium RC”。

基于 HTML 代码,Selenium IDE 的索引为 0,Selenium WebDriver 的索引为 1,Selenium RC 的索引为 2。

代码:

  1. multiSelect.deselectByIndex(2);

4. deselectAll()

此方法清除选择。 没有传递参数。

注意:

此方法仅适用于多选方案,即<select>标签应具有值为“multiple”的multi属性。 否则抛出NotImplementedError

语法selectObject.deselectAll()

示例:让我们取消选择在 Selenium 工具套件多重选择框中选择的所有选项。

代码:

  1. multiSelect.deselectAll();

5. isMultiple()

当您想知道 Web 元素是否允许多选时,此方法很方便。 它返回truefalse。 没有传递参数。

语法selectObject.isMultiple()

6. getOptions()

此方法作为 Web 元素返回在多重选择框中可用的所有选项的列表。

语法selectObject.getOptions()

代码:

  1. List<WebElement> allOptions = multiSelect.getOptions();

7. getFirstSelectedOption()

此方法在多重选择框中返回第一个选定的选项。 如果在仅允许单个选择的下拉菜单中使用此选项,则将所选选项作为 Web 元素返回。

语法selectObject.getFirstSelectedOption().getText()

这将返回所选的选项文本。

8. getAllSelectedOptions()

此方法返回作为多选框的一部分而被选择为 Web 元素的所有选项的列表。

语法selectObject.getAllSelectedOptions()

代码:

  1. List<WebElement> allSelectedOptions = multiSelect.getAllSelectedOptions();

概览

让我们来看一个测试案例,该案例实现了迄今为止本文中涵盖的所有操作,

场景

  1. 打开 Firefox 浏览器
  2. 导航到演示站点
  3. 使用 ID 找到“编程语言”下拉菜单
  4. Select类创建一个对象
  5. 通过可见的文本选择“JavaScript”语言
  6. 将选定的选项打印到控制台
  7. 检查“编程语言”下拉列表是否支持多项选择并将相应消息打印到控制台
  8. 使用名称找到“Selenium Tool Suite”多选框
  9. 使用多选 Web 元素创建Select类的实例
  10. 根据其值选择“Selenium RC”和“优势”
  11. 通过索引取消选择“Selenium RC”
  12. 通过可见的文本选择“Selenium WebDriver”
  13. 在列表中获取所有选定的选项,并将它们打印到控制台
  14. 验证 Eclipse IDE 控制台输出屏幕和 JUnit 窗格是否成功

此方案的 JUnit 代码是,

  1. package com.blog.junitTests;
  2. import java.util.List;
  3. import java.util.concurrent.TimeUnit;
  4. import org.junit.After;
  5. import org.junit.Before;
  6. import org.junit.Test;
  7. import org.openqa.selenium.By;
  8. import org.openqa.selenium.WebDriver;
  9. import org.openqa.selenium.WebElement;
  10. import org.openqa.selenium.firefox.FirefoxDriver;
  11. import org.openqa.selenium.support.ui.Select;
  12. public class SelectItems {
  13. // Declaring variables
  14. private WebDriver driver;
  15. private String baseUrl;
  16. @Before
  17. public void setUp() throws Exception {
  18. // Selenium version 3 beta releases require system property set up
  19. System.setProperty("webdriver.gecko.driver", "E:\\ Softwares\\"
  20. + "Selenium\\geckodriver-v0.10.0-win64\\geckodriver.exe");
  21. // Create a new instance for the class FirefoxDriver
  22. // that implements WebDriver interface
  23. driver = new FirefoxDriver();
  24. // Implicit wait for 5 seconds
  25. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  26. // Assign the URL to be invoked to a String variable
  27. // baseUrl = "https://chandanachaitanya.github.io/selenium-practice-site/";
  28. baseUrl = "file:///E:/Chandu/My%20Blog/githubDemoSite/index.html";
  29. }
  30. @Test
  31. public void testPageTitle() throws Exception {
  32. // Open baseUrl in Firefox browser window
  33. driver.get(baseUrl);
  34. // Locate 'Programming Languages' dropdown using id
  35. WebElement languagesDD = driver.findElement(By.id("programming-languages"));
  36. // Create an instance of 'Select' class by passing the dropdown web element
  37. Select languages = new Select(languagesDD);
  38. // Select 'JavaScript' language by its visible text
  39. languages.selectByVisibleText("JavaScript");
  40. // Prints the selected option to console
  41. System.out.println("Selected programming language is: " + languages.getFirstSelectedOption().getText());
  42. // Check if languages dropdown supports multiple selection and print the result to console
  43. if(languages.isMultiple()){
  44. System.out.println("Languages dropdown supports multiple selection");
  45. }else {
  46. System.out.println("Languages dropdown does not support multiple selection");
  47. }
  48. // Locate multi select element using name
  49. WebElement toolSuite = driver.findElement(By.name("selenium_suite"));
  50. // Create an instance of 'Select' class by passing the multi select element
  51. Select multiSelect = new Select(toolSuite);
  52. // Select 'Selenium RC' by its value
  53. multiSelect.selectByValue("RC");
  54. // Select 'Advantages' by its value
  55. multiSelect.selectByValue("Adv");
  56. // De-select 'Selenium RC' by its index
  57. multiSelect.deselectByIndex(2);
  58. // Select "Selenium WebDriver" by its visible text
  59. multiSelect.selectByVisibleText("Selenium WebDriver");
  60. // Get all selected options in a list
  61. List<WebElement> suiteItems = multiSelect.getAllSelectedOptions();
  62. // Prints all selected options
  63. System.out.println("Options selected under 'Selenium Tool Suite' are:");
  64. for (WebElement option : suiteItems) {
  65. System.out.println(option.getText());
  66. }
  67. } // End of @Test
  68. @After
  69. public void tearDown() throws Exception {
  70. // Close the Firefox browser
  71. driver.close();
  72. }
  73. }

执行结果:

每行代码都带有不言自明的注释,并且部分代码作为帖子中涉及的每个概念的一部分进行了说明。

在 JUnit 窗口中,绿色条显示测试用例已成功执行。 控制台窗口显示没有任何错误。 它还按预期显示所有打印的消息。

select items eclipse output

下图显示了成功执行测试脚本后获得的 Firefox 输出。

select items firefox output

这个概念并不难缠您的头。 因此,开始大量练习。 我很快会在另一篇文章中再见。 祝你有美好的一天!