【问题标题】:exchange javaScript with selenium用 selenium 交换 javaScript
【发布时间】: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 删除 &lt;SCRIPT&gt; 部分。

((JavascriptExecutor) driver).executeScript(
    "var r = document.getElementsByTagName('script');" +
    "for(var i = (r.length - 1); i >=0; i--){" +
    "   r[i].parentNode.removeChild(r[i]);" +
    "}");

现在我正在等待 2 秒并添加一个新的 &lt;SCRIPT&gt; 元素。

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);");

它可以正常工作,但旧脚本仍在运行,并使用当前时间更新 &lt;DIV&gt; 标记。所以我正在寻找一些东西来阻止活动的 javaScript 线程。或者告诉 selenium 使用更改的 DOM 树“软”重新加载页面的可能性。

【问题讨论】:

  • 是的,从 DOM 中删除脚本不会清除间隔。如果没有间隔 id,您将无法清除它,但我想您可以尝试猜测它。或者您可以尝试拦截响应并更改它。
  • 我知道如何清除间隔。这只是我想要实现的目标的演示。事实上,我正在寻找一种更通用的方法。在我在这里尝试做的实际用例中,我不知道原始 javascript 在做什么。我只想杀死它的运行时并注入我自己的。
  • 我猜从响应中去除脚本标签是唯一的方法。
  • @pguardiario 感谢您提供非常好的提示。这真是一个好主意,我还没有想到,它完全解决了我的问题。

标签: javascript java selenium


【解决方案1】:

感谢@pguardiario 的提示,如果已经实施了一个完全有效的解决方案。我使用browserMob proxy 来拦截对网页请求的响应。然后删除响应中的所有 &lt;SCRIPT&gt; 标签,并将修改后的 HTML 传递给现在可以注入自己的 JavaScript 的 selenium Web 驱动程序。

String website = "http://SOME_WEB_PAGE.com";

// proxy object
BrowserMobProxy proxy = new BrowserMobProxyServer();

// create an response filter
proxy.addResponseFilter(new ResponseFilter() {
    @Override
    public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) {
        // if this is a response to the webpage request
        if(messageInfo.getUrl().equals(website)){
            // parse result with JSOUP and delete all <SCRIPT> Tags
            Document doc = Jsoup.parse(contents.getTextContents());                     
            for(Element e : doc.select("script")) e.remove();                       
            contents.setTextContents(doc.html());
        }
    }
});

// start the proxy and put in as firefox option
proxy.start(0);
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);            
DesiredCapabilities dc = new DesiredCapabilities();
dc.setCapability(CapabilityType.PROXY, seleniumProxy);
FirefoxOptions op = new FirefoxOptions();
op.merge(dc);

// start the selenium web driver and open webpage that should not have any <SCRIPT> Tags now
WebDriver driver = new FirefoxDriver(op);                       
driver.get(website);            
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

// inject your own javaScript
((JavascriptExecutor) driver).executeScript(
    "var newScript = document.createElement(\"SCRIPT\");" +
    "newScript.innerHTML = \"document.getElementById('time').innerHTML = 'NEW SCRIPT IS RUNNING';\";" +             
    "document.body.appendChild(newScript);");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多