我们如何确定何时在selenium c#中使用JavaScriptExecutor?

问题描述 投票:0回答:3

TestInChrome1 抛出一个异常 - “OpenQA.Selenium.ElementNotInteractableException:元素不可交互”但是,当在 TestInChrome2 中使用 JavaScriptExecutor 时,它运行良好。

我的问题是:

  1. 为什么 Click() 方法在 TestInChrome1 中不起作用?

  2. 如何在不反复试验的情况下确定 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();
    }
    
javascript c# selenium selenium-webdriver page-title
3个回答
1
投票

所有 HTML 文档都需要

<title>
标签,它定义文档的标题。元素:

  • 在浏览器工具栏中定义标题。
  • 在将页面添加到收藏夹时提供页面标题。
  • 在搜索引擎结果中显示页面的标题。

注意 A:HTML 文档中不能有多个元素。

注释 B:如果省略

<title>
标签,文档将不会验证为 HTML。

如果您观察任何网站的 HTML DOM,例如https://ultimateqa.com/ 您将观察到

<title>
位于
<head>
内。因此,该标签的信息是可见可读,但不是可交互

page_title


TestInChrome1()

因此,根据上面的讨论,在

TestInChrome1()
中:

  • 您将无法在标题标签上调用

    Click()

  • 要提取title,您可以使用IWebDriver接口中的Title属性,并且可以使用以下解决方案:

      Console.WriteLine(driver.Title);
    

TestInChrome2()

现在您必须意识到,Selenium除了允许用户模拟最终用户执行的常见活动、在字段中输入文本、选择下拉值和复选框以及单击文档中的链接之外,它还提供了许多其他控件例如任意 JavaScript 执行。要提取

<title>
,您可以使用 IJavaScriptExecutor
 接口中的 
ExecuteScript() 方法,如下所示:

Console.WriteLine((string)((IJavaScriptExecutor)driver).ExecuteScript("return document.title"));

0
投票

当我们使用 selenium 时,它的方法以尝试模拟用户如何与网页交互的方式编写。

因此,我们假设屏幕上有一个按钮,但它从未显示在屏幕的可见区域上。也许它不可滚动(或者它总是隐藏的)并且永远无法供用户使用。现在这是一个有效的错误。

  • 如果您使用 javascript 执行器,它将点击按钮,您的脚本将无法捕获此问题
  • 如果您使用 selenium 方法进行点击,脚本将失败并给出一些异常

就我而言,我在大多数误报(无效、非错误)场景中遇到了 Element 不可交互异常

  • 如果屏幕上的某些字段之前处于非活动状态,则您执行了某些操作后它就会变为活动状态。但由于执行速度更快,当脚本与它交互时它仍然处于非活动状态
  • 假设屏幕上有下拉菜单,您展开下拉菜单并单击某个字段。现在,当下拉列表关闭时,您单击其他字段。虽然执行下拉列表不会立即关闭,并且您想要访问的下一个元素会被该下拉列表遮挡(可能会发生在弹出窗口或在屏幕、组合框、搜索框上展开的某些元素)

如果您因元素不可交互而遇到太多问题,只需捕获此异常,截图供您参考,在日志中为您自己生成警告,您可以在 catch 块中使用 javascript 执行器实现直接单击。 至少通过为自己生成警告,您可以检查是否错过了实际问题。

希望这有帮助。


0
投票

在我看来,当网站中有一些有关双击、右键单击或其他限制的限制时,我们使用 javascript 执行器类。在这种情况下,我们应该使用 javascript 执行器类。

© www.soinside.com 2019 - 2024. All rights reserved.