选择在HTML中不可见的动态元素

时间:2014-08-05 17:25:52

标签: c# html selenium

我在选择元素时遇到问题,因为它会在响应用户从下拉列表中选择一个选项时动态生成。

例如,用户从下拉列表中选择“菜单集”,完成后,工具栏上会出现“新建”按钮(ID:d_toolbar_toolbar)

这取决于选择,并且当我用I.E.检查它时不会出现在html中。开发人员工具。

我查看了网页的来源,我找到了下面的内容,似乎是根据选择动态添加到工具栏上,使用Javascript

<table border="0" cellspacing="2" width="100%" height="100%">
<tr>
<td height="24">
<?XML:NAMESPACE PREFIX="TBNS" /><?IMPORT NAMESPACE="TBNS"  IMPLEMENTATION="/webctrl_client/1_0/toolbar.htc" />
<TBNS:Toolbar id="d_toolbar_toolbar" class="standarddarkrow" oncheckchange="javascript:toolbarButtonClicked('{0}','{1}','False',-1,13, true, 'd:toolbar:toolbar')" oncheckchange="JScript:if (event.srcNode != null) __d_toolbar_toolbar_State__.value+=((event.srcNode.getAttribute('selected')=='true')?'+':'-')+event.flatIndex+';';" onbuttonclick="JScript:if (event.srcNode != null) if ((event.srcNode.getType() != 'checkbutton') || (event.srcNode.getAttribute('_autopostback') != null)) if (getAttribute('_submitting') != 'true'){setAttribute('_submitting', 'true');try{__doPostBack('d$toolbar$toolbar',event.flatIndex);}catch(e){setAttribute('_submitting', 'false');}}" onwcready="JScript:try{__d_toolbar_toolbar_State__.value = ''}catch(e){}" defaultstyle="color:black;border:solid 1px #E0E3EA;background:#E0E3EA;padding:0px;" hoverstyle="border:solid 1px #416791;background:#E0E3EA;margin:0px;padding:0px;" selectedstyle="color:black;border:solid 1px #E0E3EA;background:#E0E3EA;padding:0px;" style="border-width:0px;font-family:Tahoma;font-size:8pt;">
<TBNS:ToolbarButton ID="New" imageUrl="http://www.starchef.net/skins/default/new.gif"  onkeydown="if (event.keyCode==13){event.returnValue=false}">New</TBNS:ToolbarButton>

我试图通过ID选择New但这没有用,我认为我需要选择d_toolbar_toolbar元素,然后再做一些事情来选择New,但我无法弄清楚如何。

2 个答案:

答案 0 :(得分:0)

您必须测试特定的状态&#34;申请。这意味着您需要保存特定的地图并根据下拉选择值测试它们的存在/不存在。这是一个包装器或各个层很重要的地方,因为你不知道,直到它因为找不到东西而抛出错误。抛出一个验证成功错误的函数,然后返回一个布尔值,这是我发现的最好的方法。

//if (dropdown option value == x)
    if (ElementExists(By.XPath(xpathHiddenElement))
      //log what you want to or do some other check
    else
      //log what you want to or do some other check

public bool ElementExists(By by)
{
    try
    {
        IWebElement element = driver.FindElement(by);
        return true;
    }
    catch (NoSuchElementException)
    {
        return false;
    }
}

就我个人而言,我做的不仅仅是这个,但我通常有多层次,复杂性,错误处理和结果。这是一个简单的例子,可以在不破坏测试的情况下查找元素是否存在。

答案 1 :(得分:0)

由于DOM中不存在这些元素,因此通过选择main元素然后使用movebyoffset操作进行单击来解析。

    public void ClickNewMenuSet()
    {
        var element = _driver.FindElement(By.Id(("d_toolbar_toolbar")));
        var actions = new Actions(_driver);
        actions.Click(element).MoveByOffset(-450, 0).Click().Build().Perform();
    }