TestInChrome1 抛出一个异常 - “OpenQA.Selenium.ElementNotInteractableException:元素不可交互”但是,当在 TestInChrome2 中使用 JavaScriptExecutor 时,它运行良好。
我的问题是:
为什么 Click() 方法在 TestInChrome1 中不起作用?
如何在不反复试验的情况下确定 JavaScriptExecutor 是必需的?
[TestMethod]
public void TestInChrome1()
{
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://ultimateqa.com/");
IWebElement element = driver.FindElement(By.TagName("title"));
element.Click();
driver.Quit();
}
[TestMethod]
public void TestInChrome2()
{
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://ultimateqa.com/");
IWebElement element = driver.FindElement(By.TagName("title"));
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");
driver.Quit();
}
<title>
标签,它定义文档的标题。元素:
注意 A:HTML 文档中不能有多个元素。
注释 B:如果省略
标签,文档将不会验证为 HTML。<title>
如果您观察任何网站的 HTML DOM,例如https://ultimateqa.com/ 您将观察到
<title>
位于 <head>
内。因此,该标签的信息是可见和可读,但不是可交互。
因此,根据上面的讨论,在
TestInChrome1()
中:
您将无法在标题标签上调用
Click()
。
要提取title,您可以使用IWebDriver接口中的Title属性,并且可以使用以下解决方案:
Console.WriteLine(driver.Title);
现在您必须意识到,Selenium除了允许用户模拟最终用户执行的常见活动、在字段中输入文本、选择下拉值和复选框以及单击文档中的链接之外,它还提供了许多其他控件例如任意 JavaScript 执行。要提取
<title>
,您可以使用 IJavaScriptExecutor接口中的
ExecuteScript()
方法,如下所示:
Console.WriteLine((string)((IJavaScriptExecutor)driver).ExecuteScript("return document.title"));
当我们使用 selenium 时,它的方法以尝试模拟用户如何与网页交互的方式编写。
因此,我们假设屏幕上有一个按钮,但它从未显示在屏幕的可见区域上。也许它不可滚动(或者它总是隐藏的)并且永远无法供用户使用。现在这是一个有效的错误。
就我而言,我在大多数误报(无效、非错误)场景中遇到了 Element 不可交互异常
如果您因元素不可交互而遇到太多问题,只需捕获此异常,截图供您参考,在日志中为您自己生成警告,您可以在 catch 块中使用 javascript 执行器实现直接单击。 至少通过为自己生成警告,您可以检查是否错过了实际问题。
希望这有帮助。
在我看来,当网站中有一些有关双击、右键单击或其他限制的限制时,我们使用 javascript 执行器类。在这种情况下,我们应该使用 javascript 执行器类。