Bug Tracker

Opened 11 years ago

Closed 9 years ago

Last modified 8 years ago

#4552 closed bug (invalid)

jQuery error running selenium with 1.3.2 in IE6

Reported by: jaiew Owned by:
Priority: major Milestone: 1.4
Component: core Version: 1.3.2
Keywords: support.js, bindReady, selenium, IE6 Cc:
Blocked by: Blocking:

Description

When running selenium for IE6 a javscript error is produced when jQuery-1.3.2 is included into the html page.

Details below:

In revision 6081 of support.js

the following code was added:

87      // Figure out if the W3C box model works as expected
88      // document.body must exist before we can do this
89      jQuery(function(){
90              var div = document.createElement("div");
91              div.style.width = "1px";
92              div.style.paddingLeft = "1px";
93
94              document.body.appendChild( div );
95              jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
96              document.body.removeChild( div );
97      });

This causes an error as the bindReady function breaks for IE6 in selenium. When jquery executes the check to see if the document is ready:

// If IE and not an iframe
// continually check to see if the document is ready
if ( document.documentElement.doScroll && window == window.top ) (function(){
	if ( jQuery.isReady ) return;

		try {
			// If IE is used, use the trick by Diego Perini
			// http://javascript.nwbox.com/IEContentLoaded/
			document.documentElement.doScroll("left");
		} catch( error ) {
			setTimeout( arguments.callee, 0 );
			return;
		}

		// and execute any waiting functions
		jQuery.ready();
	})();
}

The call to document.documentElement.doScroll("left") doesn't raise an error. This might have something to do with selenium running the page in an iframe, and because there is no error raised, jQuery.ready() is called.

I added the following code on my local copy to the try statement and it now works.

try {
   document.documentElement.doScroll("left");
   var div = document.createElement("div");
   document.body.appendChild( div );
   document.body.removeChild( div ).style.display = 'none';
}

The selenium version information is: running Selenium RC and Selenium Core 1.0 beta 2, the latest release on the Selenium download page.

However, it also occurred in the latest release before 1.0 which was Selenium RC 0.9.2 and Selenium Core 0.8.3 I believe.

The thing of note is obviously that it's running in Selenium's "single window" mode (the default has changed in the latest version (1.0 beta 2) to be "multi window" mode), where it's injecting the html into the iframe then.

Other possibly secondary things of ntoe:

  • It's using the Java client driver
  • It runs on Selenium Grid (ver 1.0.3)
  • We're using LoggingSelenium which is a wrapper for the actual underlying Selenium libs to log screenshots and stats.

To replicate it was just a simple html page that includes the latest jquery-1.3.2.js and then run selenium in single window mode for IE6 and open the page. The javascript error that pops up pinpoints this line: 3205 document.body.appendChild( div );

and the error says "document.body is null or not an object"

Change History (3)

comment:1 Changed 11 years ago by othree

I have this problem too. Sometings IE will some this error message. It occurs frequently on a never visit site(maybe sistes without local cache). If I use 1.2.6, This error will not show. So I compare the ready function in this two version. I found the following code in 1.3.2 might be the problem source.

3061 ensure firing before onload, 3062 maybe late but safe also for iframes 3063 document.attachEvent("onreadystatechange", function(){ 3064 if ( document.readyState === "complete" ) { 3065 document.detachEvent( "onreadystatechange", arguments.callee ); 3066 jQuery.ready(); 3067 } 3068 });

After I remove these lines of code. And the problem is gone. I think execute this codes after confirm the document is in iframe will solve this problem.

comment:2 Changed 11 years ago by othree

Sorry about the formate. listing the code again.

3061                 // ensure firing before onload,
3062                 // maybe late but safe also for iframes
3063                 //document.attachEvent("onreadystatechange", function(){
3064                         //if ( document.readyState === "complete" ) {
3065                                 //document.detachEvent( "onreadystatechange", arguments.callee );
3066                                 //jQuery.ready();
3067                         //}
3068                 //});

comment:3 Changed 9 years ago by dmethvin

Resolution: invalid
Status: newclosed

I know nothing of Selenium but it appears that people are using it successfully with jQuery:

http://seleniumforum.forumotion.net/selenium-rc-discussion-f4/how-to-use-jquery-in-selenium-t256.htm

Note: See TracTickets for help on using tickets.