遇到javascript错误时,selenium测试失败

188 阅读2分钟

当我们执行selenium测试时,我们想在javascript错误进入我们的staging/production服务器之前就能发现它们。通过这一改变,我们发现了5个javascript的错误。除此之外,在升级任何javascript库时,它也会给我们带来巨大的信心。

在chromedriver中,有一种默认的方法来引发错误。

class DriverJSError < StandardError; end AfterStep do |scenario, step| errors = page.driver.browser.manage.logs.get(:browser) .select {|e| e.level == “SEVERE” } .map(&:message).compact raise DriverJSError, errors if errors.present? end

javascript的错误是作为SEVERE级错误提出的。因此,我们要过滤这些错误,并在出现这些错误时引发异常。最终的结果是在一个javascript错误中。

不幸的是,Firefoxgeckodriver没有这样的方法,因为日志接口还不是w3c规范。而我们使用geckodriver是出于其他各种原因。所以,我们想出了以下的技巧。

Selenium测试会在发现意外的javascript警报时出错。所以,我们可以通过以下方式在出现这种javascript错误时发出警报。

注意: 将代码添加到所有页面中正在加载的javascript文件中。

但这种方法的问题是,它也会在你的演进/生产环境中开始显示这样的警报,而我们不希望这样。为了解决这个问题,我们可以在执行Selenium测试时设置一个全局javascript变量,并在这里访问该变量以检查环境。我们使用Ruby on Rails作为我们的后端框架,我们根据环境在我们的布局文件中设置这个变量。

def selenium_helper_set_environment javascript_tag(%Q[window.seleniumEnvironment = true;].html_safe) if ENV[‘SELENIUM_TESTS’] end

并修改javascript代码以使用这个变量。

**注意:**确保上述代码在调用下面的javascript之前被调用。

var _console_error = console.error; console.error = function(errMessage){ if(!!window.seleniumEnvironment) window.alert(errMessage); _console_error.apply(console, arguments); }; window.onerror = function (msg, url, line) { if(!!window.seleniumEnvironment) window.alert(msg + url + line); }

在javascript出错时的最终结果。


遇到javascript错误时的selenium测试失败原文发表于Nerd For Techon Medium,人们在这里通过强调和回应这个故事来继续对话。