【问题标题】:How can we determine when to use JavaScriptExecutor in selenium c#?我们如何确定何时在 selenium c# 中使用 JavaScriptExecutor?
【发布时间】:2020-04-04 08:40:33
【问题描述】:

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();
    }
    

【问题讨论】:

  • 你不能点击<title>元素,java脚本只是返回它而不是尝试点击它。
  • 你似乎在测试,在那种情况下你不应该使用 JSExecutor。相反,您应该调整您的测试或修复您的 UI
  • 您可以将 JavascriptExecutor#ExecuteScript 与在被测浏览器的控制台中键入 javascript 进行比较,而不是使用 WebDriver 界面。我不熟悉 C# 绑定,但我敢打赌有类似 driver.Title

标签: javascript c# selenium selenium-webdriver page-title


【解决方案1】:

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

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

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

注意 B:如果您省略 <title> 标记,文档将不会验证为 HTML。

如果您观察到任何网站的HTML DOM,例如https://ultimateqa.com/ 您将观察到<title> 驻留在<head> 内。因此这个标签的信息是visible可读,但不是interactable


TestInChrome1()

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

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

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

      Console.WriteLine(driver.Title);
    

TestInChrome2()

现在您必须知道Selenium 除了允许用户模拟最终用户执行的常见活动、在字段中输入文本、选择下拉值和复选框以及单击文档中的链接之外,它还提供了许多其他控件,例如任意 JavaScript 执行。要提取<title>,可以使用IJavaScriptExecutor接口中的ExecuteScript()方法,如下所示:

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

【讨论】:

【解决方案2】:

当我们使用 selenium 时,它的方法是这样编写的,它试图模拟用户将如何与网页进行交互。

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

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

在我的情况下,我在大多数误报(无效,非错误)场景中遇到了 Element 不可交互异常

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

如果您发现由于元素不可交互导致的问题太多,只需捕获此异常,截屏供您参考,在日志中为您自己生成警告,您可以在 catch 块中使用 javascript 执行器实现直接点击。 至少通过为自己生成警告,您可以检查您是否没有错过实际问题。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2018-07-12
    • 2019-08-03
    • 2017-03-09
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多