Closed GoogleCodeExporter closed 8 years ago
I used the flash selenium code in a test java program and I noticed that using
the
method flashApp.call() after a small pause(Thread.sleep()), does not generate
any
errors. It executes successfully in Firefox 3.0.13 and below.
browser = new DefaultSelenium("localhost", 4442, "*firefox",URL);
browser.start();
flashApp = new FlashSelenium(browser, ...);
browser.open(URL);
Thread.sleep(1000);
String rslt = flashApp.call(..);
However, for higher versions of Firefox, it generates the following error:
com.thoughtworks.selenium.SeleniumException: ERROR: Threw an exception:
NPMethod
called on non-NPObject wrapped JSObject!
at
com.thoughtworks.selenium.HttpCommandProcessor.throwAssertionFailureExceptionOrE
rror
(Unknown Source)
at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(Unknown Source)
at com.thoughtworks.selenium.HttpCommandProcessor.getString(Unknown Source)
at com.thoughtworks.selenium.DefaultSelenium.getEval(Unknown Source)
Is this a limitation of Flash selenium API? Has this issue been resolved?
Original comment by error.is...@gmail.com
on 15 Sep 2009 at 9:26
I read that the correct way of invoking Firefox 3.5 is using "chrome", instead
of "firefox", so the called should be:
browser = new DefaultSelenium("localhost", 4442, "*chrome",URL);
I hope it helps.
Cheers
Original comment by iagomo...@gmail.com
on 2 Oct 2009 at 3:06
using *chrome itself only....but still does not work
Original comment by ybh...@gmail.com
on 3 Oct 2009 at 8:31
http://stackoverflow.com/questions/1484861/calling-a-flex-as3-callback-from-java
script -
I suppose that it can be a solution. But I can't fully implement it in
SeleniumFlex.
Original comment by Khro...@gmail.com
on 22 Oct 2009 at 9:14
Any workaround for this very much appreciated.
This is definitely a security issue.
Original comment by murali.o...@gmail.com
on 13 Nov 2009 at 6:55
I've added possible workaround here:
http://code.google.com/p/sfapi/issues/detail?id=1 It is not always stable but
works.
Original comment by Khro...@gmail.com
on 13 Nov 2009 at 7:06
Thanks a ton. Dumb question. Hope user-extensions_modified.js must be moved
under
selenium-server.jar?
Thanks,
Murali
Original comment by murali.o...@gmail.com
on 13 Nov 2009 at 7:59
Yes. Something like this "java -jar selenium-server.jar -userExtensions
user-extensions.js"
Original comment by Khro...@gmail.com
on 13 Nov 2009 at 8:05
we start selenium server programatically.
I tried setting the rcConfiguration as follows and it didn't work :(
File userExtension = new File("C:\\selenium\\user-extensions.js");
rcConfig = new RemoteControlConfiguration();
rcConfig.setUserExtensions(userExtension);
SetupSelenium.seleniumServer = new SeleniumServer(slowResources, rcConfig);
SetupSelenium.seleniumServer.start();
Am I missing something? Let me try starting the rc from cmd prompt and check if
it
works. Your help is greatly appreciated.
Original comment by murali.o...@gmail.com
on 13 Nov 2009 at 8:25
Tried using cmd prompt as well. Didn't work. Same "Threw an exception: NPMethod
called on non-NPObject wrapped JSObject!"
C:\selenium> java -jar selenium-server.jar -userExtensions user-extensions.js
00:30:37.911 INFO - Java: Sun Microsystems Inc. 1.5.0_17-b04
00:30:37.911 INFO - OS: Windows XP 5.1 x86
00:30:37.911 INFO - v1.0.1 [2696], with Core v@VERSION@ [@REVISION@]
00:30:37.990 INFO - Version Jetty/5.1.x
00:30:37.990 INFO - Started HttpContext[/,/]
00:30:37.990 INFO - Started HttpContext[/selenium-server,/selenium-server]
00:30:37.990 INFO - Started
HttpContext[/selenium-server/driver,/selenium-server/driver]
00:30:38.021 INFO - Started SocketListener on 0.0.0.0:4444
00:30:38.021 INFO - Started org.mortbay.jetty.Server@b1c260
00:30:51.740 INFO - Checking Resource aliases
00:30:51.740 INFO - Checking Resource aliases
00:30:51.755 INFO - Command request: getNewBrowserSession[*firefox,
https://10.00.00.00:8443/my-app/, ] on session null
00:30:51.755 INFO - creating new remote session
00:30:51.974 INFO - Allocated session 82c7e13830a842978a7cd3c4906d2348 for
https://10.00.00.00:8443/my-app/, launching...
00:30:52.083 INFO - Preparing Firefox profile...
00:30:54.443 INFO - Launching Firefox...
00:30:57.411 INFO - Got result: OK,82c7e13830a842978a7cd3c4906d2348 on session
82c7e13830a842978a7cd3c4906d2348
00:30:57.427 INFO - Command request:
getEval[navigator.appName.indexOf('Microsoft'),
] on session 82c7e13830a842978a7cd3c4906d2348
00:30:57.443 INFO - Got result: OK,-1 on session
82c7e13830a842978a7cd3c4906d2348
00:30:57.443 INFO - Command request:
open[https://10.00.00.00:8443/my-app/login.html,
] on session 82c7e13830a842978a7cd3c4906d23
00:31:11.974 INFO - Got result: OK on session 82c7e13830a842978a7cd3c4906d2348
00:31:11.990 INFO - Command request:
getEval[window.document['login'].PercentLoaded();, ] on session
82c7e13830a842978a7cd3c4906d2348
00:31:12.005 INFO - Got result: ERROR: Threw an exception: NPMethod called on
non-NPObject wrapped JSObject! on session 82c7e13830a84297
48
00:31:12.005 INFO - Command request: close[, ] on session
82c7e13830a842978a7cd3c4906d2348
00:31:12.036 INFO - Got result: OK on session 82c7e13830a842978a7cd3c4906d2348
00:31:12.052 INFO - Command request: testComplete[, ] on session
82c7e13830a842978a7cd3c4906d2348
00:31:12.052 INFO - Killing Firefox...
00:31:12.271 INFO - Got result: OK on session 82c7e13830a842978a7cd3c4906d2348
Original comment by murali.o...@gmail.com
on 13 Nov 2009 at 8:35
I assume that this workaround is tuned for my project.
The main idea is not to call flex external interface from selenium javascript
but:
1. Create control that contains calling of flex method.
2. Fire event of the control to call the method.
Original comment by Khro...@gmail.com
on 13 Nov 2009 at 8:36
Try this one. It should work for PercentLoaded() method too.
Original comment by Khro...@gmail.com
on 13 Nov 2009 at 8:41
Attachments:
This seems like little time taking. Will try it out in the morning..Thanks
Original comment by murali.o...@gmail.com
on 13 Nov 2009 at 8:50
Hi,
I think am missing the part to call doFlexSetFlexObjID from my project to set
the
flashobj id. Could you pls let me know how to call the js function from java
code to
set the application id (under test).
What we do is this:
1) start selenium with rc config
2) open browser -> pass the App URL
3) instantiate flashSelenium object using application id (eg: flashSelenium =
new
FlashSelenium(selenium, loginAppId);
4) flashSelenium.call("doFlexClick", "id")
Wondering if I need to pass the app id to this user extension.js to reach the
app
under test and then call the selenium flex api methods (ExternalInterface ->
doFlexClick etc)
Original comment by murali.o...@gmail.com
on 14 Nov 2009 at 1:07
Hi,
I'm debugging user-extensions.js via selenium.getEval("") command. I'm using
http://code.google.com/p/sfapi/ but common logic should be the same.
1. To set id:
selenium.getEval("selenium.doFlexSetFlexObjID('my_super_id')")
2. To call command:
selenium.getEval("selenium.callFlexMethod('doFlexClick', 'myButton', '')") or
selenium.getEval("selenium.doFlexClick('myButton', '')")
3. To validate if 'selenium_bridge' button is ok:
selenium.getEval("selenium.browserbot.getCurrentWindow().document.getElementById
('selenium_bridge')")
//shouldn't be null
or
selenium.getEval("selenium.browserbot.getCurrentWindow().document.getElementById
('selenium_bridge').getAttribute('onClick')")
// should be a command to call from your flash object with correct id
4. See if flash object has external interface:
selenium.getEval("selenium.browserbot.findElement(this.flashObjectLocator)['doFl
exClick']")
//shouldn't be null
Original comment by Khro...@gmail.com
on 14 Nov 2009 at 6:43
The NPObject crap is killin me! I'll
keep this space updated while I try and fix the NPObject issue. Any help is
welcome.
Lotts ppl seem to be facing it. Sorry dudes!
Original comment by sachin.s...@gmail.com
on 14 Nov 2009 at 10:32
I stumbled across a workaround using *firefoxproxy. I have posted a blog about
this
here:
http://samadesoga.blogspot.com/2009/11/workaround-flash-selenium-test-would.html
Original comment by samuelad...@gmail.com
on 23 Nov 2009 at 12:22
A workaround has been posted by samueladesoga. Thanks dude!
Original comment by sachin.s...@gmail.com
on 23 Nov 2009 at 2:27
Seems that this workaround is not always working ... :(
I started playing with selenium yesterday and immediately bumped into the
following
issue:
http://jira.openqa.org/browse/SRC-743
So I started using RC2.0a1 which solved this.
But then I got this NPObject problem, so I tried using *firefoxproxy.
This caused the SQLite problem again!
Any suggestion?
Original comment by christia...@gmail.com
on 17 Dec 2009 at 10:47
Just to add to the confusion:
I'm using Windows XP SP3, FF 3.5.5. Comment 15 by Khroliz helped me debug
somewhat
however I could only use "array" syntax to navigate the DOM e.g.
selenium.getEval("this.browserbot.getCurrentWindow()['document']['my_flash_objec
t_id']");
*firefoxproxy doesn't work for me either - just launches an empty browser
window and
hangs.
Misery...
Original comment by niceman...@gmail.com
on 8 Jan 2010 at 10:49
nicemandan, can you try user-extensions file attached? It works for me with
*chrome
option.
Original comment by Khro...@gmail.com
on 13 Jan 2010 at 8:12
Attachments:
I too have failed to get flex-ui testing working. I can get compiled flash apps
to
work (testing percentloaded/zoom), but my problem lies with flex-ui throwing the
NPMethod error or the this.browserbot.findelement .doFlexType/.doFlexClick is
not a
function error (depending on my setup).
I've searched endlessly for a solution to this problem with no success, so
rather
than attempting to try different browser versions and operating systems - could
somebody who has got flex-ui-selenium WORKING please post their specifications
(OS/browser version, etc) and I'll attempt to recreate that environment.
Regards in advance. :-)
Original comment by phillip...@gmail.com
on 19 Jan 2010 at 12:24
@philliphix
Is the swc included when you compile your flash application? From what I see,
doFlexType/doFlexClick are the swc's (selenium-flex-api) methods and
PercentLoaded/Zoom are standard flash methods. The standard flash methods work
irrespective of what flash application is loaded. But for doFlexType() to work,
you
need to compile your swf with the swc which has definitions for doFlexType().
Even we have faced problems getting the swc to be included during compilation
when
we were spiking it out. Worst case, provide the absolute path of the swc as the
argument when you compile.
Original comment by sachin.s...@gmail.com
on 19 Jan 2010 at 5:26
Thanks for your speedy reply suchin.
I have just this second got it working!!! :-) I think the cause may have been
because
I was testing on a local environment. A bit of fiddling (uploading files,
*firefoxproxy which was hanging yesterday, but for some lucky reason it's not
today!
and thread.sleep) and it's working.
Current Firefox version: 3.0.17
OS: MS XP (SP 3)
API: user-extensions_20100113.js
Script key elements: firefoxproxy, thread.sleep, http testing.
Kind regards. :-)
Original comment by phillip...@gmail.com
on 19 Jan 2010 at 9:26
Philliphix, could you try *chrome/*firefox mode with
user-extensions_20100113.js +
FF3.5?
It works on my environment but I want to be sure that it is expandable to other
cases.
Thanks.
Original comment by Khro...@gmail.com
on 19 Jan 2010 at 9:52
I'm having the same NPMethod issue with PercentLoaded(). The Java code I'm
working
with starts the selenium server and client on a test head
(RemoteControlConfiguration
class); the target machine is remote, possibly on a different network and/or
domain.
I'm tinkering with remoteControlConfiguration.setuserExtensions() as well as
selenium.setExtensionJs(). Not sure if I'm using them correctly, but they're
not
complaining. I'd appreciate hints on proper use; the API documentation I have
isn't
all that helpful.
I can't get https GUI authorizations to work with *firefoxproxy. The code's
certificate importing seems to work, but ... doesn't. *chrome is OK in this
regard.
What I'm gathering from this thread is that FF3.0.12 and beyond are "more
secure" and
resistant to what might be considered flash-selenium attempts to hack the
browser.
Comment 11 seems particularly relevant.
There's quite a bit of information on
http://www.mozilla.com/en-US/firefox/releases/
around FF 3.0.10/11/12. I haven't figured out which security statement might
relate
to this NPMethod problem, or if knowing would be helpful.
sachin.sudheendra, any recent feedback on user-extensions_20100113.js?
Cheers.
Original comment by stevecbo...@gmail.com
on 26 Jan 2010 at 1:06
Hi Sachin,
I have tried using *chrome, *firefoxproxy and *firefox with no success. But
everythng works fine whenI use *iexplore.
When I use *firefoxproxy, just opens and empty window and hangs there. Please
help!
OS: MS XP
Firefox version: 3.0.13/3.0.17/3.5
Original comment by gowri.ku...@gmail.com
on 27 Jan 2010 at 2:44
Even I'm seeing this issue , any concrete solution for this?
Thanks,
Vikram
Original comment by vikram.s...@gmail.com
on 27 Jan 2010 at 11:24
Hi Sachin,
I'm still able to reproduce this issue.
In my case swf file is embedded within iframews ,is this could be the reason?
Thanks,
Vikram
Original comment by vikram.s...@gmail.com
on 28 Jan 2010 at 10:03
Anyone found solution for this issue ? please share.
Original comment by vikram.s...@gmail.com
on 8 Feb 2010 at 12:18
Please see Comment 21 by Khroliz, Jan 13, 2010
It works fine for me.
Original comment by Khro...@gmail.com
on 9 Feb 2010 at 8:09
Khroliz is correct that his posting contains the key to the solution. However,
using
the steps s/he outlined, I was not able to get it to work.
Here is what I did to get it to work for my case:
The problem seems to be (I have not verified this by looking at the Firefox
source
code) that FF does not like JavaScript calling Flash when the JavaScript comes
from
another Window.
What FlashSelenium is doing in the background is simply a getEval with some
JavaScript to use the ActionScript-JavaScript bridge to access the Flash object.
FF barfs with a security exception.
In my case, I simply want to call a function inside the Flash that returns a
string.
I am passing no parameters in...so its a pretty simple case but the solution
here
should work for more complicated cases too.
A test page with the Flash object on it can be found here:
http://files.deque.com/mars/flash/testdisplayAS3-acnojs.html
The function I am calling is called "callASElements" and it returns the results
of
validating that all of the UI elements in the Flash object conform to
Accessibility
standards.
The JavaScript to call that function when executed from within the same Window
context is:
window.document.dqMovieId.callASElements();
You can verify this, by going to that address and typing
javascript:window.document.dqMovieId.callASElements();
in the FF address bar and you will see the output of the function displayed in
the
browser.
So the trick is to make FF think that the bot browser is actually executing the
JavaScript. The problem is that the solution to this seems to be different on
different platforms. On Mac, you simply have to insert some JavaScript into the
document eg:
<script>
function callFlash( id, func) {
return window.document[id][func]() ;
}
</script>
and then call
//groovy
selenium.getEval( "window.callFlash( 'dqMovieId', 'callASElements');")
Voila, it works...
On Windows, you will be unhappy with this solution. The robust solution which I
cribbed from Khroliz is to create a form in the document and send a mouse click
event
to the form's submit button which then executes the JavaScript.
The new JavaScript function is:
<script>
function callFlash( id, func) {
if ( typeof( window.document[id][func]) != 'undefined') {
return window.document[id][func]() ;
}
var bridge = selenium.browserbot.getCurrentWindow().document.createElement( 'input');
bridge.setAttribute( 'id', 'ws-sel-bridge') ;
bridge.setAttribute( 'value', 'test') ;
selenium.browserbot.getCurrentWindow().document.body.appendChild( bridge) ;
bridge.setAttribute( 'onClick',
'window.document.getElementById("ws-sel-bridge").value =
window.document.getElementsByName( "' + id + '")[0]["' + func + '"]();') ;
var e = selenium.browserbot.getCurrentWindow().document.createEvent( 'HTMLEvents') ;
e.initEvent( 'click', false, false) ;
bridge.dispatchEvent( e) ;
return bridge.value ;
}
</script>
Now, when you do the same call
//groovy
selenium.getEval( "window.callFlash( 'dqMovieId', 'callASElements');")
It works no matter what...well, one caveat...you need to make sure that you
wait for
the page to load and you might need to catch an exception and retry...here is
some
Groovy code for doing it assuming Selenium is running on localhost:4442
import com.thoughtworks.selenium.DefaultSelenium
def selenium, ourUrl ,ourDomain
ourDomain = "http://files.deque.com"
selenium = new DefaultSelenium( "localhost", 4442, "*firefox", ourDomain)
selenium.start()
ourUrl = "http://files.deque.com/mars/flash/testdisplayAS2-acnojs.html"
selenium.open( ourUrl)
selenium.waitForPageToLoad( "60000")
retry = true
maxRetries = 10
def retVal
while( retry) {
try {
retVal = selenium.getEval( "window.callFlash('dqMovieId', 'callASElements');")
retry = false
} catch( e) {
println "got exception, trying again"
Thread.sleep( 1000)
if ( maxRetries-- <= 0) retry = false ;
}
}
println retVal
println "MaxRetries $maxRetries"
selenium.stop()
Now this solution might not be acceptable to you because it creates a form in
the
document. You could of course modify the function to remove the form after it
has
been called.
If you have full ocntrol over the pages you are testing and can insert this
JavaScript then you are ok. If, like us, you have to test pages without being
able to
change their code (our product does Accessibility testing for WCAG 2 and
Section 508
compliance on production systems as well as development systems), then you
still need
to be able to get the JavaScript into the document.
selenium.getEval will not help with this problem. What we did is to create a
Firefox
plugin that gets loaded as part of the selenium profile using the
-firefoxProfileTemplate command line option. This listens to the HTTP events in
the
browser and at the appropriate time, inserts the function into every document
so that
it is there for getEval to call. This is a trick that we use for other purposes
too,
so the code is too big to post as a solution to this problem.
But most of you will be able to modify or inject JavaScript in your test
environments
so this should not be a big issue for you.
Original comment by barrelld...@gmail.com
on 10 Feb 2010 at 3:42
Issue 38 was added because issues 27, 31 were closed. Please use issue 38 for
further discussion.
Original comment by stevecbo...@gmail.com
on 10 Feb 2010 at 4:30
Hi All,
Where do i place the user extension.js? i placed the js file in the same folder
where selenium-server.jar resides and then i tried this command
java -jar selenium-server.jar -userExtensions user-extensions_20100113.js
i got the error message as follows
User extensions file MUST be called "user-extensions.js":
/users/ansar/Downloads/selenium-remote-control-1.0.3/selenium-server-1.0.3/user-
extensions_20100113.js
i have no idea how to proceed.
Please help me .
Original comment by websh...@gmail.com
on 21 Mar 2011 at 12:23
Hi Websh,
Simply rename the file user-extensions_20100113.js to user-extensions.js and
then try to run the server, it should work.
Thanks,
Saurabh
Original comment by jainsaur...@gmail.com
on 29 Dec 2011 at 6:36
Hi dylan.ba...@gtempaccount.com
http://files.deque.com/mars/flash/testdisplayAS3-acnojs.html
Not Found
The requested URL /mars/flash/testdisplayAS3-acnojs.html was not found on this
server.
Original comment by esob.321...@gmail.com
on 4 Jun 2012 at 7:43
Original issue reported on code.google.com by
ybh...@gmail.com
on 11 Sep 2009 at 10:28