3

我有一个如下的html代码。

<div class="rowElem fullSize ">
<div class="jqTransformSelectWrapper" style="z-index: 10; width: 276px;">
<div>
<span style="width: 245px;">MasterCard</span>
<a class="jqTransformSelectOpen" href="#"/>
</div>
<ul style="width: 274px; display: none; visibility: visible; height: 100px; overflow: hidden;">
<li><a class="selected" index="0" href="#">MasterCard</a></li>
<li><li><li>
</ul>
<select id="CardProvider" class="jqTransformHidden" name="CardKey" style="">
<option value="1">MasterCard</option>
<option value="2">VISA</option>
<option value="3">AMEX</option>
<option value="4">DEBIT</option>
</select>
</div>
</div>

在这里,这是一个下拉菜单,其中 //div/div/div 仅显示一个字段。//div/div/ul 有四个单独的 li,它们具有与 select 标签相同的提供者输入。

我尝试了很多组合来从下拉列表中选择一个特定的值。

如果我将 //div/div[@select[id="CardProvider"] 与 FindElement 一起使用,它会返回第一个值。

如果我使用 //div/div/[@select[id]"cardProvider"]/ul//a - 它返回给我四个值。

但是我无法选择菜单作为预期的标签选择,而是 div。如果我编写一个查询以将标记名作为选择,则文本值返回为 null。

我没有给出我的 selenium 命令,因为没有任何效果,并给出了 html 供您参考。请向我提供您的意见以克服这一点。

4

8 回答 8

2

如果可以避免这些,您可以尝试避免相对 xpath。在您的 html 中,select 元素有一个唯一标识符,即 id,可以使用它。

您可以尝试以下方法:

Select sel = new Select(driver.findElementById("CardProvider"));
sel.selectByVisibleText - there are options here to select by index, visible text and value - choose any which you think would be stable.

你可以参考这个了解更多。

于 2012-11-22T05:15:37.710 回答
0

我只是采用了一种不同的方法(一种解决方法),有两个 xpath 来定位它,它工作正常。

我使用的代码是

Driver.FindElement(By.XPath(XPATH1ofCSSDROPDOWN)).Click();
            Driver.Wait(3000); 
            Driver.FindElement(By.XPath(XPATH2ofDROPDOWNLISTELEMENT)).Click();

其中 XPATH2ofDROPDOWNLISTELEMENT = //*[@id='frmForm']//a[contains(text(), 'MasterCard')]

如果您有任何答案,除了黑板上提到的答案,请告诉我。

于 2012-11-22T14:41:47.107 回答
0

坦率地说,我更喜欢使用 css 选择器。 第一种方法:

String cssSelect="select[id='CardProvider']";
String cssMasterCard="select[id='CardProvider']>option[value='1']";
String cssVISA="select[id='CardProvider']>option[value='2']";

driver.findElement(By.cssSelector(cssSelect)).click();
driver.manage().timeouts().implicitlyWait(2,TimeUnit.SECONDS);
//clicking on e.g. MasterCard option
driver.findElement(By.cssSelector(cssMasterCard)).click();

第二种方法: 如果支持 jQuery,您可以直接单击菜单选项,而无需之前单击菜单下拉菜单:

JavascriptExecutor js = (JavascriptExecutor) driver;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("var x=$(\'"+cssMasterCard+"\');");
        stringBuilder.append("x.click();");
        js.executeScript(stringBuilder.toString());

第三种方法 点击使用 DOM 模型:

JavascriptExecutor js = (JavascriptExecutor) driver;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("document.getElementsByTagName('option')[0].click()");
        js.executeScript(stringBuilder.toString());

并且不要忘记验证在 firebug 中找到的 xPaths 或 css 选择器,在 firefox 中的 firebug 插件:

在此处输入图像描述

希望这对您有所帮助。

于 2012-11-22T14:36:45.660 回答
0

以下解决方案在没有选择的情况下实现下拉的情况下效果最好

  1. 点击下拉图标
  2. 等待列表填充
  3. 现在在清单上工作

driver.findElements(By.xpath("//div[@class='dropdown-menu']/div[@class='dropdown-menu-item']")).get(0).getText().equals (“选项1”)

您需要将所有菜单项都放在循环中,并且可以正常工作。

于 2016-09-30T13:08:02.433 回答
0
  1. 点击图标
  2. 元素列表暴露给 Selenium
  3. 选择其中之一

我在我的代码中遇到了类似的问题,上述步骤修复了它。

于 2017-01-18T10:12:07.157 回答
0
String cssSelect="select[class='filerTableSelect']";
    String cssBetween="select[class='filerTableSelect']>option[value='BETWEEN']";
    driver.findElement(By.cssSelector(cssSelect)).click();
    driver.findElement(By.cssSelector(cssBetween)).click();

像魅力一样工作

于 2017-02-01T06:03:59.997 回答
0

首先检查:您的 UI/FrontEnd 中的下拉菜单是否使用“选择”方法?如果没有,则使用下面的代码段,该代码段将单击下拉菜单并选择值。

WebElement selectMyElement = driver.findElement(this.getObject(By.Id("你的 DropDown 的 ID"))); selectMyElement.click();

        Actions keyDown = new Actions(driver);
        keyDown.sendKeys(Keys.chord(Keys.DOWN, Keys.DOWN)).perform();
于 2017-08-04T09:58:13.167 回答
-1

你可以试试这个:

IWebElement dropDownListBox = driver.findElement(By.Id("CardProvider"));
SelectElement clickThis = new SelectElement(dropDownListBox);
clickThis.SelectByText("MasterCard");
clickThis.SelectByText("VISA");
clickThis.SelectByText("AMEX");
clickThis.SelectByText("DEBIT");
于 2012-11-22T06:06:11.503 回答