Hi Dominic,

I changed the isElementPresent() call in Tellurium new API to search only
inside the UI module. It seems work although not fully tested. Please use
the following new artifacts.

http://maven.kungfuters.org/content/repositories/snapshots/org/telluriumsource/tellurium-core/0.7.0-SNAPSHOT/tellurium-core-0.7.0-20100324.163736-111.jar

http://maven.kungfuters.org/content/repositories/snapshots/org/seleniumhq/selenium/server/selenium-server/1.0.3-te2-SNAPSHOT/selenium-server-1.0.3-te2-20100324.163303-4.jar

To use the Tellurium new API, please call

useTelluriumEngine(true);

before you call the isElementPresent() method.

Please let us know if this solves the IE problem or not.

Thanks,

Jian


On Wed, Mar 24, 2010 at 10:47 AM, Jian Fang <[email protected]>wrote:

> This parameter may only affect actions like waitFor* similar to the
> setTimeout() call in Selenium.
>
> I will look at the Engine implementation for isElementPresented() so that
> it will locate the element
> inside a UI module and will not search blindly over all frames like
> Selenium does. Will let you know
> soon.
>
> Thanks,
>
> Jian
>
>
> On Wed, Mar 24, 2010 at 10:30 AM, dominicm <[email protected]>wrote:
>
>> I've had timeoutInSeconds = 60 for some time now. This param doesn't
>> appear to have any effect in this instance
>>
>> On Mar 23, 2:09 pm, Jian Fang <[email protected]> wrote:
>> > Could you change the following timeout value to a larger one in
>> > TelluriumConfig.groovy?
>> >
>> >         timeoutInSeconds = 30
>> >
>> > Let us know if this works for you.
>> >
>> > Thanks,
>> >
>> > Jian
>> >
>> > On Tue, Mar 23, 2010 at 8:03 AM, dominicm <[email protected]
>> >wrote:
>> >
>> >
>> >
>> > > Hi Jian,
>> >
>> > > Thanks for taking a look. Do you know how I could increase the timeout
>> > > of the isElementPresented call?
>> >
>> > > On the page under test there are some frames, but when I run
>> > > "findElementOrNull" from FBLite it returns within a couple of seconds.
>> > > Is there a possibility that the bundle processor is timing out here?
>> > > If so is it possible to increase this on a case basis?
>> >
>> > > Thanks
>> >
>> > > On Mar 22, 6:31 pm, Jian Fang <[email protected]> wrote:
>> > > > But, if we trace the execution flow of Selenium isElementPresent()
>> api as
>> > > > follows,
>> >
>> > > > Selenium.prototype.isElementPresent = function(locator) {
>> > > >     /**
>> > > >     * Verifies that the specified element is somewhere on the page.
>> > > >     * @param locator an <a href="#locators">element locator</a>
>> > > >     * @return boolean true if the element is present, false
>> otherwise
>> > > >     */
>> > > >     var element = this.browserbot.findElementOrNull(locator);
>> > > >     if (element == null) {
>> > > >         return false;
>> > > >     }
>> > > >     return true;
>> >
>> > > > };
>> >
>> > > > * Finds an element on the current page, using various lookup
>> protocols
>> > > > */
>> > > > BrowserBot.prototype.findElementOrNull = function(locator, win) {
>> > > >     locator = parse_locator(locator);
>> >
>> > > >     if (win == null) {
>> > > >         win = this.getCurrentWindow();
>> > > >     }
>> > > >     var element = this.findElementRecursive(locator.type,
>> locator.string,
>> > > > win.document, win);
>> >
>> > > >     if (element != null) {
>> > > >         return this.browserbot.highlight(element);
>> > > >     }
>> >
>> > > >     // Element was not found by any locator function.
>> > > >     return null;
>> >
>> > > > };
>> >
>> > > > BrowserBot.prototype.findElementRecursive = function(locatorType,
>> > > > locatorString, inDocument, inWindow) {
>> >
>> > > >     var element = this.findElementBy(locatorType, locatorString,
>> > > inDocument,
>> > > > inWindow);
>> > > >     if (element != null) {
>> > > >         return element;
>> > > >     }
>> >
>> > > >     for (var i = 0; i < inWindow.frames.length; i++) {
>> > > >         // On some browsers, the document object is undefined for
>> > > > third-party
>> > > >         // frames.  Make sure the document is valid before
>> continuing.
>> > > >         if (inWindow.frames[i].document) {
>> > > >             element = this.findElementRecursive(locatorType,
>> > > locatorString,
>> > > > inWindow.frames[i].document, inWindow.frames[i]);
>> >
>> > > >             if (element != null) {
>> > > >                 return element;
>> > > >             }
>> > > >         }
>> > > >     }
>> >
>> > > > };
>> >
>> > > > Seems your observation of infinite loop is actually a normal
>> behavior for
>> > > > Selenium to repeatedly locate the element from different frames
>> > > > as shown in the findElementRecursive() function and it should return
>> null
>> > > > eventually. Your root cause seems to be caused by
>> > > > timeout as shown in the log,
>> >
>> > > > "com.thoughtworks.selenium.
>> > > > HttpCommandProcessor.throwAssertionFailureExceptionOrError:
>> > > > com.thoughtworks.selenium.SeleniumException: ERROR: Command timed
>> out:
>> > > > ERROR: Command timed out * Mon Mar 22 17:20:49 GMT 2010"
>> >
>> > > > Perhaps you have many frames in your web page and IE8 is slow to
>> search
>> > > them
>> > > > one by one? How about to increase the timeout threshold
>> > > > for the isElementPresented() call?
>> >
>> > > > Thanks,
>> >
>> > > > Jian
>> >
>> > > > On Mon, Mar 22, 2010 at 2:22 PM, Jian Fang <
>> [email protected]>
>> > > wrote:
>> > > > > That is kinda strange. Seems the locate function has returned to
>> > > Selenium
>> > > > > API isElementPresented() call.
>> >
>> > > > > This is proved from the log and the following code snippet.
>> >
>> > > > >  Tellurium.prototype.locateElementWithCacheAware =
>> function(locator,
>> > > > > inDocument, inWindow){
>> > > > >     var element = null;
>> >
>> > > > >     var json = locator;
>> > > > >     !tellurium.logManager.isUseLog || fbLog("JSON presentation of
>> the
>> > > cache
>> > > > > aware locator: ", json);
>> > > > >     var cal = JSON.parse(json, null);
>> > > > >     !tellurium.logManager.isUseLog || fbLog("Parsed cache aware
>> > > locator: ",
>> > > > > cal);
>> >
>> > > > >     !tellurium.logManager.isUseLog || fbLog("Tellurium Cache
>> option: ",
>> > > > > this.isUseCache());
>> > > > >     if (this.isUseCache()) {
>> > > > >         //if Cache is used, try to get the UI element from the
>> cache
>> > > first
>> > > > >         element = this.getUiElementFromCache(cal.rid);
>> > > > >         !tellurium.logManager.isUseLog || fbLog("Got UI element "
>> +
>> > > cal.rid
>> > > > > + " from Cache.", element);
>> >
>> > > > >         if (element != null) {
>> > > > >             //need to validate the result from the cache
>> > > > >             !tellurium.logManager.isUseLog || fbLog("Trying to
>> validate
>> > > the
>> > > > > found UI element " + cal.rid, element);
>> > > > >             if (!validateDomRef(element)) {
>> > > > >                 fbError("The UI element " + cal.rid + " from cache
>> is
>> > > not
>> > > > > valid", element);
>> > > > >                 this.cache.relocateUiModule(cal.rid);
>> > > > >                 //after relocating the UI module, retry to get the
>> UI
>> > > > > element from the cache
>> > > > >                 element = this.getUiElementFromCache(cal.rid);
>> > > > >                 !tellurium.logManager.isUseLog || fbLog("After
>> > > relocating
>> > > > > UI module, found ui element" + cal.rid, element);
>> > > > >             }
>> > > > >         }else{
>> > > > >             if(cal.locator != null && cal.locator.trim().length >
>> 0){
>> > > > >                 //If cannot find the UI element from the cache,
>> locate
>> > > it
>> > > > > as the last resort
>> > > > >                 !tellurium.logManager.isUseLog || fbLog("Trying to
>> > > locate
>> > > > > the UI element " + cal.rid + " with its locator " + cal.locator +
>> "
>> > > because
>> > > > > cannot find vaild one from cache", cal);
>> > > > >                 element = this.locate(cal.locator);
>> > > > >             }
>> > > > >         }
>> > > > >     }else{
>> > > > >         !tellurium.logManager.isUseLog || fbLog("Trying to locate
>> the
>> > > UI
>> > > > > element " + cal.rid + " with its locator " + cal.locator + "
>> because
>> > > cache
>> > > > > option is off", cal);
>> > > > >         element = this.locate(cal.locator);
>> > > > >     }
>> >
>> > > > >     if(element == null){
>> > > > >         fbError("Cannot locate element for uid " + cal.rid + "
>> with
>> > > locator
>> > > > > " + cal.locator, element);
>> > > > >     }
>> >
>> > > > >     !tellurium.logManager.isUseLog || fbLog("Returning found UI
>> element
>> > > ",
>> > > > > element);
>> > > > >     return element;
>> > > > > };
>> >
>> > > > > On Mon, Mar 22, 2010 at 2:04 PM, dominicm <
>> [email protected]
>> > > >wrote:
>> >
>> > > > >> Apologies I hit return when i was still composing the message! To
>> be
>> > > > >> more specific, this problem only happens if the element doesn't
>> exist
>> > > > >> on the page.
>> >
>> > > > >> Not sure if this is a selenium bug or not, but what seems to be
>> > > > >> happening is that isElementPresent is getting stuck in an
>> infinite
>> > > > >> loop, presumably because the returned value is null. Exact same
>> tests
>> > > > >> are fine in FF and googlechrome. I'm using IE8.
>> >
>> > > > >> Here are snippets from the engine log.
>> >
>> > > > >> "Issue Bundle Command "
>> >
>> > >
>> "[{"uid":"mainColumn.pods.largePodContainer[1].events[1].eventName","args":
>> > > > >> ["jquery=#podsContainer div.Expander:not(.narrow):eq(0)
>> div.podContent
>> > > > >> > table > tbody > tr:eq(0)
>> > > > >> td.eventName"],"name":"isElementPresent","sequ":8}]"
>> > > > >> "Dispatching command: " Object sequ=8
>> > > > >> uid="mainColumn.pods.largePodContainer[1 ..."
>> name="isElementPresent"
>> > > > >> args=[1]
>> > > > >> "Update argument list for command isElementPresent" Object sequ=8
>> > > > >> uid="mainColumn.pods.largePodContainer[1 ..."
>> name="isElementPresent"
>> > > > >> args=[1]
>> > > > >> "Command after updating argument list: " Object sequ=8
>> > > > >> uid="mainColumn.pods.largePodContainer[1 ..."
>> name="isElementPresent"
>> > > > >> args=[1]
>> > > > >> "delegate command to Selenium" Object sequ=8
>> > > > >> uid="mainColumn.pods.largePodContainer[1 ..."
>> name="isElementPresent"
>> > > > >> args=[1]
>> > > > >> "Delegate Call isElementPresent to Selenium" Object sequ=8
>> > > > >> uid="mainColumn.pods.largePodContainer[1 ..."
>> name="isElementPresent"
>> > > > >> args=[1]
>> > > > >> "JSON presentation of the cache aware locator: "
>> >
>> > >
>> "{"rid":"mainColumn.pods.largePodContainer[1].events[1].eventName","locator­­":"jquery=#podsContainer
>> > > > >> div.Expander:not(.narrow):eq(0) div.podContent > table > tbody >
>> > > > >> tr:eq(0) td.eventName"}"
>> > > > >> "Parsed cache aware locator: " Object
>> > > > >> rid="mainColumn.pods.largePodContainer[1 ..."
>> > > > >> locator="jquery=#podsContainer div.Expander: ..."
>> > > > >> "Tellurium Cache option: " false
>> > > > >> "Trying to locate the UI element
>> > > > >> mainColumn.pods.largePodContainer[1].events[1].eventName with its
>> > > > >> locator jquery=#podsContainer div.Expander:not(.narrow):eq(0)
>> > > > >> div.podContent > table > tbody > tr:eq(0) td.eventName because
>> cache
>> > > > >> option is off" Object rid="mainColumn.pods.largePodContainer[1
>> ..."
>> > > > >> locator="jquery=#podsContainer div.Expander: ..."
>> > > > >> >>> console.trace(stack)
>> > > > >> function"[object Object]"argumentsundefined
>> > > > >> function"[object Object]"argumentsundefined
>> > > > >> function"[object Object]"argumentsundefined
>> > > > >> "Cannot locate element for uid
>> > > > >> mainColumn.pods.largePodContainer[1].events[1].eventName with
>> locator
>> > > > >> jquery=#podsContainer div.Expander:not(.narrow):eq(0)
>> div.podContent >
>> > > > >> table > tbody > tr:eq(0) td.eventName" null
>> > > > >> "Returning found UI element " null
>> > > > >> "JSON presentation of the cache aware locator: "
>> >
>> > >
>> "{"rid":"mainColumn.pods.largePodContainer[1].events[1].eventName","locator­­":"jquery=#podsContainer
>> > > > >> div.Expander:not(.narrow):eq(0) div.podContent > table > tbody >
>> > > > >> tr:eq(0) td.eventName"}"
>> > > > >> "Parsed cache aware locator: " Object
>> > > > >> rid="mainColumn.pods.largePodContainer[1 ..."
>> > > > >> locator="jquery=#podsContainer div.Expander: ..."
>> > > > >> "Tellurium Cache option: " false
>> >
>> > > > >> <snip>
>> >
>> > > > >> "Trying to locate the UI element
>> >
>> > ...
>> >
>> > read more »- Hide quoted text -
>> >
>> > - Show quoted text -
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "tellurium-users" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected]<tellurium-users%[email protected]>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/tellurium-users?hl=en.
>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"tellurium-users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/tellurium-users?hl=en.

Reply via email to