无法通过 selenium chrome 驱动程序通过 xpath 单击 Web 元素
Unable to click web element by xpath via selenium chrome driver
你好,我在 chrome 浏览器中弹出 window 和 'select' 元素,我需要在我的 ui 中单击这个 'select' 元素-测试场景。它在图像上:my web page
我正在使用 C# 和 TechTalk.SpecFlow。我正在尝试这样点击它:
Browser.ClickWebElementNew("/html/body/div[1]/div/select", FoundBy.XPath);
这里是 Browser.ClickWebElementNew() 的实现,它来自 selenium chrome 驱动程序:
//
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' 完全正确,我检查了很多次。在此弹出 window 出现之前,我在测试场景中有足够的延迟所以我做错了什么?我必须怎么做才能成功点击此 'select'?
几个建议。我会先尝试建议 1。如果这不起作用,请尝试建议 2:
不要使用精确的 XPaths — 我经常看到这个。使用标签名称、属性和父元素的组合,使您的定位器更加健壮。事实上,<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 与元素交互。这些可能很微妙,但很重要。任何移动或 fade-in 都可能导致与页面交互时出现问题。
如果想法 1 和 2 不起作用,请查看元素是否在框架或 iframe 内。在与其元素交互之前,您需要切换到框架。还要查找与页面同一区域重叠的元素。这也可能导致问题,特别是如果 运行 在无头模式下并且您没有设置 window 大小。
你好,我在 chrome 浏览器中弹出 window 和 'select' 元素,我需要在我的 ui 中单击这个 'select' 元素-测试场景。它在图像上:my web page
我正在使用 C# 和 TechTalk.SpecFlow。我正在尝试这样点击它:
Browser.ClickWebElementNew("/html/body/div[1]/div/select", FoundBy.XPath);
这里是 Browser.ClickWebElementNew() 的实现,它来自 selenium chrome 驱动程序:
//
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' 完全正确,我检查了很多次。在此弹出 window 出现之前,我在测试场景中有足够的延迟所以我做错了什么?我必须怎么做才能成功点击此 'select'?
几个建议。我会先尝试建议 1。如果这不起作用,请尝试建议 2:
不要使用精确的 XPaths — 我经常看到这个。使用标签名称、属性和父元素的组合,使您的定位器更加健壮。事实上,
<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 与元素交互。这些可能很微妙,但很重要。任何移动或 fade-in 都可能导致与页面交互时出现问题。
如果想法 1 和 2 不起作用,请查看元素是否在框架或 iframe 内。在与其元素交互之前,您需要切换到框架。还要查找与页面同一区域重叠的元素。这也可能导致问题,特别是如果 运行 在无头模式下并且您没有设置 window 大小。