无法通过 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:

  1. 不要使用精确的 XPaths — 我经常看到这个。使用标签名称、属性和父元素的组合,使您的定位器更加健壮。事实上,<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 与元素交互。这些可能很微妙,但很重要。任何移动或 fade-in 都可能导致与页面交互时出现问题。

如果想法 1 和 2 不起作用,请查看元素是否在框架或 iframe 内。在与其元素交互之前,您需要切换到框架。还要查找与页面同一区域重叠的元素。这也可能导致问题,特别是如果 运行 在无头模式下并且您没有设置 window 大小。