【问题标题】:Execute JavaScript code to get the log from console using selenium webdriver or WatiN使用 selenium webdriver 或 WatiN 执行 JavaScript 代码以从控制台获取日志
【发布时间】:2015-03-28 01:02:40
【问题描述】:

(抱歉有点描述性)
我想等待页面完全加载,但在 Google 上搜索后,当我们尝试使用 readyState 或 onLoad 时,浏览器的反应似乎不同。
此外,对于我正在处理的应用程序,加载所需页面时,控制台(chrome 控制台或 IE 开发人员工具控制台)中似乎会出现一条特定的日志消息 ("TNP is ready")。
我的计划是在浏览器上执行一个小的 JavaScript 代码,使用 Selenium WebDriver C# 和 WatiN C# (IE),从控制台日志中获取此消息。

这可以吗?我可以获得由 console.log 生成的 Last Log 吗? 因为当我执行脚本时,可能会发生消息已经消失或尚未出现的情况。我需要反复开火。

有什么建议吗?

【问题讨论】:

    标签: javascript jquery selenium-webdriver watin


    【解决方案1】:

    这个问题虽然与In WatiN how to wait until postback is complete 不完全相同,但可能是由同一件事引起的。

    browser.WaitUntilComplete() 方法将等待页面完成加载,但如果您在页面加载时在后台运行 AJAX,那么WaitUntilComplete 将无法解决问题。

    根据我的研究,除非您包含一些 JavaScript 来镜像控制台并覆盖 window.console 并提供检查控制台消息的机制,否则无法从浏览器控制台获取日志消息。

    (function(win) {
    
    var console = win.console;
    
    if (!console)
        throw new Error("This browser does not support a debug console");
    
    var mirror = {},
        data = {};
    
    var toString = Object.prototype.toString,
        mirrorMethod = function(key) {
            data[key] = [];
    
            return function() {
                data[key].push(arguments);
                console[key].apply(console, arguments);
            };
        };
    
    for (var key in console) {
        if (toString.call(console[key]) == "[object Function]") {
            mirror[key] = mirrorMethod(key);
        }
    }
    
    win.console = mirror;
    
    win.consoleMirror = {
        getData: function(key) {
            return data[key] || [];
        }
    };
    
    }(this));
    

    JSFiddle:http://jsfiddle.net/fyhLw0to/

    并使用:

    console.log("foo");
    alert(consoleMirror.getData("log")[0][0]);
    

    另一种方法是使用 WatiN 获取您需要与之交互的元素,然后调用 WaitUntilExists

    var button = browser.Button("buttonIdThatDoesNotExistYet");
    
    button.WaitUntilExists();
    button.Click();
    

    这样您就不必破解调试控制台,或破解XMLHttpRequest 来推断 AJAX 何时完成。您的测试将尝试等待元素出现在页面上,然后再对它们进行操作。测试失败会慢一些,但你的测试应该更健壮。

    【讨论】:

    • 谢谢格雷格!即使我想添加WaitUntilExists,但问题是我正在开发一个其他人使用的通用框架,因此等待一个特定元素有点困难。我不能要求用户每次都输入WaitUntilExists,它应该是通用的。通常,某些帧/iframe 需要时间来加载。我会尝试 JavaScript 代码并更新。
    • 你能描述更多关于这个框架的信息吗?你是在使用 SpecFlow 还是只是用 C# 手写这些测试?
    • 我没有使用任何单元测试框架。通用框架不过是在 WatiN Core 框架之上的扩展。这些只是不同团队通过包含 DLL 文件使用的功能。我写了SwitchToPopupSwitchToMainWindow等函数。在弹出窗口上做了一些工作后,我提交它并切换回主窗口。现在我想在这个主窗口上等待,然后再做其他工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2017-10-27
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多