Thanks, that would be great. Although I've managed to work around this problem by using the <form> element as the root of the list ;-)
On 3 February 2010 06:43, Jian Fang <[email protected]> wrote: > Looked at your html source, it seems you need a repeat object instead of a > list object. A list object usually > looks like the following html section that you provided > > <ul class="fares"> > <li> > <input type="radio"> > <label>Economy</label> > </li> > <li> > <input type="radio"> > <label>Flexible</label> > </li> > </ul> > but not > > <div class="option"> > ... > <div class="option"> > ... > <div class="option"> > > I will add a Repeat object for you. > > Thanks, > > Jian > > On Tue, Feb 2, 2010 at 11:45 AM, Jian Fang <[email protected]> wrote: >> >> I will look into the isElementPresent() problem. Are you using new >> Tellurium API? >> >> What do you mean "waitForPageToLoad doesn't seem to be working fine"?, it >> just returned >> without waiting? What was the behavior? >> >> Thanks, >> >> Jian >> >> On Tue, Feb 2, 2010 at 11:24 AM, Jonathan Share <[email protected]> >> wrote: >>> >>> Thanks, I have a small test case working using lists, however now that >>> I've updated to the current snapshot again I'm seeing a couple of new >>> problems. isElementPresent() is throwing an exception when the element >>> doesn't exist (instead of returning false) and waitForPageToLoad >>> doesn't seem to be working fine... for example, the following code >>> that worked on an older snapshot >>> >>> public void login(String username, String password) { >>> type "login.username", username >>> type "login.password", password >>> click "login.submit" >>> waitForPageToLoad 10000 >>> assertTrue("Failed to login", isElementPresent("welcomePage")) >>> } >>> >>> Now needs to be updated to; >>> >>> public void login(String username, String password) { >>> type "login.username", username >>> type "login.password", password >>> click "login.submit" >>> waitForPageToLoad 10000 >>> def result = waitForElementPresent("welcomePage", 5000) >>> assertTrue("Failed to login", result) >>> } >>> >>> I'm guessing this isn't the right solution, but it's home time for me >>> now, I'll look into it further tomorrow. >>> >>> >>> 2010/2/2 Jian Fang <[email protected]>: >>> > List is fine. The remaining task for 0.7.0 is to refactor List and >>> > Table so >>> > that you can reference them not by position only, but this should be >>> > after >>> > the RC1 release. >>> > >>> > I will create another test case for you tonight. >>> > >>> > Thanks, >>> > >>> > Jian >>> > >>> > On Tue, Feb 2, 2010 at 10:26 AM, Jonathan Share <[email protected]> >>> > wrote: >>> >> >>> >> Thanks for the response, your solution looks nice, however my example >>> >> html was perhaps a little oversimplified, the "option" div is repeated >>> >> several times within the "segment clearfix" div and the whole "segment >>> >> clearfix" div is also repeated several times, meaning there exists >>> >> more than one list with class fares in the form (see more detailed >>> >> outline below). >>> >> >>> >> Is there any better way to handle this situation? While creating the >>> >> below outline I have just come up with an idea of trying to make a >>> >> list out of the "segment clearfix" divs, instead of referencing them >>> >> with xpath, disadvantage of this is that my uids will be slightly less >>> >> expressive. >>> >> >>> >> Thanks for the help so far. >>> >> >>> >> Jonathan >>> >> >>> >> <form name="selectedSailingsForm"> >>> >> <h1>Choose ship</h1> >>> >> <h3 class="inbound-outbound">Outbound</h3> >>> >> <h2 class="content-header"><!-- Route description --></h2> >>> >> <div class="segment clearfix"> >>> >> <div class="option"> >>> >> <ul class="fares"> >>> >> <li> >>> >> <input type="radio"> >>> >> <label>Economy</label> >>> >> </li> >>> >> <li> >>> >> <input type="radio"> >>> >> <label>Flexible</label> >>> >> </li> >>> >> </ul> >>> >> <div class="details"> >>> >> <dl> >>> >> <dt>Ship:</dt> >>> >> <dd><!-- Ship Name --></dd> >>> >> <dt>Departs</dt> >>> >> <dd> >>> >> <em>08:00</em> >>> >> </dd> >>> >> <dt>Arrives</dt> >>> >> <dd> >>> >> <em>11:45</em> >>> >> </dd> >>> >> </dl> >>> >> </div> >>> >> </div> >>> >> <div class="option"> >>> >> <ul class="fares"> >>> >> <li> >>> >> <input type="radio"> >>> >> <label>Economy</label> >>> >> </li> >>> >> <li> >>> >> <input type="radio"> >>> >> <label>Flexible</label> >>> >> </li> >>> >> </ul> >>> >> <div class="details"> >>> >> <dl> >>> >> <dt>Ship:</dt> >>> >> <dd><!-- Ship Name --></dd> >>> >> <dt>Departs</dt> >>> >> <dd> >>> >> <em>17:30</em> >>> >> </dd> >>> >> <dt>Arrives</dt> >>> >> <dd> >>> >> <em>21:15</em> >>> >> </dd> >>> >> </dl> >>> >> </div> >>> >> </div> >>> >> </div> >>> >> <h3 class="inbound-outbound">Return</h3> >>> >> >>> >> <h2 class="content-header"><!-- Route description --></h2> >>> >> >>> >> <div class="segment clearfix"> >>> >> <div class="option"> >>> >> <ul class="fares"> >>> >> <li> >>> >> <input type="radio"> >>> >> <label>Economy</label> >>> >> </li> >>> >> <li> >>> >> <input type="radio"> >>> >> <label>Flexible</label> >>> >> </li> >>> >> </ul> >>> >> <div class="details"> >>> >> <div class="photo"><img></div> >>> >> <dl> >>> >> <dt>Ship:</dt> >>> >> <dd><!-- Ship Name --></dd> >>> >> <dt>Departs</dt> >>> >> <dd> >>> >> <em>02:00</em> >>> >> </dd> >>> >> <dt>Arrives</dt> >>> >> <dd> >>> >> <em>06:00</em> >>> >> </dd> >>> >> </dl> >>> >> </div> >>> >> </div> >>> >> <div class="option"> >>> >> <ul class="fares"> >>> >> <li> >>> >> <input type="radio"> >>> >> <label>Economy</label> >>> >> </li> >>> >> <li> >>> >> <input type="radio"> >>> >> <label>Flexible</label> >>> >> </li> >>> >> </ul> >>> >> <div class="details"> >>> >> <dl> >>> >> <dt>Ship:</dt> >>> >> <dd><!-- Ship Name --></dd> >>> >> <dt>Departs</dt> >>> >> <dd> >>> >> <em>12:45</em> >>> >> </dd> >>> >> <dt>Arrives</dt> >>> >> <dd> >>> >> <em>16:30</em> >>> >> </dd> >>> >> </dl> >>> >> </div> >>> >> </div> >>> >> </div> >>> >> <div class="segment clearfix"> >>> >> <!-- Other boring stuff --> >>> >> </div> >>> >> </form> >>> >> >>> >> 2010/2/1 Jian Fang <[email protected]>: >>> >> > Here is my test code >>> >> > >>> >> > UI Module >>> >> > >>> >> > >>> >> > >>> >> > ---------------------------------------------------------------------------- >>> >> > package org.telluriumsource.module >>> >> > >>> >> > import org.telluriumsource.dsl.DslContext >>> >> > >>> >> > class JListModule extends DslContext { >>> >> > >>> >> > public void defineUi(){ >>> >> > ui.Form(uid: "selectedSailings", clocator: [name: >>> >> > "selectedSailingsForm"]) { >>> >> > List(uid: "outgoingSailings", locator: "/div[1]") { >>> >> > Container(uid: "all", clocator: [tag: "div", 'class': >>> >> > "option"]) >>> >> > { >>> >> > List(uid: "fares", clocator: [tag: "ul"]) { >>> >> > Container(uid: "all", clocator: [tag: "li"]) { >>> >> > RadioButton(uid: "radio", clocator: [:], respond: >>> >> > ["click"]) >>> >> > TextBox(uid: "label", clocator: [tag: "label"]) >>> >> > } >>> >> > } >>> >> > TextBox(uid: "departureTime", locator: "/div/dl/dd/em[1]") >>> >> > } >>> >> > } >>> >> > } >>> >> > >>> >> > ui.Form(uid: "Sailings", clocator: [name: >>> >> > "selectedSailingsForm"]){ >>> >> > List(uid: "Fares", clocator: [tag: "ul", class: "fares"], >>> >> > separator: >>> >> > "li"){ >>> >> > Container(uid: "all"){ >>> >> > RadioButton(uid: "radio", clocator: [:], respond: >>> >> > ["click"]) >>> >> > TextBox(uid: "label", clocator: [tag: "label"]) >>> >> > } >>> >> > } >>> >> > } >>> >> > } >>> >> > } >>> >> > >>> >> > >>> >> > -------------------------------------------------------------------------------------------------- >>> >> > >>> >> > Test Case >>> >> > >>> >> > >>> >> > >>> >> > ------------------------------------------------------------------------------------------------- >>> >> > package org.telluriumsource.ft; >>> >> > >>> >> > import org.junit.AfterClass; >>> >> > import org.junit.Before; >>> >> > import org.junit.BeforeClass; >>> >> > import org.junit.Test; >>> >> > import org.telluriumsource.module.JListModule; >>> >> > import org.telluriumsource.test.java.TelluriumMockJUnitTestCase; >>> >> > >>> >> > public class JListTestJUnitCase extends TelluriumMockJUnitTestCase { >>> >> > private static JListModule jlm; >>> >> > >>> >> > @BeforeClass >>> >> > public static void initUi() { >>> >> > registerHtmlBody("JList"); >>> >> > >>> >> > jlm = new JListModule(); >>> >> > jlm.defineUi(); >>> >> > // useCssSelector(true); >>> >> > // useTelluriumApi(true); >>> >> > useTrace(true); >>> >> > // useCache(true); >>> >> > // useMacroCmd(true); >>> >> > useEngineLog(true); >>> >> > } >>> >> > >>> >> > @Before >>> >> > public void connectToLocal() { >>> >> > connect("JList"); >>> >> > } >>> >> > >>> >> > @Test //This works fine if the following two commands are >>> >> > used: >>> >> > useCache(true); useTelluriumApi(true); >>> >> > public void testGetListSize(){ >>> >> > int size = >>> >> > jlm.getListSize("selectedSailings.outgoingSailings[1].fares"); >>> >> > System.out.println("List Size " + size); >>> >> > } >>> >> > >>> >> > @Test >>> >> > public void testGetNewListSize(){ >>> >> > int size = jlm.getListSize("Sailings.Fares"); >>> >> > System.out.println("List Size " + size); >>> >> > >>> >> > } >>> >> > >>> >> > @AfterClass >>> >> > public static void tearDown(){ >>> >> > showTrace(); >>> >> > } >>> >> > } >>> >> > >>> >> > >>> >> > >>> >> > On Mon, Feb 1, 2010 at 11:05 AM, Jian Fang >>> >> > <[email protected]> >>> >> > wrote: >>> >> >> >>> >> >> Hi, >>> >> >> >>> >> >> Your UI module definition might be problematic. I used the >>> >> >> following >>> >> >> one >>> >> >> and can get back the list size 2 correctly >>> >> >> >>> >> >> ui.Form(uid: "Sailings", clocator: [name: >>> >> >> "selectedSailingsForm"]){ >>> >> >> List(uid: "Fares", clocator: [tag: "ul", class: "fares"], >>> >> >> separator: >>> >> >> "li"){ >>> >> >> Container(uid: "all"){ >>> >> >> RadioButton(uid: "radio", clocator: [:], respond: >>> >> >> ["click"]) >>> >> >> TextBox(uid: "label", clocator: [tag: "label"]) >>> >> >> } >>> >> >> } >>> >> >> } >>> >> >> >>> >> >> You should use the logical container to include the list elements. >>> >> >> >>> >> >> Also, please don't use hard coded xpath there, otherwise, your test >>> >> >> is >>> >> >> not >>> >> >> robust to changes. Also, most 0.7.0 new >>> >> >> features require the clocator. >>> >> >> >>> >> >> Interesting thing is I can get back the correct List size even with >>> >> >> your >>> >> >> UI module with new Tellurium API. I will >>> >> >> post all my test code soon. >>> >> >> >>> >> >> Thanks, >>> >> >> >>> >> >> Jian >>> >> >> >>> >> >> On Mon, Feb 1, 2010 at 10:49 AM, Jian Fang >>> >> >> <[email protected]> >>> >> >> wrote: >>> >> >>> >>> >> >>> You are right, the new core added a WorkflowContext variable to >>> >> >>> all >>> >> >>> Accessor methods >>> >> >>> so that we can pass in meta data to the tiers under it. That is >>> >> >>> why it >>> >> >>> cannot find the method with >>> >> >>> the old snapshot. >>> >> >>> >>> >> >>> Thanks, >>> >> >>> >>> >> >>> Jian >>> >> >>> >>> >> >>> On Mon, Feb 1, 2010 at 10:35 AM, Jonathan Share >>> >> >>> <[email protected]> >>> >> >>> wrote: >>> >> >>>> >>> >> >>>> Thanks, I'm also having problems with getXpathCount, but that may >>> >> >>>> be >>> >> >>>> because I'm using an old snapshot in order to work around the >>> >> >>>> list >>> >> >>>> problem. >>> >> >>>> >>> >> >>>> "groovy.lang.MissingMethodException: No signature of method: >>> >> >>>> org.telluriumsource.access.Accessor.getXpathCount() is applicable >>> >> >>>> for >>> >> >>>> argument types: (java.lang.String) values: >>> >> >>>> >>> >> >>>> >>> >> >>>> >>> >> >>>> [//descendant-or-self::tab...@id="supplierEditor"]/tbody/tr[child::td]/td[1]]" >>> >> >>>> >>> >> >>>> 2010/2/1 Jian Fang <[email protected]>: >>> >> >>>> > Thanks for reporting the problem. I will create a test case and >>> >> >>>> > see >>> >> >>>> > what >>> >> >>>> > happens. >>> >> >>>> > >>> >> >>>> > Thanks, >>> >> >>>> > >>> >> >>>> > Jian >>> >> >>>> > >>> >> >>>> > On Mon, Feb 1, 2010 at 7:20 AM, Jonathan Share >>> >> >>>> > <[email protected]> >>> >> >>>> > wrote: >>> >> >>>> >> >>> >> >>>> >> Hi, >>> >> >>>> >> >>> >> >>>> >> I seem to be having a little problem with getListSize. When I >>> >> >>>> >> call >>> >> >>>> >> that method tellurium crashes on me with the following >>> >> >>>> >> exception; >>> >> >>>> >> >>> >> >>>> >> com.thoughtworks.selenium.SeleniumException: ERROR: Element >>> >> >>>> >> >>> >> >>>> >> >>> >> >>>> >> >>> >> >>>> >> >>> >> >>>> >> //descendant-or-self::fo...@name="selectedSailingsForm"]/div[1]/d...@class="option"][1]/descendant-or-self::ul/li[3] >>> >> >>>> >> not found >>> >> >>>> >> >>> >> >>>> >> The interesting thing to note here is that there are only two >>> >> >>>> >> li >>> >> >>>> >> elements in the list. Is this a bug that has crept into >>> >> >>>> >> tellurium >>> >> >>>> >> or >>> >> >>>> >> am I doing something really stupid in my test? >>> >> >>>> >> >>> >> >>>> >> Thanks in advance >>> >> >>>> >> >>> >> >>>> >> Jonathan >>> >> >>>> >> >>> >> >>>> >> // MODEL >>> >> >>>> >> ui.Form(uid: "selectedSailings", clocator: [name: >>> >> >>>> >> "selectedSailingsForm"]) >>> >> >>>> >> { >>> >> >>>> >> List(uid: "outgoingSailings", locator: "/div[1]") { >>> >> >>>> >> Container(uid: "all", clocator: [tag: "div", >>> >> >>>> >> 'class': >>> >> >>>> >> "option"]) { >>> >> >>>> >> List(uid: "fares", clocator: [tag: "ul"]) { >>> >> >>>> >> Container(uid: "all", clocator: [tag: >>> >> >>>> >> "li"]) { >>> >> >>>> >> RadioButton(uid: "radio", clocator: >>> >> >>>> >> [:], >>> >> >>>> >> respond: ["click"]) >>> >> >>>> >> TextBox(uid: "label", clocator: >>> >> >>>> >> [tag: >>> >> >>>> >> "label"]) >>> >> >>>> >> } >>> >> >>>> >> } >>> >> >>>> >> TextBox(uid: "departureTime", locator: >>> >> >>>> >> "/div/dl/dd/em[1]") >>> >> >>>> >> } >>> >> >>>> >> } >>> >> >>>> >> } >>> >> >>>> >> >>> >> >>>> >> // TEST LINE THAT FAILS >>> >> >>>> >> def numPricesForSailing = >>> >> >>>> >> getListSize("selectedSailings.outgoingSailings[1].fares") >>> >> >>>> >> >>> >> >>>> >> // HTML (edited a little) >>> >> >>>> >> <form action="..." id="airDetailsForm" method="POST" >>> >> >>>> >> name="selectedSailingsForm"> >>> >> >>>> >> <div class="segment clearfix"> >>> >> >>>> >> <div class="option"> >>> >> >>>> >> <ul class="fares"> >>> >> >>>> >> <li> >>> >> >>>> >> <input id="..." name="..." type="radio" value="..." >>> >> >>>> >> checked >>> >> >>>> >> onclick="enableDisable(1,2)"> <label >>> >> >>>> >> for="..."><strong><span >>> >> >>>> >> id="...">3,000</span>KR</strong>economy</label> >>> >> >>>> >> </li> >>> >> >>>> >> <li> >>> >> >>>> >> <input id="..." name="..." type="radio" value="..." >>> >> >>>> >> onclick="enableDisable(1,1)"> <label >>> >> >>>> >> for="..."><strong><span >>> >> >>>> >> id="...">4,000</span>KR</strong> Flexible</label> >>> >> >>>> >> </li> >>> >> >>>> >> </ul> >>> >> >>>> >> </div> >>> >> >>>> >> </div> >>> >> >>>> >> </form> >>> >> >>>> >> >>> >> >>>> >> -- >>> >> >>>> >> 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. >>> >> >>>> >> >>> >> >>>> > >>> >> >>>> > -- >>> >> >>>> > 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. >>> >> >>>> > >>> >> >>>> >>> >> >>>> -- >>> >> >>>> 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. >>> >> >>>> >>> >> >>> >>> >> >> >>> >> > >>> >> > -- >>> >> > 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. >>> >> > >>> >> >>> >> -- >>> >> 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. >>> >> >>> > >>> > -- >>> > 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. >>> > >>> >>> -- >>> 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. >>> >> > > -- > 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. > -- 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.
