Just wanted to check what types of javascript code won't work when
executed from SafariDriver with the js executor? Relative to other
browser drivers that is.
I've come across issues trying to click the login buttons of
integrated services like Facebook, Picasa, Flickr, etc., particularly
Facebook for the example on hand.
In Selenium RC, our workaround was to manually open the URLs to those
login pages (in a new window) to simulate clicking the login button
and then proceed from there. I would prefer not to have to deal with
URL alternatives in WebDriver.
Taking workaround example for mouseover issue
http://code.google.com/p/selenium/issues/detail?id=2067 (comment #60),
I adapted version for mouse click / onclick event. Example Python
code:
clickScript = "if(document.createEvent){var evObj =
document.createEvent('MouseEvents');evObj.initEvent('click', true,
false); arguments[0].dispatchEvent(evObj);} else
if(document.createEventObject) { arguments[0].fireEvent('onclick');}"
driver.execute_script(clickScript,driver.find_element_by_xpath("//
div[@id='fbLoginContainer']"))
this works as workaround for IE, but fails for Safari. Does nothing,
no errors returned.
Also works for Chrome, assume to work for Firefox (didn't test yet).
Are mouse events from DOM/javascript not supported by SafariDriver
(yet)? Not talking about interactions API, but just mouse manipulation
from direct javascript.
Per the referenced issue above, I didn't verify myself, but my
colleague said the mouseover workaround worked for Safari. Wonder why
mouse click doesn't. In case it helps excerpt of SafariDriver console
logs:
[146.046s] [safaridriver.inject.Tab.TOP] [ujzs3bkb1ljj] Executing
{"id":"rhnodkjop3p6","name":"findElement","parameters":
{"using":"xpath","value":"//div[@id='fbLoginContainer']"}}
safari-extension://org.openqa.selenium-UASV6TAR75/646e2b5b/injected.js:
9283 [146.047s] [safaridriver.inject.Tab.TOP] [ujzs3bkb1ljj] Sending
response
command: {"id":"rhnodkjop3p6","name":"findElement","parameters":
{"using":"xpath","value":"//div[@id='fbLoginContainer']"}}
response: {"status":0,"value":{"ELEMENT":":wdc:1343166330858"}}
safari-extension://org.openqa.selenium-UASV6TAR75/646e2b5b/injected.js:
9283 [146.077s] [safaridriver.inject.Tab.TOP] [ujzs3bkb1ljj] Executing
{"id":"jqhymtzd3vg","name":"executeScript","parameters":{"args":
[{"ELEMENT":":wdc:1343166330858"}],"script":"if(document.createEvent)
{var evObj =
document.createEvent('MouseEvents');evObj.initEvent('click', true,
false); arguments[0].dispatchEvent(evObj);} else
if(document.createEventObject)
{ arguments[0].fireEvent('onclick');}"}}
safari-extension://org.openqa.selenium-UASV6TAR75/646e2b5b/injected.js:
9283 [146.078s] [safaridriver.inject.PageScript] Sending message:
{"origin":1,"type":"command","command":
{"id":"jqhymtzd3vg","name":"executeScript","parameters":{"args":
[{"ENCODED_ELEMENT":"/HTML/BODY/DIV[5]/DIV/DIV/DIV[2]/DIV[2]/SPAN/
DIV"}],"script":"if(document.createEvent){var evObj =
document.createEvent('MouseEvents');evObj.initEvent('click', true,
false); arguments[0].dispatchEvent(evObj);} else
if(document.createEventObject)
{ arguments[0].fireEvent('onclick');}"}}}
all.js:44Received message of type object from
http://www.treat.com,
expected a string
page.js:6009 [ 61.531s] [
safaridriver.inject.page] Sending
executeScript response: {"origin":
2,"type":"response","id":"jqhymtzd3vg","response":{"status":
0,"value":null}}
all.js:44Received message of type object from
http://www.treat.com,
expected a string
safari-extension://org.openqa.selenium-UASV6TAR75/646e2b5b/injected.js:
9283 [146.088s] [safaridriver.inject.Tab.TOP] [ujzs3bkb1ljj] Sending
response
command: {"id":"jqhymtzd3vg","name":"executeScript","parameters":
{"args":[{"ENCODED_ELEMENT":"/HTML/BODY/DIV[5]/DIV/DIV/DIV[2]/DIV[2]/
SPAN/DIV"}],"script":"if(document.createEvent){var evObj =
document.createEvent('MouseEvents');evObj.initEvent('click', true,
false); arguments[0].dispatchEvent(evObj);} else
if(document.createEventObject)
{ arguments[0].fireEvent('onclick');}"}}
response: {"status":0,"value":null}
Easy to reproduce. Go to
www.Treat.com, and attempt to click the
Facebook login button "//div[@id='fbLoginContainer']" using click
method or javascript. For SafariDriver, I was using it with remote web
driver in Python, release 2.24.1.