无法通过硒铬驱动程序通过xpath单击web元素



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:

  1. 不要使用精确XPath--我经常看到这种情况。使用标记名称、属性和父元素的组合可以使定位器更加健壮。事实上,<select>标记有一个Id。请使用它。Id属性在HTML文档中必须是唯一的(如果不是,那就是应该修复的错误(:

    Browser.ClickWebElementNew("//select[@id = 'state']", FoundBy.XPath);
    

    这有助于在将来对HTML进行微小更改时保持测试通过。

  2. 使用显式等待--您可能也需要它。您需要等待元素可点击。如果使用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内。在与框架的元素交互之前,需要切换到框架。还要查找与页面的同一区域重叠的元素。这也会导致问题,尤其是在无头模式下运行并且没有设置窗口大小的情况下。

相关内容

  • 没有找到相关文章

最新更新