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

How can we determine when to use JavaScriptExecutor in selenium c#?

TestInChrome1 抛出异常 - "OpenQA.Selenium.ElementNotInteractableException: element not interactable" 但是,当在 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();
    }
    

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

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

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

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

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

如果你看到太多由于元素不可交互导致的问题,只需捕获这个异常,截图供你参考,自己在日志中生成警告,你可以使用 javascript executor in catch 实现直接点击堵塞。 至少通过为自己生成警告,您可以检查您是否没有遗漏实际问题。

希望这对您有所帮助。

所有 HTML 文档都需要 <title> 标签,它定义了文档的标题。元素:

  • 定义浏览器工具栏中的标题。
  • 添加到收藏夹时为页面提供标题。
  • 在 search-engine 结果中显示页面标题。

Note A: You can NOT have more than one element in an HTML document.

Note B: If you omit the <title> tag, the document will not validate as HTML.

如果您观察 HTML DOM of any website e.g. https://ultimateqa.com/,您将观察到 <title> 位于 <head> 中。因此这个标签的信息是 visiblereadable 但不是 interactable.


TestInChrome1()

所以根据上面的讨论,在 TestInChrome1():

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

  • 要提取标题,您可以使用Title property from IWebDriver接口,您可以使用以下解决方案:

      Console.WriteLine(driver.Title);
    

TestInChrome2()

现在你一定知道Selenium beside allowing users to simulate common activities performed by end-users, entering text into fields, selecting drop-down values and checking boxes, and clicking links in documents, it also provides many other controls such as arbitrary JavaScript execution. To extract the <title> you can use the ExecuteScript() method from IJavaScriptExecutor界面如下:

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