gpt4 book ai didi

javascript - 用 selenium 交换 javaScript

转载 作者:行者123 更新时间:2023-11-30 12:08:45 25 4
gpt4 key购买 nike

我正在尝试使用 selenium 交换网页的 javaScript 功能(对于 java 和 firefox geckodriver,如果重要的话)。

考虑以下网页

<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>标记当前时间。所以我正在寻找一些东西来停止 Activity 的 javaScript 线程。或者告诉 selenium 使用更改后的 DOM 树“软”重新加载页面的可能性。

最佳答案

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

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

关于javascript - 用 selenium 交换 javaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54210710/

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