【问题标题】:Element should have been 'select' but was 'ul' - Selenium WebDriver Java元素应该是“选择”但是“ul”-Selenium WebDriver Java
【发布时间】:2015-09-12 19:43:38
【问题描述】:

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

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

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' 是包含列表实际数据的 'ul' 的 xpath。

下面是下拉列表的 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" 访问其中一个。我的页面类中的 studiesDD 按钮的 xpath 的类值为 &lt;ul class="dropdown-menu create-dropdown"&gt;,但我没有使用它,因为它会为复合类提供错误(由于单词之间的空格)。

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

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

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

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

然后我得到以下错误,

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

谁能帮我解决这个问题。将不胜感激。

【问题讨论】:

    标签: java selenium-webdriver pageobjects


    【解决方案1】:

    虽然下拉列表可能看起来像一个真正的 HTML SELECT 标签,但实际上并非如此,这就是为什么您收到的错误消息应该是“选择”但是 X。您正在使用的 Select 类用于实际的 HTML SELECT 标签,不能在其他地方使用。

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

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

    【讨论】:

      【解决方案2】:

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

      Select sType = 
      

      只有在下拉列表是 &lt;select&gt; 元素时才能使用。在这种特殊情况下,您必须使用常用的find_element selenium webdriver 函数找到要单击的元素。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多