如何同步注入脚本
How to inject a script synchronously?
许多人建议我只使用.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
将接受参数。我想知道我是否可以传入webdriver.promise
,并在加载脚本时调用它。。。?我不知道如何兑现承诺。
这里的最佳选择是重新设计/重组代码,以处理Sizzle的异步加载并通过回调函数返回结果。javascript就是这样设计的。它没有同步加载远程资源的"好"方法。
我所知道的同步加载远程资源(如JS文件)的唯一方法是使用阻塞AJAX调用来加载资源(将受到同源限制,因此您必须将其托管在服务器上),然后一旦您将资源加载到内存中,就可以执行它(使其加载)。然后,您可以调用其中定义的函数并返回它们的结果。
这很糟糕的原因是,在加载远程资源时,阻塞ajax调用会将浏览器锁定一段不确定的时间。这种类型的设计不利于用户体验。
我能想到的唯一其他选择是确保在页面加载过程中,已经指定了所有所需的资源,以便在脚本需要它们时已经预加载它们。按需加载远程资源是导致异步问题的原因。
为什么不将sizzle作为页面上的脚本需求。只需粘贴
<script src="sizzle.js"></script>
它会在其他脚本运行之前加载。要动态地执行此操作,只需将脚本附加到头部即可。http://jsfiddle.net/nQePg有一个演示程序,它向您显示在解析和评估注入时脚本执行将停止。
它有点慢,但我想我找到了一个解决方案:
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]");
};
我刚刚下载了这个脚本,我正在内联地注入整个内容。这样我什么都不用等了。
- Safari扩展中的注入脚本;不要在Youtube上开火
- 通过innerHTML注入脚本:函数与全局
- 如何在访问其他url时在nodewebkit中注入脚本
- 按下按钮时动态注入脚本
- 是的.js在已加载的脚本上方注入脚本
- Chrome 扩展程序:在注入脚本之前,将数据从弹出窗口传递到另一个脚本文件
- 注入脚本以播放音频文件,如果 InnerText 与字符串不匹配
- 如何同步注入脚本
- 将值传递到“;注入脚本”;而不是依赖全局
- 正在使用ngBindHtml注入脚本标记
- 获取调用注入脚本的选项卡的url
- 如何在谷歌页面上搜索后注入脚本
- Chrome扩展:错误时发送消息从注入脚本回后台脚本
- 在注入脚本中使用扩展的localStorage包装器函数
- 从注入脚本到带有响应的内容脚本的通信
- 如何在protractor的浏览器实例中手动注入脚本标记
- tabs.executeScript()没有在扩展的内容页中注入脚本
- 错误注入脚本在其他选项卡在我的chrome扩展
- Angular 2 JSONP注入脚本没有调用回调错误
- Chrome扩展在页面加载前注入脚本