0

许多人建议我.onload在脚本准备好后使用并触发回调。这对我不起作用。我正在编写一个函数,它需要一个元素而不是稍后。这是我所拥有的:

webdriver.By.sizzle = function(selector) {
    driver.executeScript("if(typeof Sizzle==='undefined'){var s=document.createElement('script');s.type='text/javascript';s.src='https://raw.github.com/jquery/sizzle/master/src/sizzle.js';document.head.appendChild(s);}");
    return new webdriver.By.js("return Sizzle('"+selector.replace(/"/g,'\\"')+"')[0]");
};

我想注入Sizzle(如果还没有包含),然后返回一个HtmlElement. 如果需要,它可以忙等待,但它必须返回一个 HtmlElement。

这里的所有答案基本上都只是说“不要这样做”,但我想不出另一种方式。

这是用于 JavaScript 的 selenium web 驱动程序的选择器。


driver.executeScript会接受争论。我想知道我是否可以传入 awebdriver.promise并在加载脚本时调用它......?我不知道如何“履行”承诺。

4

3 回答 3

2

这里最好的选择是重新设计/重构您的代码以处理 Sizzle 的异步加载并通过回调函数返回您的结果。这就是javascript的设计方式。它没有同步加载远程资源的“好”方式。

我知道同步加载像 JS 文件这样的远程资源的唯一方法是使用阻塞 AJAX 调用来加载资源(将受到同源限制,因此您必须将其托管在您的服务器上),然后一旦您'已经将资源加载到内存中,您可以执行它(以使其被加载)。然后,您可以调用其中定义的函数并返回它们的结果。

这不好的原因是阻塞的 ajax 调用将在加载远程资源时锁定浏览器一段不确定的时间。这种设计不利于用户体验。


我能想到的唯一其他选择是确保在页面加载期间已经指定了所有必需的资源,以便在脚本需要它们时已经预加载它们。按需加载远程资源是导致异步问题的原因。

于 2013-09-04T22:43:39.433 回答
0

这有点慢,但我想我找到了解决方案:

webdriver.By.sizzle = function(selector) {
    driver.executeScript("return typeof Sizzle==='undefined'").then(function(noSizzle) {
        if(noSizzle) driver.executeScript(fs.readFileSync('sizzle.min.js', {encoding: 'utf8'}));
    });
    return new webdriver.By.js("return Sizzle('"+selector.replace(/"/g,'\\"')+"')[0]");
};

我刚刚下载了脚本,并且正在内联注入整个内容。这样我就不需要等待任何东西了。

于 2013-09-05T00:02:11.150 回答
0

你为什么不把嘶嘶声作为页面脚本要求。只要坚持

<script src="sizzle.js"></script>

在头部的某个地方,它会在你的其他脚本运行之前被加载。要动态地执行此操作,只需将脚本附加到头部。http://jsfiddle.net/nQePg有一个演示器,它向您展示脚本执行在解析和评估注入时暂停。

于 2013-09-04T22:40:17.187 回答