我正在尝试使用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控件。如果有人能够生成一个可以从资产下拉菜单中选择项目的工作测试并解释当前代码无法正常工作的原因,我会一次性提供赏金。
答案 0 :(得分:5)
我花了一段时间看着这个,并认为问题归结为你正在使用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个匹配项。所以也许这也会导致一些问题。如果您认为它可能保持不变,那么您可以使用的选项上有一个id(看起来它可能会自动生成)
希望这对你有用!让我知道你是怎么过的。
答案 1 :(得分:2)
似乎javascript或jquery事件与该下拉列表绑定。尝试使用eval。
按班级查找链接。
var link = myIE.Link(Find.ByClass(“chzn-single”));
link.DomContainer.Eval( “$( 'chzn单')点击();”);
尝试此链接可能有所帮助 http://thecuttingledge.com/?p=328
答案 2 :(得分:0)
我使用此代码查找选择列表并在其中选择一个选项
IE browser=new IE();
var slist = browser.SelectList(Find.ById("the id of select list"));
slist.Option(Find.ByValue("1")).Select();
答案 3 :(得分:0)
你不需要像这样复杂化,通过梳理字符串等来手动创建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
答案 4 :(得分:-1)
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();
}