gpt4 book ai didi

javascript - 了解在 Selenium 中执行异步脚本

转载 作者:IT老高 更新时间:2023-10-28 20:32:02 25 4
gpt4 key购买 nike

我一直在使用 selenium(使用 python bindings 和通过 protractor)相当长一段时间,每次我需要执行 javascript 代码时,我都使用了 execute_script() 方法。例如,for scrolling the page ( python ):

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

或者,对于 infinite scrolling inside an another element ( Protractor ):

var div = element(by.css('div.table-scroll'));
var lastRow = element(by.css('table#myid tr:last-of-type'));

browser.executeScript("return arguments[0].offsetTop;", lastRow.getWebElement()).then(function (offset) {
browser.executeScript('arguments[0].scrollTop = arguments[1];', div.getWebElement(), offset).then(function() {
// assertions

});
});

或者,获取 dictionary of all element attributes ( python ):

driver.execute_script('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', element)

但是,WebDriver API 也有 execute_async_script()我没有亲自使用过。

它涵盖哪些用例?我什么时候应该使用 execute_async_script() 而不是常规的 execute_script()

这个问题是特定于 Selenium 的,但与语言无关。

最佳答案

When should I use execute_async_script() instead of the regular execute_script()?

在浏览器端检查条件时,您可以使用 execute_async_script 执行的所有检查都可以使用 execute_script 执行。即使您正在检查的是异步的。我知道,因为曾几何时,如果脚本返回结果太快,execute_async_script 会导致我的测试失败。据我所知,这个错误现在已经消失了,所以我一直在使用 execute_async_script 但是几个月前,我使用 execute_script 来处理 execute_async_script 的任务code> 会更自然。例如,执行需要使用 RequireJS 加载模块来执行检查的检查:

driver.execute_script("""
// Reset in case it's been used already.
window.__selenium_test_check = undefined;
require(["foo"], function (foo) {
window.__selenium_test_check = foo.computeSomething();
});
""")

result = driver.wait(lambda driver:
driver.execute_script("return window.__selenium_test_check;"))

require 调用是异步的。但是,除了将变量泄漏到全局空间之外,问题在于它会增加网络请求。每个 execute_script 调用都是一个网络请求。 wait 方法通过轮询工作:它运行测试直到返回值为真。这意味着每次检查 wait 执行一个网络请求(在上面的代码中)。

当您在本地进行测试时,这没什么大不了的。如果您必须通过网络,因为您拥有由 Sauce Labs 之类的服务提供的浏览器(我使用它,所以我是根据经验说话),每个网络请求都会减慢您的测试套件的速度。 所以使用 execute_async_script 不仅可以编写看起来更自然的测试(调用回调,就像我们通常使用异步代码所做的那样,而不是泄漏到全局空间中),而且还有助于提高性能您的测试。

result = driver.execute_async_script("""
var done = arguments[0];
require(["foo"], function (foo) {
done(foo.computeSomething());
});
""")

我现在的看法是,如果测试要挂接到浏览器端的异步代码中以获得结果,我会使用 execute_async_script。如果它要做一些没有可用异步方法的事情,我使用 execute_script

关于javascript - 了解在 Selenium 中执行异步脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28057338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com