【问题标题】:Select an option using Watin使用 Watin 选择一个选项
【发布时间】:2014-03-04 15:29:12
【问题描述】:

我正在尝试使用 Watin 从 page 的第一个资产选择下拉列表中选择一个项目,但无法正常工作。

此示例链接具有几乎相同的控件,并且代码完美运行Watin can't select an option from a select list

但是,尝试应用相同的逻辑确实会找到正确的元素,但没有选择任何内容。请有人可以帮助确定为什么这不起作用?

[Test]
public void ChosenTest()
{
    IE myIE = new IE(true);
    myIE.GoTo("http://www.marketoptions.com/trading-platform/");

    myIE.SelectList(Find.ByClass("assetSelect chzn-ltr chzn-done")).WaitUntilExists(); 

    string id = myIE.SelectList(Find.ByClass("assetSelect chzn-ltr chzn-done")).Id;
    myIE.Div(id + "_chzn").Div(Find.ByClass("chzn-drop")).ElementWithTag("li", Find.ByIndex(7)).Click();
    myIE.Div(id + "_chzn").Links[0].Spans[0].Click(); 
}

编辑:看起来 css 样式有一些影响,不允许 Watin 单击或选择标准 html 控件。如果有人可以生成一个工作测试,该测试将从资产下拉列表中选择一个项目并解释为什么当前代码不起作用,我将提供赏金。

【问题讨论】:

  • 了解更多 - 你想获得第一个 itme == "AUD/CAD" 被选中?
  • 我希望能够按值或索引选择列表中的任何项目。
  • 该网站在一天中的某个时间没有显示交易平台吗?它现在显示现在以二进制交易,并且带有下拉列表的表格不显示?这里有什么秘密?
  • 这个平台是周一到周五都可以看到的,没想到第一次发帖后周末还是卡在这个平台上:)

标签: c# javascript jquery watin


【解决方案1】:

我花了一段时间研究这个问题并认为问题归结为您使用的是一个 ajax 控件,它实际上用动态生成的 html 替换了选择列表。事实上,原来的选择被隐藏了,这使得改变变得有问题。

我过去解决此类问题的方法是使用 ajax 控件 javascript API 来设置值,然后通过使用 Watin 执行脚本来触发它的方法。

这是我的代码:

IE myIE = new IE();
myIE.GoTo("http://www.marketoptions.com/trading-platform/");

myIE.SelectList(Find.ByClass("assetSelect chzn-ltr chzn-done")).WaitUntilExists();

// remove the currently selected value
myIE.DomContainer.Eval("$('td.assetControl select option').removeAttr('selected');");

// set the new selected value
myIE.DomContainer.Eval("$('td.assetControl select option:contains(EUR/JPY)').attr('selected', 'selected');");

// update the ajax control to refresh the UI
myIE.DomContainer.Eval("$('td.assetControl select').trigger('liszt:updated');");

// sit back and enjoy the view as you hopefully see the UI showing the value that you wanted :)
Thread.Sleep(8000);

显然您需要将 EUR/JPY 更改为您想要的值。

另外,请注意我使用 td.assetControl select 作为选择器。这假定它是此单元格中的唯一选择。当我第一次在浏览器中尝试时,您使用的选择器实际上找到了 4 个匹配项。所以也许这也引起了一些问题。如果您认为它可能保持不变,那么实际上您可以在 select 上使用一个 id(虽然它看起来可能是自动生成的)

希望这对您有用!让我知道你过得怎么样。

【讨论】:

  • 附注我有一个工作示例,如果你愿意,我可以通过电子邮件向你发送 Visual Studio 项目。
  • 太棒了,非常感谢你这完美的作品!!!我唯一添加的是myIE.DomContainer.Eval(string.Format("$('#{0}').change();", element.Id));,用于在选择更改后触发更改事件,其中var element = myIE.SelectList(Find.ByClass("assetSelect chzn-ltr chzn-done"));。再次感谢您的奖金。
  • 谢谢,你刚刚使我的 SO 排名翻了一番!无论如何,很高兴它对你有用!
  • 嗨 Rob... 我离它很近了。我花了超过 4-5 个小时,但最后逐渐淡出......很好的解决方案......被挪用了。为你投票。 :)
【解决方案2】:

似乎 javascript 或 jquery 事件与该下拉列表绑定。尝试使用 eval。

按类别查找链接。

var link = myIE.Link(Find.ByClass("chzn-single"));

link.DomContainer.Eval("$('chzn-single').click();");

试试这个链接,这可能会有所帮助 http://thecuttingledge.com/?p=328

【讨论】:

    【解决方案3】:

    我使用此代码查找选择列表并在其中选择一个选项

    IE browser=new IE();
    var slist = browser.SelectList(Find.ById("the id of select list"));
    slist.Option(Find.ByValue("1")).Select();
    

    【讨论】:

    • 您的方法不适用于我给出的示例
    • 您要在列表中选择国家吗?此选择列表有一个 id ,您可以通过 id 找到它并按值选择其中的一个项目。如果我理解你的问题,请帮助你给出答案
    • 不,我想选择货币对、股票等资产。在我的原始代码中查找元素名称。此外,周末没有交易,因此这些控件要到星期一才能使用。
    【解决方案4】:

    你不需要像这样使事情复杂化,通过组合字符串等手动制作 id。

    我无法访问您在示例中提到的网站,但从选择列表中选择一个选项应该相当简单

            //Find select list.
            var option= browser.SelectList(Find.ById("sbxControlID2"));
            if (!option.Exists)
            {
              //log error 
            }
           //find it by inspecting the select list with fire bug or any other inspection tool
            option.Select("Select option value here");
    

    你需要在 option.Select("SelectValue") 中放入什么,你可以使用 firebug 从选择列表中检查选项的值并将该值放入其中

    我已经测试过以下代码,可以从亚马逊网站上选择产品类型下拉列表

            //Find select list.
            var option= browser.SelectList(Find.ById("searchDropdownBox"));
            if (!option.Exists)
            {
              //log error 
            }
            option.Select("search-alias=arts-crafts");//This select arts and crafts option
    

    【讨论】:

    • 通常我不会将元素链接在一起,但这次我复制了包含相同控件的示例链接。有问题的示例使用 css 样式和 jquery,因此标准选择和单击不起作用。你的例子不起作用!
    • @ooo 执行 Option.Select("assetPlatformSelect_0_354");不要选择一个值,该下拉菜单也有一个 id,因此您可以直接通过它找到它
    • 我在这个下拉列表中看到的唯一区别是选择选项是分组的。
    【解决方案5】:
    public void ChosenTest() {
       IE myIE = new IE(true);
       myIE.GoTo("http://www.marketoptions.com/trading-platform/");
    
       var slist = myIE.SelectList(Find.ById("country")); 
    
       //for select France in list 
    
       slist.Option(Find.ByValue("FR")).Select(); 
    }
    

    【讨论】:

    • 控制错误!它是标记为 Asset 的控件:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2012-07-18
    • 2013-01-12
    • 2013-06-14
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多