C# 中的 Selenium 脚本找不到元素

Selenium script in C# does not find element

我使用 Selenium Chrome IDE 录制了一个脚本,并将其导出为 C#、NUnit class。当我运行 Visual Studio 中的测试时,它找不到元素。它清楚地显示在屏幕上,如果我 运行 使用 Selenium IDE 它会完美运行。这是我的测试;

[Test]
Public void login()
{
    driver.Navigate().GoToUrl("https://www.oracle.com/uk/cloud/sign-in.html");
    driver.Manage().Window.Maximize();
    driver.FindElement(By.LinkText("I accept all cookies"), 5).Click();
    }
}

我已经复制了一个扩展,让我更容易等待元素出现;

public static class WebDriverExtensions
{
    public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
    {
        if (timeoutInSeconds > 0)
        {
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => drv.FindElement(by));
        }
        return driver.FindElement(by);
    }
}

我也试过了;

driver.FindElement(By.ClassName("call"), 5).Click();

我做错了什么?

编辑 *** 异常消息;

OpenQA.Selenium.WebDriverTimeoutException : Timed out after 5 seconds
  ----> OpenQA.Selenium.NoSuchElementException : no such element: Unable to 
locate element: {"method":"css selector","selector":".call"}
  (Session info: chrome=85.0.4183.83)

堆栈跟踪;

DefaultWait`1.ThrowTimeoutException(String exceptionMessage, Exception lastException)
DefaultWait`1.Until[TResult](Func`2 condition)
WebDriverExtensions.FindElement(IWebDriver driver, By by, Int32 timeoutInSeconds) line 16
LoginTest.login() line 54
--NoSuchElementException
RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
RemoteWebDriver.FindElement(String mechanism, String value)
RemoteWebDriver.FindElementByClassName(String className)
<>c__DisplayClass20_0.<ClassName>b__0(ISearchContext context)
By.FindElement(ISearchContext context)
RemoteWebDriver.FindElement(By by)
<>c__DisplayClass0_0.<FindElement>b__0(IWebDriver drv) line 16
DefaultWait`1.Until[TResult](Func`2 condition)

您的 cookie 接受按钮位于 iframe

使用 webdriver 您需要将 driver 切换到该框架才能访问其中的元素。

您需要:

  1. 识别 frmae
  2. 切换到框架
  3. 点击按钮
  4. 切换回页面的“默认内容”(主要位)

关于等待策略——有显式等待和隐式等待。为简单起见,我抛出了一个隐式等待。这只是更简单和更少的代码。 (这上面有很多tutorials

我查看了您的网站,看起来那个框架的标题不错。

这个 xpath 看起来很适合获取框架:

//iframe[@title='TrustArc Cookie Consent Manager']

为您整理:

            var driver = new ChromeDriver();
            driver.Url = "https://www.oracle.com/uk/cloud/sign-in.html";
            
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);

            var iframe = driver.FindElement(By.XPath("//iframe[@title='TrustArc Cookie Consent Manager']"));
            driver.SwitchTo().Frame(iframe);
            driver.FindElement(By.LinkText("I accept all cookies")).Click();
            driver.SwitchTo().DefaultContent();
            

这对我有用。 有什么问题请告诉我。