Hello,我在chrome浏览器中有一个带有"select"元素的弹出窗口,我需要在我的ui测试场景中单击这个"select"元件。它在图片上:我的网页
我正在使用c#和TechTalk.SpecFlow。我正试图像这样点击它:
Browser.ClickWebElementNew("/html/body/div[1]/div/select", FoundBy.XPath);
以下是Browser.ClickWebElementNew((的实现,它来自硒铬驱动程序:
//
public void ClickWebElementNew(
string findElement, FoundBy f
)
{
if (f == FoundBy.XPath)
{
var element = _chromeDriver.FindElement(By.XPath(findElement));
element.Click();
}
else if (f == FoundBy.CssSelector)
{
var element = _chromeDriver.FindElement(By.CssSelector(findElement));
element.Click();
}
}
//
public IWebElement FindElement(By by) => !(by == (By) null) ? by.FindElement((ISearchContext) this) : throw new ArgumentNullException(nameof (by), "by cannot be null");
但我总是得到这个错误:
OpenQA.Selenium.NoSuchElementException : no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]/div/select
xPath to‘select’是完全正确的,我检查了很多次。在这个弹出窗口出现之前,我在测试场景中有足够的延迟,所以我做错了什么?我必须做些什么才能成功点击这个"选择"?
几个建议。我会先试试建议1。如果这不起作用,也可以试试建议2:
-
不要使用精确XPath--我经常看到这种情况。使用标记名称、属性和父元素的组合可以使定位器更加健壮。事实上,
<select>
标记有一个Id。请使用它。Id属性在HTML文档中必须是唯一的(如果不是,那就是应该修复的错误(:Browser.ClickWebElementNew("//select[@id = 'state']", FoundBy.XPath);
这有助于在将来对HTML进行微小更改时保持测试通过。
-
使用显式等待--您可能也需要它。您需要等待元素可点击。如果使用Selenium 3或安装了DotNetSeleniumExtras NuGet包,请在ClickWebElementNew方法中使用
ExpectedConditions
:public void ClickWebElementNew(string findElement, FoundBy f) { var wait = new WebDriverWait(_chromeDriver, TimeSpan.FromSeconds(30)); By locator = null; if (f == FoundBy.XPath) { locator = By.XPath(findElement) } else if (f == FoundBy.CssSelector) { locator = By.CssSelector(findElement); } else { throw new InvalidOperationException("Unsupported FoundBy"); } var element = wait.Until(ExpectedConditions.ElementToBeClickable(locator)); element.Click(); }
如果使用Selenium 4,并且您没有安装DotNetSeleniumExtras包,这应该可以工作:
var element = wait.Until(d => { d.FindElement(locator).Click(); return true; }); element.Click();
";等待元素可点击";是因为某些用户界面动画阻止Selenium与元素交互。这些可能很微妙,但很重要。任何移动或淡入都可能导致与页面交互出现问题。
如果想法1和2不起作用,请查看元素是否在框架或iframe内。在与框架的元素交互之前,需要切换到框架。还要查找与页面的同一区域重叠的元素。这也会导致问题,尤其是在无头模式下运行并且没有设置窗口大小的情况下。