Селен, определяющий, видна ли опция выбора - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь выбрать параметр в элементе выбора в зависимости от того, виден он или нет.

Есть ли какой-либо способ определить, видны ли опции в пределах выбора?У них есть этот атрибут в CSS, но у селена нет .isDisplayed метода для Select элементов.

    // Select page role permission
    Select pageRole = new Select (driver.findElement(By.id("page_roles")));
    pageRole.selectByIndex(1);

Ответы [ 4 ]

0 голосов
/ 19 октября 2018

Это зависит от того, что вы подразумеваете под видимым.Если вы имеете в виду .isDisplayed(), то все OPTION видны (согласно Selenium), независимо от того, видны они на самом деле или нет.

Например, перейдите на http://the -internet.herokuapp.com/ dropdown и убедитесь, что на этой странице есть элемент SELECT, который содержит два OPTION s, «Option 1» и «Option 2».Если вы обнаружите их с помощью Selenium и вернете .isDisplayed(), они оба вернут true, хотя в состоянии по умолчанию ни один из них не выбран (и не виден пользователю).

I think что вы действительно ищете, так это то, существуют ли они в списке опций.Если это то, что вы имеете в виду, мы можем это определить.Функция ниже была создана для запуска по ссылке выше.Он получает список параметров в раскрывающемся списке, извлекает текст каждого из них, а затем сравнивает строку, которую вы передаете, чтобы выяснить, является ли она доступной.

public static boolean optionExists(String option)
{
    return new Select(driver.findElement(By.id("dropdown"))).getOptions().stream().map(e -> e.getText()).collect(Collectors.toList())
            .contains(option);
}

Вы можете использовать ее следующим образом.

String option = "Option 3";
if (optionExists(option))
{
    new Select(driver.findElement(By.id("dropdown"))).selectByVisibleText(option);
}

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

0 голосов
/ 19 октября 2018

вы можете использовать xpath для этого

Это должно работать:

var select = driver.findElement(By.xpath("//*[@id='page_roles' and not(contains(@style,'display:none'))]");
//check if select is not null here
Select pageRole = new Select (select);
pageRole.selectByIndex(1);
0 голосов
/ 19 октября 2018

Мы можем проверить напрямую с помощью опции locator, чтобы проверить видимость, как показано ниже,

driver.findElements(By.cssSelector("#page_roles option[value='1']"))

Но isDisplayed () выдает исключение, если его нет.Мы должны проверить наличие элемента, проверив размер в findelements.

Таким образом, вы можете сделать условие что-то вроде этого

Выберите опцией:

if(driver.findElements(By.cssSelector("#page_roles option[value='1']")).size() > 0){
    Select pageRole = new Select (driver.findElement(By.id("page_roles")));
    pageRole.selectByIndex(1);
}

Выбрать по видимому тексту:

   String userRole="Admin";
    if(driver.findElements(By.xpath("//[@id='page_roles'/option[text() ='"+userRole+"']")).size() > 0){
        Select pageRole = new Select (driver.findElement(By.id("page_roles")));
        pageRole.selectByVisibleText(userRole);
    }
0 голосов
/ 19 октября 2018

Вы можете попытаться создать список параметров, который содержит атрибут, который вы указали:

 List<WebElement> visibleOptions = pageRole.findElements(By.cssSelector("Visible css class"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...