Как выбрать значение в элементе span при тестировании Selenium?

Страница, которую я пытаюсь протестировать, имеет элемент span, который фактически функционирует как раскрывающееся меню выбора. Код Selenium для "select" элементов не работает и выдает следующее:

Exception in thread "main" org.openqa.selenium.support.ui.UnexpectedTagNameException: Element should have been "select" but was "span"

Код этого элемента выглядит следующим образом:

<span style="width: 100%" val="30" id="countVal">30</span>

Когда я открываю раскрывающееся меню, появляется следующий код:

<tr onclick="selectNewCount(1);" class="selec_option">
<td onmouseout="blankit(this)" onmouseover="colorit(this)" class="bones_pointer out_color" id="tdgroup1">50</td>
</tr>

Вот как это выглядит:

Форма с псевдоэлементом выбора

ИЗМЕНИТЬ 1:

Это мой код Selenium:

            // choose number of records.
        try {
            WebDriverWait wait = new WebDriverWait(driver, /*seconds=*/10);

            element = wait.until(presenceOfElementLocated(By.id("countVal")));

            Select select = new Select(element);
            select.deselectAll();
            select.selectByVisibleText("100");

        } catch (NoSuchElementException ex) {
            System.out.println("PAGE SOURCE: \n" + driver.getPageSource());
            ex.printStackTrace();
        }

Вот как выглядит исходный код страницы вокруг этого элемента:

введите описание изображения здесь

При необходимости я могу добавить более подробную информацию. Спасибо.


person vlr    schedule 21.12.2012    source источник
comment
Можете ли вы также поделиться тем, как выглядит ваш Java-код Selenium?   -  person Amey    schedule 21.12.2012
comment
во что попадает пролёт? что является родительским элементом диапазона?   -  person niharika_neo    schedule 21.12.2012
comment
@amey, я только что добавил информацию к вопросу в разделе РЕДАКТИРОВАТЬ 1. Спасибо.   -  person vlr    schedule 21.12.2012
comment
@niharika_neo, я добавил изображение исходника страницы. Спасибо.   -  person vlr    schedule 21.12.2012


Ответы (4)


Итак, вот что происходит:

Когда вы нажимаете <div id="countSelect"></div>, выполняется JavaScript show_countSelector(), и значения добавляются в таблицу. Эти «параметры выбора» на самом деле являются «строками таблицы».

Итак, ваши шаги:
1) Если нет строк с классом selec_option под div с идентификатором countSelect, вам нужно сначала щелкнуть этот div.
2) После этого вы щелкните конкретную строку.

Поэтому я попробую показать код Java (правда, я использую Python для Selenium):

WebElement selectorElement = driver.find(By.xpath('//*[@id="countSelect"]')));

WebElement elementOfInterest;
try {
    //trying to get the "select option"
    elementOfInterest = selectorElement.findElement(By.xpath('//*[contains(@class,"selec_option")]/td[@text()="50"]'))

} catch (NoSuchElementException e) { 
    //so options are not visible, meaning we need to click first
    selectorElement.click()
    //good idea would be to put "wait for element" here
    elementOfInterest = selectorElement.findElement(By.xpath('//*[contains(@class,"selec_option")]/td[@text()="50"]'))
}
//this would select the option
elementOfInterest.click()

Что-то вроде этого. :)

person Alex Okrushko    schedule 21.12.2012
comment
Большое спасибо. Оно работает. Есть ли способ изменить исходный код страницы и добавить несуществующий параметр? Например, могу ли я динамически добавить раскрывающийся список для 300 записей? Я знаю, что это отдельный вопрос, но он напрямую связан с этим контекстом. Спасибо. - person vlr; 22.12.2012
comment
@vlr, вы можете сделать это без каких-либо проблем, однако это не задача автоматизации (если вы не пытаетесь проверить, что невозможно отправить другое значение). Во-первых, вы можете добавить html-код с помощью любых инструментов разработчика браузера. Во-вторых, вы можете вызвать это в своем коде: jsfiddle.net/R7e5L ПРИМЕЧАНИЕ. Поскольку вы еще не опубликовали HTML-код, когда ваш ddl открыт, я не могу гарантировать этот код в двух местах: значение tdgroup[number] и selectNewCount([number]). Я поставил 3 в качестве числа - но это только мое предположение. - person Alex Okrushko; 23.12.2012
comment
@vlr, Также любой хороший веб-разработчик заблокирует ваши попытки установить новое значение (кроме того, что предоставляет разработчик), однако, глядя на HTML-код, я думаю, что ваши разработчики не так хороши, и этот трюк может сработать. - person Alex Okrushko; 23.12.2012
comment
У меня вопрос. Как ссылка на elementOfInterest WebElement может быть доступна вне блока try catch? @vlr - person Purendra Agrawal; 13.07.2016
comment
@Purendra Я вынес объявление переменной из блока try / catch - person Alex Okrushko; 28.07.2016

Вы пробовали selectByValue("value")?

person some_other_guy    schedule 21.12.2012
comment
На самом деле он не принимает этот элемент даже до того, как я попытаюсь активировать какой-либо выбор. Падает на Select select = new Select(element); - person vlr; 21.12.2012

Это потому, что это не select, даже если кажется, что это ...

Вы должны использовать другое средство. Я думаю, что простой

element = driver.find(By.id("countVal"));
element.click()

должно сработать

Вы должны найти способ работы select, за которым должен быть задействован какой-то javascript. Когда вы узнаете, как происходит смена элемента, вы сможете узнать, что делать в Selenium. Но это уж точно не чистый select

(Примечание: это непроверенный и даже не компилируемый код, но он показывает вам, как я вижу суть)

person Grooveek    schedule 21.12.2012

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

пример для вашего случая:

 public void selectValue(String item) {
    WebElement dropDown = driver.findElement(By.id("countTd"));
    dropDown.click();

    driver.findElement(By.xpath("//td[@id='countTd']/span[text()='" + item + "']")).click();
}
person Voffa    schedule 21.12.2012