Как выбрать вариант из раскрывающегося списка через selenium webdriver

У меня есть следующий Идентификатор проверяемого элемента для раскрывающегося списка с несколькими полями на экране пользовательского интерфейса.

Значения DropDown:

  • Элемент списка1
  • Элемент списка2
  • Элемент списка 3

ID проверяемого элемента:

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

Бывают случаи, когда в раскрывающемся списке не будет значений.

Мне нужно отображать системный журнал, только если в этом раскрывающемся списке есть хотя бы одно значение.

Может кто-нибудь подсказать, как я могу включить это в мое тестирование 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();
    }
}

Где в этом сценарии используется dropDown?

cruisepandey 11.04.2018 12:33

Еще не пользовался. Я понятия не имею, как его использовать, поскольку я буквально новичок в Selenium.

Mike 11.04.2018 13:19

Хорошо, поделитесь соответствующим HTML для этого.

cruisepandey 11.04.2018 13:21

Не могли бы вы опубликовать полный раскрывающийся HTML-код

Ankur Singh 11.04.2018 13:23

Соответствующий HTML? Не могу тебя достать. Вы имеете в виду HTML всей страницы, которую я тестирую?

Mike 11.04.2018 13:24

Не только для выпадающего списка.

cruisepandey 11.04.2018 13:26

Здесь .. <select id = "form1: PartialSysAdminKey_adminContractIdField" name = "form1: PartialSysAdminKey_adminContractIdField" class = "selectOneMenu" size = "1"> <option value = ""> </option> <option value = "Lstitem1"> Список item1 </option> <option value = "Lstitem2"> List item1 </option> <option value = "Lstitem3"> List item1 </option> </select>

Mike 11.04.2018 13:31
0
7
4 586
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Если выпадающий список состоит из тега Select, вы можете использовать класс Select Selenium.

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

Если он состоит из Div и Spans, вы можете использовать этот код:

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) использовался в моем коде для визуализации.

Вы можете следовать первому коду, который использует класс выбора, поскольку ваш HTML-код содержит теги выбора и теги параметров внутри него.

cruisepandey 11.04.2018 13:34

Что обозначает WebElement?

Mike 11.04.2018 13:52

driver.findElement (by.id ("какой-то идентификатор")); вернет соответствующий WebElement.

cruisepandey 11.04.2018 13:54

круиз .. Меня беспокоит идентификатор .. У select WebElement есть ID "form1: PartialSysAdminKey_adminContractIdField" .. Когда я включаю это в "Select select = new Select (WebElement);" вы упомянули, я получаю сообщение об ошибке «нет такого элемента: невозможно найти элемент: {« метод »:« идентификатор »,« селектор »:« form1: PartialSysAdminKey_adminCon tractIdField »}».

Mike 11.04.2018 14:16

использование: Select select = new Select (driver.findElement (by.cssSelector ("select [id * =" Partia‌ lSysAdminKey "]"))); и сообщите мне, сможете ли вы решить свою проблему.

cruisepandey 11.04.2018 14:34

Неа ! Синтаксическая ошибка токена PartialSysAdminKey_adminContractIdField, недопустимый AssignmentOperator

Mike 11.04.2018 14:47

Хорошо, я сделаю HTML с предоставленным кодом, и если он сработает, я обновлю вас!

cruisepandey 11.04.2018 17:23

Я создал HTML-файл и разместил предоставленный вами код. Пожалуйста, найдите мой обновленный ответ.

cruisepandey 11.04.2018 19:02

Спасибо, Круз. Я точно добавляю ваш код к своему. Но все же я получаю эту ошибку, исключение в потоке "main" org.openqa.selenium.NoSuchElementException: нет такого элемента: невозможно найти элемент: {"method": "css selector", "selector": "select [id * = 'adminContractIdField'] "}! Будут ли какие-либо другие проблемы в моих настройках / конфигурациях?

Mike 12.04.2018 06:28

Майк, мы получаем NoSuchElementExceptions, когда наш веб-драйвер не может найти WebElement, присутствующий в DOM. Не могли бы вы проверить, когда мы используем этот локатор: select [id * = 'adminContractIdField'], сколько элементов присутствует в DOM? Это поможет диагностировать эту проблему.

cruisepandey 12.04.2018 08:00
Select oSelect = new Select(driver.findElement(By.id("PartialSysAdminKey_adminContractIdField")));
oSelect.selectByValue("List item1");

Объяснение: сначала создайте объект элемента select node thn, с помощью этого объекта вызовите функцию selectByValue и передайте свой значение.

Ответ принят как подходящий

В соответствии с упомянутым случаем следующий код можно использовать для проверки количества элементов в раскрывающемся списке и соответствующей печати журнала системных сообщений. В строке wait.until второй аргумент number следует заменить на 0 или 1 в соответствии с параметрами по умолчанию, представленными в раскрывающемся списке. то есть, если раскрывающийся список пуст, используйте 0. Если в раскрывающемся списке есть параметр по умолчанию как '--Select--', используйте 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");
        }

Не работает Дхимант. Возвращает «Нет вариантов в раскрывающемся списке», даже если есть раскрывающийся список.

Mike 11.04.2018 15:23

Я выбрал «1» в качестве значения для указанного «числа». Первый элемент.

Mike 11.04.2018 15:24

Вы пытались увеличить время ожидания? Страница может занять некоторое время, чтобы загрузить параметры в раскрывающемся списке. Возможно новый WebDriverWait (драйвер, 30)

Dheemanth Bhandarkar 12.04.2018 06:26

Да да .. Тоже пробовал.

Mike 12.04.2018 06:35

Я отредактировал свой ответ и добавил еще одно возможное решение. Пожалуйста, попробуйте и дайте мне знать.

Dheemanth Bhandarkar 12.04.2018 06:36

В соответствии с предоставленным вами 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");
<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

Надеюсь, это поможет.

Другие вопросы по теме