Элемент должен был быть «выбрать», но был «ul» - Selenium WebDriver Java

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

Используя объектную модель страницы, ниже приведен мой класс страницы:

package Pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.Select;

import Lib.lib;

public class KnowledgeBase extends lib{

    By studiesDD = By.xpath(".//*[@id='warren-nav']/div[3]/ul/li[5]/ul");
    By createBtn = By.id("create-study");

    // Selecting Study Type
    public void selectStudyType(String studyType) throws Exception
    {
        driver.findElement(createBtn).click();
        Thread.sleep(2000);
        Select sType = new Select(driver.findElement(studiesDD));
        sType.selectByVisibleText(studyType);
        Thread.sleep(10000);
    }

В приведенном выше коде «createBtn» — это нажатие кнопки, которая отображает раскрывающийся список, а «studiesDD» — это xpath «ul», который содержит фактические данные списка.

Ниже приведен HTML-код выпадающего списка.

  <li class="dropdown">
    <a class="dropdown-toggle" data-toggle="dropdown" href="#" id="create-study">
      <i class="fa fa-plus-circle warren-nav-icon"></i>Create
    </a>
    <ul class="dropdown-menu create-dropdown">

        <li data-study-type="event">
          <a href="/finance/warren/studies/new/kensho.event"
             class="create-study-link event"
             target="_self">
            <i class="fa fa-calendar" title="event"></i> Event Analysis
          </a>
        </li>

        <li data-study-type="cyclical">
          <a href="/finance/warren/studies/new/kensho.cyclical"
             class="create-study-link cyclical"
             target="_self">
            <i class="fa fa-retweet" title="cyclical"></i> Cyclical Analysis
          </a>
        </li>

        <li data-study-type="conditional">
          <a href="/finance/warren/studies/new/kensho.conditional"
             class="create-study-link conditional"
             target="_self">
            <i class="fa fa-random" title="conditional"></i> Conditional Analysis
          </a>
        </li>

        <li data-study-type="multi_condition">
          <a href="/finance/warren/studies/new/kensho.multi_condition"
             class="create-study-link multi_condition"
             target="_self">
            <i class="fa fa-random" title="multi_condition"></i> Multiple Conditions Analysis
          </a>
        </li>

        <li data-study-type="relative">
          <a href="/finance/warren/studies/new/kensho.relative"
             class="create-study-link relative"
             target="_self">
            <i class="fa fa-bar-chart-o" title="relative"></i> Relative Analysis
          </a>
        </li>

        <li data-study-type="relative_multiple">
          <a href="/finance/warren/studies/new/kensho.relative_multiple"
             class="create-study-link relative_multiple"
             target="_self">
            <i class="fa fa-bar-chart-o" title="relative_multiple"></i> Relative Analysis: Multiple Date Ranges
          </a>
        </li>

        <li data-study-type="regime_change">
          <a href="/finance/warren/studies/new/kensho.regime_change"
             class="create-study-link regime_change"
             target="_self">
            <i class="fa fa-globe" title="regime_change"></i> Global Scenario Analysis
          </a>
        </li>

        <li data-study-type="consensus_analysis">
          <a href="/finance/warren/studies/new/kensho.consensus_analysis"
             class="create-study-link consensus_analysis"
             target="_self">
            <i class="fa fa-puzzle-piece" title="consensus_analysis"></i> Economic Consensus/Surprise Analysis
          </a>
        </li>

        <li data-study-type="trigger">
          <a href="/finance/warren/studies/new/kensho.trigger"
             class="create-study-link trigger"
             target="_self">
            <i class="fa fa-random" title="trigger"></i> Trigger Analysis
          </a>
        </li>

        <li data-study-type="earnings_analysis">
          <a href="/finance/warren/studies/new/kensho.earnings_analysis"
             class="create-study-link earnings_analysis"
             target="_self">
            <i class="fa fa-dot-circle-o" title="earnings_analysis"></i> Earnings Consensus/Surprise Analysis
          </a>
        </li>

        <li data-study-type="price_movement_analysis">
          <a href="/finance/warren/studies/new/kensho.price_movement_analysis"
             class="create-study-link price_movement_analysis"
             target="_self">
            <i class="fa fa-line-chart" title="price_movement_analysis"></i> Price Movement Trigger Analysis
          </a>
        </li>

    </ul>
  </li>

В коде HTML class = "dropdown-toggle" представляет 5 разных раскрывающихся ссылок, и я пытаюсь получить доступ к одной из них с id = "create-study". Кнопка xpath для StudiesDD в моем классе страниц имеет значение класса как <ul class="dropdown-menu create-dropdown">, но я не использую его, так как это дает ошибку для составного класса (из-за пробела между словами).

Теперь, когда я запускаю свой тест, он выдает следующую ошибку:

Element should have been "select" but was "ul"

Если я изменю оператор select в своем классе страницы на следующий,

Select sType = new Select(driver.findElement(createBtn));

то я получаю следующую ошибку,

Element should have been "select" but was "a"

Может ли кто-нибудь помочь мне решить эту проблему. Это будет высоко оценено.


person Uziii    schedule 12.09.2015    source источник


Ответы (3)


Хотя раскрывающийся список может выглядеть как настоящий HTML-тег SELECT, на самом деле это не так, и поэтому вы получаете сообщения об ошибках, которые должны были быть «выбрать», но были X. Класс Select, который вы используете, предназначен для фактических HTML-тегов SELECT и нельзя использовать в другом месте.

То, что вы хотите, это код ниже. Я переписал метод selectStudyType(), чтобы он принимал параметр String, соответствующий классу CSS в тегах A, по которым вы хотите щелкнуть, чтобы ваша функция заработала.

Обычно мне не нравится писать такие функции, потому что для этого требуется, чтобы потребитель имел внутреннее знание HTML-страницы, что, как правило, не является лучшей практикой. Вместо этого я бы написал функцию для каждого из типов исследований и дал им конкретные имена, например. clickEventAnalysisLink(). Это делает очевидным для потребителя, что делает этот метод.

/**
 * Selecting Study Type
 * @param studyType
 *            the CSS class name on the A tag that corresponds to the study link. Current types are "event", "cyclical", etc.
 */
public void selectStudyType(String studyType)
{
    driver.findElement(createBtn).click();
    // you might need a slight pause here waiting for the dropdown to load and open
    driver.findElement(By.cssSelector("a.create-study-link." + studyType)).click();
}
person JeffC    schedule 13.09.2015

Вы не можете преобразовать html-элемент ul в тип select. Это означает, что следующая часть вашего кода -

Select sType = 

можно использовать только в том случае, если раскрывающийся список был элементом <select>. В этом конкретном сценарии вам нужно будет найти элемент, который нужно щелкнуть, используя обычные функции веб-драйвера find_element selenium.

person Vikas Ojha    schedule 12.09.2015

Выпадающий список в html не является обычным элементом выбора. Это неупорядоченный список.

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

    // Selecting Study Type
    public void selectStudyType(String studyType) throws Exception
    {
    List<WebElement> allOptions = dropDown.findElements(By.cssSelector(".dropdown-menu li"));

    java.util.Iterator<WebElement> i = allOptions.iterator();
    while(i.hasNext()) {
        WebElement ele = i.next();
        if (ele.text.equals(studyType) {
            ele.click();
        // do something in else perhaps
        }
    }
 }
person Shambu    schedule 12.09.2015