Как выполнить код JavaScript в Python Selenium, а затем перезвонить в моем коде Python? - PullRequest
0 голосов
/ 18 ноября 2018

Здесь у меня есть некоторый код Python, который открывает мой файл JavaScript и запускает его на веб-странице. Я видел сообщения о том, что execute_async_script() позволяет обрабатывать обратные вызовы в JavaScript, но я не совсем понял.

with open("script.js") as f:
    script_source = f.read()

wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "textArea-2Spzkt")))

script_exc = driver.execute_async_script(script_source)
print("test", script_exc)

Вот JavaScript, который внедряет Selenium. Он прослушивает изменения в определенном классе и выводит строку на консоль, когда обнаруживает изменение.

// Select the node that will be observed for mutations
var targetNode = document.getElementsByClassName('messagesWrapper-3lZDfY')[0];

// Options for the observer (which mutations to observe)
var config = { attributes: false, childList: true, subtree: true };

// Callback function to execute when mutations are observed
var callback = function(mutationsList, observer) {
    for(var mutation of mutationsList) {
        if (mutation.type == 'childList') {
            console.log('A child node has been added or removed.');
        }
        else if (mutation.type == 'attributes') {
            console.log('The ' + mutation.attributeName + ' attribute was modified.');
        }
    }
};

// Create an observer instance linked to the callback function
var observer = new MutationObserver(callback);

// Start observing the target node for configured mutations
observer.observe(targetNode, config);

Я хочу, чтобы JavaScript мог возвращать строку в консоли Python, говорящую "node change detected", когда обнаруживается изменение узла. Итак, в моем коде Python, где написано print("test", script_exc), я хочу, чтобы он напечатал test и node change detected. Я довольно новичок в JavaScript в целом и немного новичок в Python тоже. Я видел людей, которые говорили, что нужно использовать arguments[0] с JavaScript, но я не знал, как это отразится в моем коде Python.

1 Ответ

0 голосов
/ 20 ноября 2018

Использование аргументов [0] с JavaScript означает, что обратный вызов выполнен.

script="var a = 1;"
// if return a, use execute_script()
a = driver.execute_script("return a;")
// or use execute_async_script()
async_script="return arguments[0](a)"
a = driver.execute_async_script(async_script)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...