I will reproduce your problem and see what happens. Ajay, could you also take a look.
Thanks, Jian On Sun, Apr 18, 2010 at 5:45 AM, tetsuo <[email protected]> wrote: > Thanks for your responses Jian, > > I have tried your suggestion to ' validate the key value pairs from > the table' by defining a UI module as: > > ui.Table(uid: "keyValue", clocator: [class: "keyValueTable"]){ > TextBox(uid: "{row: all, column: 1}", clocator: [tag: 'td'], > self: "true") > TextBox(uid: "{row: all, column: 2}", clocator: [tag: 'td'], > self: "true") > } > > I am however seeing a strange error message in my test result. I don't > know if a stack will suffice but I will include it here in case it > looks familiar to anyone. > > I generated a 0.7.0 snapshot testng maven project using the maven > tellurium testng archetype and have been sucessfully executing a basic > test, but now that I am trying to interact with an html table I am > seeing this rather odd error: > > groovy.lang.MissingPropertyException: No such property: i18nManager > for class: org.tellurium.object.TextBox > > Any idea what I might be doing wrong here? I am using everything out > of the box, including TelluriumConfig.groovy > > The full stack is as follows: > > groovy.lang.MissingPropertyException: No such property: i18nManager > for class: org.tellurium.object.TextBox > at > > org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java: > 49) > at > > org.codehaus.groovy.runtime.callsite.GetEffectivePogoPropertySite.getProperty(GetEffectivePogoPropertySite.java: > 71) > at > > org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java: > 240) > at org.tellurium.object.UiObject.walkTo(UiObject.groovy:238) > at org.tellurium.object.UiObject$walkTo.call(Unknown Source) > at > > org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java: > 43) > at > > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java: > 116) > at > > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java: > 128) > at org.tellurium.object.List.walkTo(List.groovy:341) > at org.tellurium.object.List$walkTo.call(Unknown Source) > at > > org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java: > 43) > at > > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java: > 116) > at > > org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java: > 128) > at org.tellurium.object.Container.walkTo(Container.groovy:156) > at org.tellurium.object.Container$walkTo.call(Unknown Source) > at org.tellurium.dsl.UiDslParser.walkTo(UiDslParser.groovy:69) > at org.tellurium.dsl.UiDslParser$walkTo.call(Unknown Source) > at > org.tellurium.dsl.BaseDslContext.walkToWithException(BaseDslContext.groovy: > 128) > at org.tellurium.dsl.BaseDslContext > $walkToWithException.callCurrent(Unknown Source) > at > > org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java: > 47) > at > > org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java: > 142) > at > > org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java: > 154) > at > org.tellurium.dsl.BaseDslContext.getAllTableCellText(BaseDslContext.groovy: > 716) > at org.tellurium.dsl.BaseDslContext > $getAllTableCellText.callCurrent(Unknown Source) > at > > org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java: > 47) > at > > org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java: > 142) > at > > org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java: > 150) > at > module.DocumentShowModule.getValueForLabel(DocumentShowModule.groovy: > 35) > at > > test.DocumentShowTestCase.testDocumentLabelValuePairs(DocumentShowTestCase.java: > 37) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: > 39) > at > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: > 25) > at java.lang.reflect.Method.invoke(Method.java:597) > at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java: > 580) > at org.testng.internal.Invoker.invokeMethod(Invoker.java:478) > at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:617) > at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:885) > at > > org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java: > 126) > at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java: > 110) > at org.testng.TestRunner.runWorkers(TestRunner.java:712) > at org.testng.TestRunner.privateRun(TestRunner.java:582) > at org.testng.TestRunner.run(TestRunner.java:477) > at org.testng.SuiteRunner.runTest(SuiteRunner.java:324) > at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:319) > at org.testng.SuiteRunner.privateRun(SuiteRunner.java:292) > at org.testng.SuiteRunner.run(SuiteRunner.java:198) > at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:821) > at org.testng.TestNG.runSuitesLocally(TestNG.java:788) > at org.testng.TestNG.run(TestNG.java:708) > at > org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java: > 62) > at > > org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java: > 141) > at org.apache.maven.surefire.Surefire.run(Surefire.java:177) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: > 39) > at > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: > 25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > > org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java: > 345) > at > org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java: > 1009) > > Regards, > > Graham > > On Apr 10, 9:56 am, John <[email protected]> wrote: > > BTW, for your first question if you only need to validate the key > > value pairs > > from the table, you can simply define the UI module as > > > > ui.Table(uid: "keyValue", clocator: [class: "keyValueTable"]){ > > TextBox(uid: "{row: all, column: 1}", clocator: [tag: td], self: > > "true") > > TextBox(uid: "{row: all, column: 2}", clocator: [tag: td], self: > > "true") > > } > > > > Then, call the following method to get back all table cell texts in > > one call. > > > > String[] texts = getAllTableCellText("keyValue") > > > > After that, you can loop through the array to validate the key value > > pairs. > > Make sure the table can be located by itself. If not, you can embed it > > inside > > some other UI module. > > > > More getAllTableCellText() examples can be found at > > > > http://code.google.com/p/aost/wiki/UserGuide070AppendixA#Custom_UI_Ob... > > > > Thanks, > > > > Jian > > On Apr 9, 12:57 pm, Jian Fang <[email protected]> wrote: > > > > > > > > > I thought about it a bit. Two ways come to my mind. > > > > > The first one is to define an abstract UI object with variables such as > > > > > ui.Table(uid: "keyValue", clocator: [class: "keyValueTable"]){ > > > TextBox(uid: "{row: any, column: 1} as p1, var key", clocator: > [text: > > > "key"], self: "true") > > > TextBox(uid: "{row: any, column: 2} as p2, var value", clocator: > > > [text: "value"], self: "true") > > > } > > > > > In the above UI module, I defined two variables: key and value. > > > > > The abstract object could not be used directly and it must be > instantiated > > > with values binding > > > to the variables. I need to come up with a mechanism to instantiate > multiple > > > instances based on > > > the abstract objects. For example, > > > > > spawn "keyValue.p1", "KA", [key: "AAA"] > > > spawn "keyValue.p2", "V1", [key: "111"] > > > spawn "keyValue.p1", "KB", [key: "BBB"] > > > spawn "keyValue.p2", "V2", [key: "222"] > > > > > where "KA", "KB", "V1", and "V2" are new IDs. The new instances will be > > > inserted into the Table "keyValue". > > > The key point here is to programmatically change the runtime UI module. > > > After that, you can use > > > "keyValue.KA", "keyValue.V1", "keyValue.KB", and "keyValue.V2" to > reference > > > them. > > > > > The second option is to define a find() method for a UI object, > > > > > find(Map attributes) > > > > > In this way, the above method will first locate the UI object (i.e., > the > > > table "keyValue" itself in the above example), then > > > find its children or descendants by the given attributes. Probably, we > can > > > also assign a temporal uid for each found > > > element like what getUiByTag does so that you can use the temporal uid > to > > > reference the found UI element. > > > > > This changes will not make its way into 0.7.0 RC2. I will see if I can > > > squeeze them in before 0.7.0 final release. If not, should > > > be included in 0.8.0. > > > > > Any suggestions and comments are welcome. > > > > > Thanks, > > > > > Jian > > > > > On Wed, Apr 7, 2010 at 11:19 PM, John <[email protected]> > wrote: > > > > Hi Graham, > > > > > > Great questions. > > > > > > Tellurium does support direct Selenium calls with the following > > > > method, > > > > > > def customDirectCall(String method, Object[] args); > > > > > > You can still programmatically generate the runtime xpath and then > > > > call the > > > > above method to Selenium directly. > > > > > > For more elegant solutions, it would be great if Tellurium could > > > > support dynamic > > > > attributes in the UI module. For example, for your first question, if > > > > Tellurium UDL > > > > could define some attributes as dynamic and do lazy binding at > > > > runtime, your problem > > > > could be solved. But to be honest, I haven't thought of such use > cases > > > > yet. I will > > > > think it over and try to add this feature to UDL and core. > > > > > > For your second question, Tellurium provides the following method > > > > > > UiByTagResponse getUiByTag(String tag, Map filters); > > > > > > to return temporal uids for the giving tag and attributes. Then you > > > > can use these uids > > > > in the same way as other predefined uids in a UI module. More details > > > > here, > > > > > > > http://code.google.com/p/aost/wiki/Tellurium070Update#Get_UIs_by_Tag_... > > > > > > I will follow up with you about my thoughts of dynamic attributes in > > > > UDL and core. > > > > > > Thanks, > > > > > > Jian > > > > > > On Apr 7, 9:57 pm, tetsuo <[email protected]> wrote: > > > > > Hi All, > > > > > > > My company is considering migrating from Selenium to Tellurium for > one > > > > > of our projects. However we are a little concerned about losing > some > > > > > test functionality that is currently enjoyed through the > utilization > > > > > of plain old Selenium. I would like to give some examples of the > test > > > > > functionality and then pose the question – how can I replicate this > > > > > test functionality using Tellurium? > > > > > > > Example A - Verifying the content of a key/value pair table > > > > > > > I have a sequence of key/value pairs loaded from a test data file > into > > > > > a groovy map like so: > > > > > > > ['AAA': '111', > > > > > 'BBB': '222', > > > > > 'CCC': '333'] > > > > > > > These pairs represent the expected content of a table to be tested, > > > > > they might be rendered in html like so: > > > > > > > <table class='keyValueTable'> > > > > > <tr> > > > > > <td>AAA</td><td>111</td> > > > > > </tr> > > > > > <tr> > > > > > <td>BBB</td><td>222</td> > > > > > </tr> > > > > > <tr> > > > > > <td>CCC</td><td>333</td> > > > > > </tr> > > > > > </table> > > > > > > > Using Selenium I can programmatically generate the xpath for each > key/ > > > > > value pair and assert the presence of the xpath. > > > > > > > String cellType = "td"; > > > > > String tableLocator = "//tab...@id='" + tableId + "']"; > > > > > String valueLocator = tableLocator + "//" + cellType + > > > > > "[...@class='label' and .='" + key + "']/following-sibling::"+ > cellType; > > > > > > > Using Tellurium, how could I assert that the pairs in my test data > > > > > exist in the html table, considering that: > > > > > > > • The order of the pairs in the test data does not necessarily > > > > > represent the order of the pairs in the rendered html > > > > > • The test data files may be updated frequently, i.e. one day > there > > > > > may be 10 pairs, then the next there may be 30, and the new pairs > > > > > won’t necessarily be appended to the end of the test file. > > > > > • I don’t want to define each and every pair as elements within > a UI > > > > > module, the test must be data driven. > > > > > • The order of pairs in the test data may change i.e. > referencing > > > > rows > > > > > by index is too brittle. > > > > > > > Example B - Utilisation of programmatically generated element ids > > > > > > > Using Selenium if I have an element that I wish to interact with > and I > > > > > need to generate a unique id attribute for the element I can > > > > > programmatically generate the id and then compose some xpath to > > > > > reference said element. For example, if I have a series of links > with > > > > > composite ids: > > > > > > > <a id=”111_222”>View</a> > > > > > <a id=”333_444”>View</a> > > > > > <a id=”555_666”>View</a> > > > > > > > And my test data file looks like this > > > > > 111|222 > > > > > 333|444 > > > > > 555|666 > > > > > > > Using Selenium I would programmatically generate the xpath > locators: > > > > > > > //inp...@id='${idLeft}_${idRight}'] > > > > > > > And interact with the links using Selenium commands and the > generated > > > > > xpath. > > > > > > > Some questions: > > > > > > > 1. How could I interact with these links using Tellurium (must > be > > > > data > > > > > driven) > > > > > 2. Does the Tellurium API allow me to call Selenium commands > > > > directly? > > > > > > > I guess the crux of this post is about dynamic attributes in > Tellurium > > > > > tests. I really like the clean representation of the relevant parts > of > > > > > a DOM that Tellurium Modules bring, but I can't see how I can > perform > > > > > data driven testing with what appears to be largely static DOM > > > > > definitions. > > > > > > > Regards, > > > > > > > Graham > > > > > > -- > > > > 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]> > <tellurium-users%2bunsubscr...@googlegroups.com> > > > > . > > > > For more options, visit this group at > > > >http://groups.google.com/group/tellurium-users?hl=en.- 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.
