如何通过Selenium WebDriver从下拉列表中选择一个选项

时间:2018-04-11 10:28:55

标签: java selenium selenium-webdriver webdriver selenium-chromedriver

我有以下检查元素标识,用于在UI屏幕中显示一些字段的下拉列表。

DropDown值:

  • 列出item1
  • 列出项目2
  • 列出项目3

检查过的元素ID:

<select id="form1:PartialSysAdminKey_adminContractIdField" name="form1:PartialSysAdminKey_adminContractIdField" class="selectOneMenu" size="1">

如果下拉列表没有值,则会出现这种情况。

我需要显示一个sysout日志,只有当这个下拉列表至少有一个值时才会显示。

有人可以建议我如何将其纳入我的Selenium测试中?

目前,我有以下代码检查服务器是否已启动并测试登录。

package testPackage;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class TestClass {

    public static void main(String[] args) {

        ChromeOptions options = new ChromeOptions();
        options.addArguments("headless");

        System.setProperty("webdriver.chrome.driver", "D:\\Softwares\\chromedriver_win32\\chromedriver.exe");

        WebDriver driver = new ChromeDriver();
        driver.get("https://bigdata/steward.jsp");

        if (driver.getTitle().equalsIgnoreCase("Login")) {
                serverStatus = "UP";
        } else {
            serverStatus = "DOWN";
        }
        System.out.println("Server is " + serverStatus + ".");

        if (serverStatus.equalsIgnoreCase("UP")) {
            driver.findElement(By.id("username")).sendKeys("username");
            driver.findElement(By.id("password")).sendKeys("password");
            driver.findElement(By.id("login")).click();

            String newUrl = driver.getCurrentUrl();

            if (newUrl.equalsIgnoreCase("https://bigdata/error.jsp")) {
                System.out.println("Incorrect username/password.");
            } else {
                System.out.println("Logged in successfully.");
            }
        } else {
            System.out.println("Login could not be done.");
        }
        driver.quit();
    }
}

5 个答案:

答案 0 :(得分:2)

如果Drop Down由Select标签组成,那么您可以使用Selenium的Select类。

Select select = new Select(WebElement);
select.selectByIndex(int index);
select.selectByValue(String value);
select.selectByVisibleText(String text);  

如果它是由Divs和span组成的,那么你可能想要使用这段代码:

List<WebElement> options = driver.findElements(by.xpath(" your locator"));
for(WebElement element : options){
 if(element.getText().equals(" your value from drop down")){
    element.click();
}
}

更新:

HTML文件:

<html>
<head>
<title>StackOverFlow Problems </title>
</head>
<body>
<select id="form1:PartialSysAdminKey_adminContractIdField" name="form1:PartialSysAdminKey_adminContractIdField" class="selectOneMenu" size="1"> 
<option value=" "></option> 
<option value="Lstitem1">List item1</option> 
<option value="Lstitem2">List item2</option> 
<option value="Lstitem3">List item3</option> 
</select
</body>
</html>

使用Java + Selenium的自动化代码

public class Mike {

    static WebDriver driver;
    static WebDriverWait wait;

    public static void main(String[] args) throws InterruptedException {
        System.setProperty("webdriver.chrome.driver", "D:\\Automation\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        wait = new WebDriverWait(driver, 20);
        driver.get("file:///C:/Users/HunteR/Desktop/Automation/abc.html");
        Thread.sleep(3000);
        Select select = new Select(driver.findElement(By.cssSelector("select[id*='adminContractIdField']")));
        select.selectByValue("Lstitem3");
        }
    } 

它在我的机器上工作得非常好。如果您对此有任何疑虑,请与我们联系。

注意:
Thread.sleep(3000)在我的代码中用于可视化目的。

答案 1 :(得分:1)

根据上述情况,以下代码可用于相应地检查下拉列表和打印sysout日志中的元素数量。在wait.until行中,第二个参数&#39; number&#39;应根据下拉列表中的默认选项替换为0或1。即如果下拉列表为空,则使用0.如果下拉列表中有默认选项&#39; - 选择 - &#39;,则使用1.所以基本上你将要做的是,等待是否有任何选项下拉列表,超过默认内容。您可以根据应用程序加载时间更改等待时间。

try {new WebDriverWait(driver, 15).until(ExpectedConditions.numberOfElementsToBeMoreThan(By.xpath("//select[@id='form1:PartialSysAdminKey_adminContractIdField']/option"), number));
            System.out.println("Drop down has at least one value present");
        } catch (Exception e) {
            System.out.println("No options in the drop down");
        }

编辑:另一种方式可能是

List<WebElement> list_Items=driver.findElements(By.xpath("//select[@id='form1:PartialSysAdminKey_adminContractIdField']/option"));
        if(list_Items.size()>1){
            System.out.println("Drop down has at least one value present");
        }
        else{
            System.out.println("No options in the drop down");
        }

答案 2 :(得分:1)

根据您提供的 HTML ,您可以使用以下代码块:

WebElement elem = driver.findElement(By.xpath("//select[@class='selectOneMenu' and contains(@id,'PartialSysAdminKey_adminContractIdField')]"));
Select mySelect = new Select(elem);
//selecting the first item by index
mySelect.selectByIndex(1);
//selecting the second item by value
mySelect.selectByValue("Lstitem2");
//selecting the third item by text
mySelect.selectByVisibleText("List item1");

答案 3 :(得分:1)

<select id="ddMonth" name="ddMonth" style="color:#000;margin:0;min-width:65px;" onchange="Setoptvariable()" class="reqCheck">
              <option value="">MM</option>
              <option value="01">Jan</option>
              <option value="02">Feb</option>
              <option value="03">Mar</option>
              <option value="04">Apr</option>
              <option value="05">May</option>
              <option value="06">Jun</option>
              <option value="07">Jul</option>
              <option value="08">Aug</option>
              <option value="09">Sep</option>
              <option value="10">Oct</option>
              <option value="11">Nov</option>
              <option value="12">Dec</option>
 </select>

考虑上面是你的下拉。这是为了选择一个月。我们可以通过三种方式从下拉列表中选择一个选项。

方法#1:

new Select(driver.findElement(By.id("ddMonth"))).selectByIndex(0); // This will select 'MM' option in the dropdown
new Select(driver.findElement(By.id("ddMonth"))).selectByIndex(1); // This will select 'Jan' option in the dropdown
new Select(driver.findElement(By.id("ddMonth"))).selectByIndex(2); // This will select 'Feb' option in the dropdown

方法#2:

new Select(driver.findElement(By.id("ddMonth"))).selectByValue(); // This will select 'MM' option in the dropdown
new Select(driver.findElement(By.id("ddMonth"))).selectByValue("01"); // This will select 'Jan' option in the dropdown
new Select(driver.findElement(By.id("ddMonth"))).selectByValue("02"); // This will select 'Feb' option in the dropdown

方法#3:

new Select(driver.findElement(By.id("ddMonth"))).selectByVisibleText("MM"); // This will select 'MM' option in the dropdown
new Select(driver.findElement(By.id("ddMonth"))).selectByVisibleText("Jan"); // This will select 'Jan' option in the dropdown
new Select(driver.findElement(By.id("ddMonth"))).selectByVisibleText("Feb"); // This will select 'Feb' option in the dropdown

希望这会有所帮助。

答案 4 :(得分:0)

Select oSelect = new Select(driver.findElement(By.id("PartialSysAdminKey_adminContractIdField")));
oSelect.selectByValue("List item1");

说明:首先创建一个select节点元素的对象thn,通过该对象调用函数selectByValue并传递给你  值。