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.
