在这篇文章中,我们将为您详细介绍设置MutationObserver,如何在使用Selenium页面加载之前注入javascript的内容,并且讨论关于selenium页面加载完成的相关问题。此外,我
在这篇文章中,我们将为您详细介绍设置MutationObserver,如何在使用Selenium页面加载之前注入javascript的内容,并且讨论关于selenium 页面加载完成的相关问题。此外,我们还会涉及一些关于javascript – MutationObserver不会对文本输入字段的更改做出反应、javascript – 与MutationObserver等效的DOMNodeInserted DOMNodeRemoved?、javascript – 使用Mutation Observers将DOM元素列入黑名单、javascript – 使用MutationObserver.observe(document.body,parentNode为null)的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 设置MutationObserver,如何在使用Selenium页面加载之前注入javascript(selenium 页面加载完成)
- javascript – MutationObserver不会对文本输入字段的更改做出反应
- javascript – 与MutationObserver等效的DOMNodeInserted DOMNodeRemoved?
- javascript – 使用Mutation Observers将DOM元素列入黑名单
- javascript – 使用MutationObserver.observe(document.body,parentNode为null)
设置MutationObserver,如何在使用Selenium页面加载之前注入javascript(selenium 页面加载完成)
我正在尝试将MutationObserver设置为在加载时观察页面突变。
为此,应在页面加载之前配置MutationObserver。
使用selenium-chromedriver,找不到为此目的注入JS的方法。
我知道chrome扩展程序可以做到这一点,但扩展程序无法在无头模式下工作。
那就是问题所在。
答案1
小编典典通过调用DevTool API可以实现 Page.addScriptToEvaluateOnNewDocument
from selenium import webdriverfrom selenium.webdriver.remote.webdriver import WebDriverimport jsondef send(driver, cmd, params={}): resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id url = driver.command_executor._url + resource body = json.dumps({''cmd'': cmd, ''params'': params}) response = driver.command_executor._request(''POST'', url, body) if response[''status'']: raise Exception(response.get(''value'')) return response.get(''value'')def add_script(driver, script): send(driver, "Page.addScriptToEvaluateOnNewDocument", {"source": script})WebDriver.add_script = add_script# launch Chromedriver = webdriver.Chrome()# add a script which will be executed when the page starts loadingdriver.add_script(""" if (window.self === window.top) { // if main document console.log(''add script''); } """)# load a pagedriver.get("https://stackoverflow.com/questions")
javascript – MutationObserver不会对文本输入字段的更改做出反应
但是,我不能让MutationObserver对输入=文本字段的值更改做出反应,既不是程序更改也不是用户输入.
考虑:
<input type="text" name="test1" id="test1" />
和
var config = { attributes: true,childList: true,characterData: true,subtree: true }; var observer = new MutationObserver(function() { alert('success'); } ); observer.observe(document.getElementById('test1'),config);
如果我尝试通过document.getElementById(‘test1’).value =’something’或键盘输入来更改值,则不会发生任何事情.
但是,如果我尝试更改有关该元素的其他内容,例如其id或名称(通过JavaScript),则会触发MutationObserver.
值更改和MutationObserver适用于其他输入类型,具有隐藏字段值的事件.
这种行为在浏览器中是一致的.
有人知道如何观察文本字段的值变化吗?或者我必须以不同的方式处理这个问题?
解决方法
name: <input type="text" id="name" value="ZJZHOME">
现在我们删除一些字符,现在值为“ZJZHO”:
var input = document.getElementById('name'); input.getAttributes('value') //alse "ZJZHOME" input.value // Now is "ZJZHO"
您可以看到删除字符时没有更改DOM,因此,我们应该更改DOM …
我想我们可以通过以下方法解决这个问题:
input.oninput = function(e) { this.setAttribute('value',input.value) }
现在,变异观察者可以观察到表格字段状态的变化.
我希望你能理解我所说的…..我的英语很差……….
javascript – 与MutationObserver等效的DOMNodeInserted DOMNodeRemoved?
我目前有代码:
$('.example').bind('DOMNodeInserted DOMNodeRemoved', function(event) {
....
});
哪个工作完美,但效率不高,因此已被弃用.有什么更好的方法呢?
我一直在调查MutationObserver,但这段代码确实有用吗?
它给出错误“mutation.addednodes不是一个函数”我还需要我知道的removednodes.
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
mutation.addednodes.forEach(function(node) {
if (node.className == 'example') {
....
}
});
});
});
observer.observe(document, {
childList: true,
subtree: true,
attributes: false,
characterData: false,
});
解决方法:
.addednodes返回NodeList而不是Array,它没有.forEach()方法.尝试使用Array.prototype.slice()将.addednodes转换为具有方法.forEach()的Array
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var nodes = Array.prototype.slice.call(mutation.addednodes);
nodes.forEach(function(node) {
if (node.parentElement.className == "example") {
alert(node.parentElement.className)
}
});
});
});
observer.observe(document.querySelector(".example"), {
childList: true,
subtree: true,
attributes: false,
characterData: false,
});
var el = document.createElement("div");
el.className = "example-child";
document.querySelector(".example").appendChild(el)
<div></div>
javascript – 使用Mutation Observers将DOM元素列入黑名单
我想在Chrome中使用Mutation Observers来监控整个文档中的DOM更改.但是,我想将具有特定ID的特定元素列入黑名单.有没有办法做到这一点?
javascript – 使用MutationObserver.observe(document.body,parentNode为null)
这是代码,在document.body上观察addednodes.
function handleAddednodes(nodes) { [].forEach.call(nodes,function(node) { if (!node.tagName) return; //how is it possible,node.parentNode is null????? if (!node.parentNode) { return; } }); } var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { handleAddednodes(mutation.addednodes); }); }); observer.observe(document.body,{ childList : true,subtree : true });
它按预期工作正常,但我也发现了一个奇怪的问题:没有parentNode用于某些addednodes(因为“observe(document.body”表示addednodes应该是document.body的后代,对吧?)
整个函数作为大前端项目的插件,我不知道项目如何改变DOM,设置innerHTML或appendChild(这里的代码太多).它也无法调试,因为observe函数是异步的,就像事件一样,没有函数调用堆栈.
所以我只想知道是什么原因造成这种情况,如果能用jsfiddle再现它会更好.
好吧,似乎jsFiddle可以重现这一点,
解决方法
更新了示例
See fiddle
使用来自op的MutationObserver,以下代码将调用handleAddednodes三次,一次用于已删除的元素,一次用于附加到已删除元素的元素.删除的元素将没有父元素,而第二个元素将具有父元素.
var body = document.body; var test = document.createElement("div"); var test2 = document.createElement("span"); body.appendChild(test);//adds childList mutation (addednodes) test.appendChild(test2);//adds subtree mutation (addednodes) body.removeChild(test);//adds mutation (removednodes)
今天关于设置MutationObserver,如何在使用Selenium页面加载之前注入javascript和selenium 页面加载完成的讲解已经结束,谢谢您的阅读,如果想了解更多关于javascript – MutationObserver不会对文本输入字段的更改做出反应、javascript – 与MutationObserver等效的DOMNodeInserted DOMNodeRemoved?、javascript – 使用Mutation Observers将DOM元素列入黑名单、javascript – 使用MutationObserver.observe(document.body,parentNode为null)的相关知识,请在本站搜索。
本文标签: