元素应该是 'select' 而是 'ul' - Selenium WebDriver Java

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32542967/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 20:21:23  来源:igfitidea点击:

Element should have been 'select' but was 'ul' - Selenium WebDriver Java

javaselenium-webdriverpageobjects

提问by Uziii

I am having this issue in my selenium code, while accessing drop down list elements.

我在访问下拉列表元素时在我的 selenium 代码中遇到了这个问题。

Using page object model, below is my page class:

使用页面对象模型,下面是我的页面类:

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);
    }

In the above code, 'createBtn' is the button clicking which displays the drop down list and 'studiesDD' is the xpath of the 'ul' that contains the actual data of the list.

在上面的代码中,'createBtn' 是显示下拉列表的按钮单击,'studiesDD' 是包含列表实际数据的 'ul' 的 xpath。

Below is the HTML code for the drop down list

下面是下拉列表的 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>

In the HTML code, class = "dropdown-toggle"represents 5 different drop down links and I am trying to access the one with id = "create-study". The xpath for studiesDD button in my page class has the class value as <ul class="dropdown-menu create-dropdown">, but I am not using it as it gives error for compound class (due to space between the words).

在 HTML 代码中,class = "dropdown-toggle"代表 5 个不同的下拉链接,我正在尝试使用id = "create-study". 我的页面类中的 learningDD 按钮的 xpath 的类值为<ul class="dropdown-menu create-dropdown">,但我没有使用它,因为它为复合类提供了错误(由于单词之间的空格)。

Now, when I run my test, it gives me the following error,

现在,当我运行测试时,它给了我以下错误,

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

If I change the select statement in my page class to following,

如果我将页面类中的选择语句更改为以下,

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

then I get the following error,

然后我收到以下错误,

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

Can somebody help me solving this issue. It will be much appreciated.

有人可以帮我解决这个问题。将不胜感激。

回答by JeffC

While the dropdown might look like a real HTML SELECTtag, it is in fact not and that's why you are getting error messages around should have been "select" but was X. The Selectclass that you are using is for actual HTML SELECTtags and can't be used elsewhere.

虽然下拉菜单可能看起来像一个真正的 HTMLSELECT标签,但实际上不是,这就是为什么您收到错误消息的原因应该是“选择”,但是是 X。Select您使用的类是用于实际的 HTMLSELECT标签,不能在别处使用。

What you want is the code below. I rewrote the selectStudyType()method to take a String parameter that corresponds to the CSS class on the Atags that you will want to click to make your function work.

你想要的是下面的代码。我重新编写了该selectStudyType()方法,以获取与A标签上的 CSS 类相对应的 String 参数,您需要单击这些标签才能使您的函数工作。

I generally don't like write functions like this because it requires the consumer to have internal knowledge of the HTML page which is, in general, not a best practice. I would instead write a function for each of the study types and give them specific names, e.g. clickEventAnalysisLink(). That makes it dumb obvious to the consumer what that method does.

我通常不喜欢编写这样的函数,因为它要求消费者具有 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();
}

回答by Vikas Ojha

You cannot cast a ulhtml element to a selecttype. That means, thefollowing part of your code -

您不能将ulhtml 元素转换为选择类型。这意味着,您的代码的以下部分 -

Select sType = 

could be used only if the dropdown has been a <select>element. In this particular scenario, you will have to find the element to be clicked using usual find_elementselenium webdriver functions.

仅当下拉列表是一个<select>元素时才能使用。在这种特殊情况下,您必须使用通常的find_elementselenium webdriver 函数找到要单击的元素。

回答by Shambu

The drop down in html is not usual select element. It is unordered list.

html 中的下拉菜单不是通常的选择元素。是无序列表。

You need to grab the list elements and then iterate through them to get the text you want and select the element. It can be as below code

您需要获取列表元素,然后遍历它们以获取所需的文本并选择该元素。它可以是下面的代码

    // 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
        }
    }
 }