选择在HTML中不可见的动态元素
本文关键字:动态 元素 HTML 选择 | 更新日期: 2023-09-27 18:16:43
我在选择一个元素时遇到了麻烦,因为当用户从下拉菜单中选择一个选项时,它会动态生成一个响应。
示例,用户从下拉列表中选择"菜单集",当这完成后,工具栏(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的新选择,但这没有工作,我认为我需要选择d_toolbar_toolbar元素,然后做一些进一步的选择新的,但我不能工作出如何。
您必须测试应用程序的特定"状态"。这意味着您需要保存特定的映射,并根据下拉选择值测试它们的存在与否。这就是包装器或各种层很重要的地方,因为直到它抛出没有找到某些内容的错误时才会知道。抛出一个函数来验证一个成功的错误,然后返回一个布尔值,这是我发现的最好的方法。
//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;
}
}
就我个人而言,我做的不仅仅是这些,但我通常有多层,复杂,错误处理和结果。这是一个简单的例子,只是发现一个元素是否存在,而不破坏您的测试。
由于这些元素在DOM中不存在,可以通过选择主元素然后使用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();
}