Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

to set MutationObserver, How to inject javascript before page-loading using Selenium

I'm trying to set MutationObserver for observing page mutation while loading.

In order to do that, MutationObserver should be configured before page loading.

With selenium-chromedriver, couldn't find the way to inject JS for such purpose.

I know chrome extension can do that but extensions won't work on headless mode.

That's the problem.

like image 478
nemo Avatar asked Nov 15 '17 01:11

nemo


People also ask

Can Selenium interact with Javascript?

You an use selenium to do automated testing of web apps or websites, or just automate the web browser. It can automate both the desktop browser and the mobile browser. Selenium webdriver can execute Javascript.

How do I make sure my site is loaded in Selenium?

There are three ways to implement Selenium wait for page to load: Using Implicit Wait. Using Explicit Wait. Using Fluent Wait.

How do you press and hold in Selenium?

Click and hold is an action in Selenium in which we do left-click on an element and hold it without releasing the left button of the mouse. To perform this action in Selenium WebDriver, we will use clickAndHold() method of actions class. This method is generally useful in executing drag and drop operations.


1 Answers

It's possible via the DevTool API by calling Page.addScriptToEvaluateOnNewDocument

from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver
import json

def 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 Chrome
driver = webdriver.Chrome()

# add a script which will be executed when the page starts loading
driver.add_script("""
  if (window.self === window.top) { // if main document
    console.log('add script');
  }
  """)

# load a page
driver.get("https://stackoverflow.com/questions")
like image 141
Florent B. Avatar answered Sep 28 '22 10:09

Florent B.