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 切换到该框架才能访问其中的元素。
您需要:
- 识别 frmae
- 切换到框架
- 点击按钮
- 切换回页面的“默认内容”(主要位)
关于等待策略——有显式等待和隐式等待。为简单起见,我抛出了一个隐式等待。这只是更简单和更少的代码。 (这上面有很多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();
这对我有用。
有什么问题请告诉我。
我使用 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 切换到该框架才能访问其中的元素。
您需要:
- 识别 frmae
- 切换到框架
- 点击按钮
- 切换回页面的“默认内容”(主要位)
关于等待策略——有显式等待和隐式等待。为简单起见,我抛出了一个隐式等待。这只是更简单和更少的代码。 (这上面有很多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();
这对我有用。 有什么问题请告诉我。