有没有办法在selenium中使用MutationObserver JavaScript API

有没有办法在selenium中使用MutationObserver JavaScript API,javascript,python,python-3.x,selenium,selenium-chromedriver,Javascript,Python,Python 3.x,Selenium,Selenium Chromedriver,我想在selenium上使用MutationObserver来观察元素的变化 但在observe()中发生了以下错误: 我找到了有关错误的信息。 根据上面的stackoverflow页面,调用getElement时发生错误。。。函数,然后再加载dom 所以我尝试了一种方法,就是等到所需的dom可见, 但是错误发生了 我正在使用 蟒蛇3.6.3 硒M3.6 Chrome 64.0.3248.0(官方版本)金丝雀 代码: main.py: from selenium import webdri

我想在selenium上使用MutationObserver来观察元素的变化

但在
observe()
中发生了以下错误:

我找到了有关错误的信息。

根据上面的stackoverflow页面,调用getElement时发生错误。。。函数,然后再加载dom

所以我尝试了一种方法,就是等到所需的dom可见, 但是错误发生了

我正在使用

  • 蟒蛇3.6.3
  • 硒M3.6
  • Chrome 64.0.3248.0(官方版本)金丝雀
代码:

main.py:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'
options.add_experimental_option("detach", True)
#options.add_argument('--headless')
with open("execute_script.js") as f:
    script_source = f.read()

driver = webdriver.Chrome("./chromedriver", chrome_options=options)
driver.get("example.com/index.html")
close_icons = driver.find_elements_by_css_selector("i.CloseIcon")
if len(close_icons) >= 1:
    for v in close_icons:
        if v.is_displayed():
            v.click()
driver.execute_script(script_source)
execute_script.js:此脚本作为执行脚本加载到main.py中

let body = document.getElementsByTagName("body")[0];
let script = document.createElement("script");
script.type = "application/javascript";

let str = `
let dom = document.getElementById('last-last');
function getDesiredDom() {
    dom = document.getElementById("last-last");
    if (!dom) {
        console.log("Desired dom does not exist yet")
        setTimeout(getDesiredDom, 500);
    }

}
getDesiredDom();
let ws = new WebSocket("ws://localhost:6788/");
ws.addEventListener("message", (message) => {
    console.log(message.data);
});
ws.onerror = (error) => console.log(error);

let observer_config = {childList: true, attributes: true, characterData: true};

let observer = new MutationObserver((mutation) => {
    for (v of mutation) {
        if (v.type === "childList") {
            for (x of v.addedNodes) {
                if (x.nodeName === '#text') {
                    console.log(x.nodeValue);
                    ws.send(x.nodeValue);
                }
            }
        }
    }
});
observer.observe(dom, observer_config);
`

script.innerHTML = str;
body.appendChild(script)

Backtick是ES6的一项功能,在浏览器中无法正常工作。不要在java脚本中使用它
let body = document.getElementsByTagName("body")[0];
let script = document.createElement("script");
script.type = "application/javascript";

let str = `
let dom = document.getElementById('last-last');
function getDesiredDom() {
    dom = document.getElementById("last-last");
    if (!dom) {
        console.log("Desired dom does not exist yet")
        setTimeout(getDesiredDom, 500);
    }

}
getDesiredDom();
let ws = new WebSocket("ws://localhost:6788/");
ws.addEventListener("message", (message) => {
    console.log(message.data);
});
ws.onerror = (error) => console.log(error);

let observer_config = {childList: true, attributes: true, characterData: true};

let observer = new MutationObserver((mutation) => {
    for (v of mutation) {
        if (v.type === "childList") {
            for (x of v.addedNodes) {
                if (x.nodeName === '#text') {
                    console.log(x.nodeValue);
                    ws.send(x.nodeValue);
                }
            }
        }
    }
});
observer.observe(dom, observer_config);
`

script.innerHTML = str;
body.appendChild(script)