У меня есть следующий Идентификатор проверяемого элемента для раскрывающегося списка с несколькими полями на экране пользовательского интерфейса.
Значения DropDown:
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();
}
}
Еще не пользовался. Я понятия не имею, как его использовать, поскольку я буквально новичок в Selenium.
Хорошо, поделитесь соответствующим HTML для этого.
Не могли бы вы опубликовать полный раскрывающийся HTML-код
Соответствующий HTML? Не могу тебя достать. Вы имеете в виду HTML всей страницы, которую я тестирую?
Не только для выпадающего списка.
Здесь .. <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>
Если выпадающий список состоит из тега 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-код содержит теги выбора и теги параметров внутри него.
Что обозначает WebElement?
driver.findElement (by.id ("какой-то идентификатор")); вернет соответствующий WebElement.
круиз .. Меня беспокоит идентификатор .. У select WebElement есть ID "form1: PartialSysAdminKey_adminContractIdField" .. Когда я включаю это в "Select select = new Select (WebElement);" вы упомянули, я получаю сообщение об ошибке «нет такого элемента: невозможно найти элемент: {« метод »:« идентификатор »,« селектор »:« form1: PartialSysAdminKey_adminCon tractIdField »}».
использование: Select select = new Select (driver.findElement (by.cssSelector ("select [id * = " Partia lSysAdminKey "]"))); и сообщите мне, сможете ли вы решить свою проблему.
Неа ! Синтаксическая ошибка токена PartialSysAdminKey_adminContractIdField, недопустимый AssignmentOperator
Хорошо, я сделаю HTML с предоставленным кодом, и если он сработает, я обновлю вас!
Я создал HTML-файл и разместил предоставленный вами код. Пожалуйста, найдите мой обновленный ответ.
Спасибо, Круз. Я точно добавляю ваш код к своему. Но все же я получаю эту ошибку, исключение в потоке "main" org.openqa.selenium.NoSuchElementException: нет такого элемента: невозможно найти элемент: {"method": "css selector", "selector": "select [id * = 'adminContractIdField'] "}! Будут ли какие-либо другие проблемы в моих настройках / конфигурациях?
Майк, мы получаем NoSuchElementExceptions, когда наш веб-драйвер не может найти WebElement, присутствующий в DOM. Не могли бы вы проверить, когда мы используем этот локатор: select [id * = 'adminContractIdField'], сколько элементов присутствует в DOM? Это поможет диагностировать эту проблему.
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");
}
Не работает Дхимант. Возвращает «Нет вариантов в раскрывающемся списке», даже если есть раскрывающийся список.
Я выбрал «1» в качестве значения для указанного «числа». Первый элемент.
Вы пытались увеличить время ожидания? Страница может занять некоторое время, чтобы загрузить параметры в раскрывающемся списке. Возможно новый WebDriverWait (драйвер, 30)
Да да .. Тоже пробовал.
Я отредактировал свой ответ и добавил еще одно возможное решение. Пожалуйста, попробуйте и дайте мне знать.
В соответствии с предоставленным вами 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
Надеюсь, это поможет.
Где в этом сценарии используется dropDown?