Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Executing Javascript on Selenium/PhantomJS

I'm using PhantomJS via Selenium Webdriver in Python and I'm trying to execute a piece of JavaScript on the page in hopes of returning a piece of data:

from selenium import webdriver

driver = webdriver.PhantomJS("phantomjs.cmd") # or add to your PATH
driver.set_window_size(1024, 768) # optional
driver.get('http://google.com') # EXAMPLE, not actual URL

driver.save_screenshot('screen.png') # save a screenshot to disk
jsres = driver.execute('$("#list").DataTable().data()')
print(jsres)

However when run, it reports KeyError. I was unable to find much documentation on the commands available, so I'm a bit stuck here.

like image 851
Ryan Avatar asked May 28 '15 13:05

Ryan


People also ask

Can selenium execute Javascript?

Selenium executes the Javascript commands by taking the help of the execute_script method. The commands to be executed are passed as arguments to the method. Some operations like scrolling down in a page cannot be performed by Selenium methods directly. This is achieved with the help of the Javascript Executor.

Does Selenium support PhantomJS?

PhantomJS And Selenium For Web Automation (Basic) Just like any other browsers with GUI interface (Firefox, IE, Chrome, etc.), for PhantomJS also, Selenium has a standard API to support the automation.

Is PhantomJS faster than selenium?

Being a headless browser, the interactions are much faster than the real browser. So the performance time is smoother in PhantomJS than in Selenium.


1 Answers

The method created for executing javascript is called execute_script(), not execute():

driver.execute_script('return $("#list").DataTable().data();')

FYI, execute() is used internally for sending webdriver commands.

Note that if you want something returned by javascript code, you need to use return.

Also note that this can throw Can't find variable: $ error message. In this case, locate the element with selenium and pass it into the script:

# explicitly wait for the element to become present
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "list")))

# pass the found element into the script
jsres = driver.execute_script('return arguments[0].DataTable().data();', element)
print(jsres)
like image 170
alecxe Avatar answered Sep 29 '22 08:09

alecxe