【发布时间】:2019-06-10 03:57:09
【问题描述】:
我正在尝试使用 selenium 交换网页的 javaScript 功能(如果重要的话,对于带有 firefox geckodriver 的 java)。
考虑以下网页
<HTML><HEAD></HEAD>
<BODY>
<DIV id="time">Time</DIV>
</BODY>
<SCRIPT>
!function(){
setInterval(function(){
document.getElementById('time').innerHTML = new Date();
}, 500);
}();
</SCRIPT>
</HTML>
现在用 selenium 打开它后,我正在使用 JavascriptExecutor 删除 <SCRIPT> 部分。
((JavascriptExecutor) driver).executeScript(
"var r = document.getElementsByTagName('script');" +
"for(var i = (r.length - 1); i >=0; i--){" +
" r[i].parentNode.removeChild(r[i]);" +
"}");
现在我正在等待 2 秒并添加一个新的 <SCRIPT> 元素。
Thread.sleep(2000);
((JavascriptExecutor) driver).executeScript(
"var newScript = document.createElement(\"SCRIPT\");" +
"newScript.innerHTML = \"document.getElementById('time').innerHTML = 'NEW SCRIPT IS RUNNING';\";" +
"document.body.appendChild(newScript);");
它可以正常工作,但旧脚本仍在运行,并使用当前时间更新 <DIV> 标记。所以我正在寻找一些东西来阻止活动的 javaScript 线程。或者告诉 selenium 使用更改的 DOM 树“软”重新加载页面的可能性。
【问题讨论】:
-
是的,从 DOM 中删除脚本不会清除间隔。如果没有间隔 id,您将无法清除它,但我想您可以尝试猜测它。或者您可以尝试拦截响应并更改它。
-
我知道如何清除间隔。这只是我想要实现的目标的演示。事实上,我正在寻找一种更通用的方法。在我在这里尝试做的实际用例中,我不知道原始 javascript 在做什么。我只想杀死它的运行时并注入我自己的。
-
我猜从响应中去除脚本标签是唯一的方法。
-
@pguardiario 感谢您提供非常好的提示。这真是一个好主意,我还没有想到,它完全解决了我的问题。
标签: javascript java selenium