GVKun编程网logo

设置MutationObserver,如何在使用Selenium页面加载之前注入javascript(selenium 页面加载完成)

23

在这篇文章中,我们将为您详细介绍设置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 页面加载完成)

设置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不会对文本输入字段的更改做出反应

javascript – MutationObserver不会对文本输入字段的更改做出反应

我正在努力使IE专用网站适应其他浏览器.例如,onpropertychange已被广泛使用,我正在使用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适用于其他输入类型,具有隐藏字段值的事件.

这种行为在浏览器中是一致的.

有人知道如何观察文本字段的值变化吗?或者我必须以不同的方式处理这个问题?

解决方法

MutationObserve用于侦听DOM的更改,但是当您输入或删除某些字符时,您将看到属性值尚未更改.像这样:
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?

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元素列入黑名单

javascript – 使用Mutation Observers将DOM元素列入黑名单

我想在Chrome中使用Mutation Observers来监控整个文档中的DOM更改.但是,我想将具有特定ID的特定元素列入黑名单.有没有办法做到这一点?

最佳答案
使用此处找到的mutation-summary库:http://code.google.com/p/mutation-summary/.元素查询总结了与给定选择器字符串匹配的元素的存在和位置的更改.在这里找到:http://code.google.com/p/mutation-summary/wiki/APIReference#The_element_Query

javascript – 使用MutationObserver.observe(document.body,parentNode为null)

javascript – 使用MutationObserver.observe(document.body,parentNode为null)

我想跟踪一些特殊标签作为UI组件,例如< color>,< date>,所以当创建这样的元素并将其插入DOM时,我可以将它转换为真正的功能性html块.

这是代码,在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可以重现这一点,

解决方法

如果添加了一个元素,然后立即(比触发下一个setImmediate的速度快)被移除到MutationObserver的一个监视元素,观察者将注意到并为addednode和removednode添加一个变异 – 但是你已经注意到了引用element将没有父节点.

更新了示例
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页面加载之前注入javascriptselenium 页面加载完成的讲解已经结束,谢谢您的阅读,如果想了解更多关于javascript – MutationObserver不会对文本输入字段的更改做出反应、javascript – 与MutationObserver等效的DOMNodeInserted DOMNodeRemoved?、javascript – 使用Mutation Observers将DOM元素列入黑名单、javascript – 使用MutationObserver.observe(document.body,parentNode为null)的相关知识,请在本站搜索。

本文标签: