我们如何确定何时在硒C#中使用JavaScriptExecutor?

时间:2019-12-11 05:36:57

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

就我而言,在大多数误报(无效,非错误)的情况下,我遇到了元素不可交互的异常

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

如果由于元素不可交互而看到太多问题,只需捕获此异常,请截取屏幕截图以供参考,并在日志中为自己生成警告,然后可以在catch块中使用javascript执行程序来实现直接单击。 通过为自己生成警告,您可以检查自己是否没有错过实际问题。

希望这会有所帮助。

答案 1 :(得分:0)

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

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

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

     

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

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

page_title


TestInChrome1()

因此,根据上面的讨论,在TestInChrome1()中:

  • 您将无法在标题标签上调用Click()
  • 要提取 title ,您可以使用Title界面中的IWebDriver属性,还可以使用以下解决方案:

    Console.WriteLine(driver.Title);
    

TestInChrome2()

现在,您必须知道Selenium除了允许用户模拟最终用户执行的常见活动,在字段中输入文本,选择下拉值和复选框以及单击文档中的链接之外,还需要注意ExecuteScript()提供了许多其他控件,例如任意JavaScript执行。要提取<title>,可以按如下所示从IJavaScriptExecutor界面使用https://aws.amazon.com/blogs/developer/dynamodb-table-cache/方法:

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