我正在为一个旧的“infragistics”编写一个硒C#测试代码(我对这个问题不太了解)页面。在元素引用方面,该页面没有给出那么多选项。就像下面的HTML一样,我想点击INVENTORY,它是一个菜单项的子菜单,但是没有元素Id或Name,所以我使用了XPath(参见下面的代码)。看起来webdriver识别出xpath,但是当click函数执行并完成时,页面上没有任何反应。它不会打开预期的页面。有什么我在这里做错了吗?
<li class="igdm_MenuItemVertical igdm_MenuItemVerticalParent " unselectable="on" data-ig="x:1171509256.11:adr:1.2" adr="1.2"><A onclick="{return false;}" tabIndex=-1 class="igdm_MenuItemVerticalLink " href="#/Inventory...">
<a onclick="{return false;}" tabIndex=-1 class="igdm_MenuItemVerticalLink>
<img class="igdm_MenuItemVerticalIcon " alt=" Inventory..." src="../Images/report16.gif">
<span tabIndex=-1 unselectable="on"> INVENTORY...</span>
</a>
代码:
private By FileSubMenu = By.XPath(".//li/a/span[text()=' Inventory...']");
public HomePage SubMenu()
{
int retryCount = 0;
while (true && retryCount < Constants.RETRY_COUNT)
{
try
{
Thread.Sleep(3000);
IWebElement element = _driver.FindElement(FileSubMenu);
Actions Rmouseover = new Actions(_driver);
Rmouseover.MoveToElement(element).Click().Perform();
return this;
}
catch (Exception ex) when (ex is WebDriverTimeoutException || ex is TimeoutException)
{
retryCount++;
Thread.Sleep(3000);
}
}
return this;
}
答案 0 :(得分:0)
XPath是可以的,但我更喜欢CSS Selector,因为它倾向于使用较少的脆弱选择器(基于DOM的位置不是这样,但仍然可以)。要在Chrome中获得一个:
那么你的代码看起来像是:
IWebElement element = driver.FindElement(By.CssSelector("paste_the_selector_here"));
// Click via Selenium's Click method
element.Click();
// Or, click via JavaScript
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click()", element);
此外,您可能不想点击<span>
,而是点击<a>
,因为它有一个onclick事件监听器。
如果选择器包含动态父级的ID,那么您将要删除它。要删除它,请在DevTool的“元素”选项卡中找到具有该ID的元素。双击id="..."
部分并删除整个内容。现在获取子元素的选择器。
这个例子
<div id="ctl00_NavBarAdmin_WebDataMenu1"> // <- Parent div html
#ctl00_NavBarAdmin_WebDataMenu1 > ul > li:nth-child(2) > ul > li.igdm_MenuItemVertical.igdm_MenuItemVerticalParent.igdm_MenuItemVerticalSelected > a
可能会成为
<div> // <- Parent div HTML
div > ul > li:nth-child(2) > ul > li.igdm_MenuItemVertical.igdm_MenuItemVerticalParent.igdm_MenuItemVerticalSelected > a