элемент выбора веб-драйвера selenium

У меня есть элемент управления select на моем сайте. Я использую объекты страницы для взаимодействия со страницей. Если я это сделаю (с первыми двумя строками в моем классе и selectByValue в моем методе)

@FindBy(id="foo")
private Select foo;

foo.selectByValue("myValue");

Он терпит неудачу с нулевым указателем. Я также пробовал без @FindBy.

Теперь, если я делаю это в своем методе, все работает нормально и выбирает правильный элемент

Select foo = new Select(sDriver.findElement(By.id("foo")));
foo.selectByValue("myValue");

Вот фактический веб-фрагмент для этого элемента управления (отредактированный для защиты невиновных)

<select id="foo" name="service_name">
    <option selected="selected" value="one">one</option>
    <option value="two">two</option>
    <option value="three">three</option>
</select>

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


person ducati1212    schedule 07.03.2012    source источник


Ответы (3)


Это потому, что класс Select имеет этот конструктор:

Select(WebElement element)

См. Javadoc.

Итак, если вы сделаете что-то вроде этого:

@FindBy(id="foo")
private WebElement wannabeSelect;
Select realSelect = new Select(wannabeSelect);
realSelect.selectByValue("myValue");

Он должен работать.

Кстати, я использую тот же подход, что и вы, в «обходном пути», потому что я не хочу создавать новый объект WebElement, когда мне нужен объект Select. Но так или иначе,

sDriver.findElement(By.id("foo"));

возвращает WebElement, поэтому он работает. Вы также можете сделать это:

 WebElement wannabeSelect = sDriver.findElement(By.id("foo"));
 Select foo = new Select(wannabeSelect);
person Pavel Janicek    schedule 07.03.2012
comment
ах, в этом есть смысл, просто казалось, что это должно сработать, поэтому я никогда не копал глубоко. Моя вина. Спасибо - person ducati1212; 07.03.2012
comment
Примечание. Если вы включите объявление Select и приведение в свой класс сразу после объявления private WebElement, вы получите ошибки времени выполнения при создании экземпляра класса; чтобы избежать этого, вы можете поместить объявление Select и класс в метод, который взаимодействует с элементом управления экраном. Опять же, не идеально, но, похоже, работает. - person Vince Bowdren; 30.04.2013
comment
при таком подходе объекты страницы должны быть инициализированы после полной загрузки страницы и того, что объект присутствует и виден в драйвере. Чтобы его проксировать, взгляните на мою реализацию - person rrw; 17.03.2016

Существует два способа выбора значения опции:

Один:

// Denotes option value - technical name
select.selectByValue(fieldValue);       

Два:

// Denotes option text that is actually visible to be selected
select.selectByVisibleText(fieldValue);
person Ajith Moni    schedule 11.03.2014
comment
и выберите.selectByIndex(intValue) - person dmeehan; 02.09.2014

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

public void onchangedropdownselection(String object, String value) {
        driver.findElement(By.id(object)).sendKeys(value);
        driver.findElement(By.id(object)).sendKeys(Keys.UP);
        driver.findElement(By.id(object)).sendKeys(Keys.DOWN);
    }

Делая вверх и вниз, мы инициализируем скрипт onchange .......

person Satish    schedule 19.02.2015