If you can do in this way, it would be great enhancement to Tellurium
since IE
is pretty fast with selectors but slow for XPath.

Keep posting your thoughts here.

Thanks,

Jian

On Nov 26, 3:32 pm, Mikhail Koryak <[EMAIL PROTECTED]> wrote:
> i see what you mean by adding constraints.
>
> i see that as creating a jquery locator like this:
> $("A").find("B").find("C");
>
> where A, B, and C are jquery locators. This might be easier then all
> thought.
>
> On Nov 26, 1:46 pm, [EMAIL PROTECTED] wrote:
>
> > Mikhail,
>
> > I would like you to add another locator jlocator first. You can copy
> > whatever you need from
> > clocator to your jlocator. Later on, we will look at your jlocator to
> > see if we can merge
> > it back to clocator. The very important thing for the clocator or
> > jlocator is that it is able to handle
> > nested UI objects. That is to say, if you have
>
> >  A{
> >    B{
> >      C{
> >        D
> >        E
> >      }
> >     }
> >   }
>
> > Your jlocator should be able to add more constraints on the search
> > criteria when you walk along the path
> > A -> B -> C -> D
>
> > If this is possible, you can use the existing code to handle the rest.
>
> > Sometimes, Tellurium may also need to get back a list of elements, not
> > just one, which will improve the
> > performance a lot for dynamic objects such as a data grid. At the
> > current stage, Tellurium has to call
> > Selenium core multiple times to get back the list, which is not really
> > efficient.
>
> > Thanks,
>
> > Jian
>
> > On Nov 26, 1:28 pm, Mikhail Koryak <[EMAIL PROTECTED]> wrote:
>
> > > Jian,
> > > i am starting to look into this jquery stuff.
> > > Here is my question:
> > > In order to this "right" i need to modify clocator or add another
> > > location called jlocator which will contain the jquery locator and
> > > then bind the returned object to this uiObject.
>
> > > I also have a new idea on how to handle jquery selectors. As you may
> > > know, a jquery selector can return 0 to N jquery objects, but we dont
> > > really need these objects in selenium, we need to be able to _act_ on
> > > the collection, so the best thing to do is to keep the collection in a
> > > map in javascript, and return the key to tellurium. tellurium will
> > > then keep its own map of the UiObject to the key which was returned
> > > from selenium.
>
> > > i am going to try to add another locator by implementing
> > > AbstractLocateStrategy and see where that takes me
>
> > > On Nov 26, 12:03 pm, [EMAIL PROTECTED] wrote:
>
> > > > Mikhail reminded me of the selenium Contributed User-Extensions at
>
> > > >http://wiki.seleniumhq.org/display/SEL/Contributed+User-Extensions
>
> > > > Thanks.
>
> > > > On Oct 21, 9:18 pm, [EMAIL PROTECTED] wrote:
>
> > > > > As for how to add a new method to Tellurium, I give an example here on
> > > > > how to do that. (We could make Tellurium configurable to new methods,
> > > > > but user rarely needs to define custom methods, we defer this
> > > > > implementation until there are requests of this feature from users)
>
> > > > > Take the typeRepeated method as an example, (Assume you have modified
> > > > > Selenium core script and added the typeRepeated method)
>
> > > > > First, open up the org.tellurium.connector.CustomSelenium class and
> > > > > add the following method in,
>
> > > > >        public void typeRepeated(String locator, String text) {
>
> > > > >          commandProcessor.doCommand("typeRepeated", new String[]
> > > > > {locator, text});
>
> > > > >        }
>
> > > > > Then, In the org.tellurium.dsl.BaseDslContext class add the following
> > > > > method to define a new DSL
>
> > > > >     def typeRepeated(String uid, String input){
> > > > >         WorkflowContext context = WorkflowContext.getDefaultContext()
> > > > >         ui.walkTo(context, uid)?.typeRepeated(input){ loc, String[]
> > > > > events ->
> > > > >             String locator = locatorMapping(context, loc)
> > > > >             eventHandler.typeRepeated(locator, events)
> > > > >         }
> > > > >     }
>
> > > > > where the walkTo method parses the uid such as
> > > > > "google_start_page.inputbox" to find the given UI object "inputbox".
> > > > > The closure
>
> > > > > {loc, String[] events ->
> > > > >             String locator = locatorMapping(context, loc)
> > > > >             eventHandler.typeRepeated(locator, events)
>
> > > > > }
>
> > > > > just generates the runtime locator and then call the eventhandler for
> > > > > the method "typeRepeated".
> > > > > If the custom method is to access data, you should pass the method to
> > > > > the accessor instead of
> > > > > the eventhandler. For details, consult the following example
>
> > > > >     boolean isVisible(String uid){
> > > > >          WorkflowContext context = WorkflowContext.getDefaultContext()
> > > > >          def obj = ui.walkTo(context, uid)
> > > > >          if(obj != null){
> > > > >              return obj.isVisible(){ loc ->
> > > > >                 String locator = locatorMapping(context, loc)
> > > > >                 accessor.isVisible(locator)
> > > > >              }
> > > > >          }
>
> > > > >          return false
> > > > >     }
>
> > > > > Third, you need to add a method to the
> > > > > org.tellurium.event.EventHandler class in the case of "typeRepeated"
> > > > > as follows,
>
> > > > >     def typeRepeated(String locator, String input, String[] events) {
> > > > >         String[] defaultEvents = null
> > > > >         if(extraEvent)
> > > > >            defaultEvents = ["focus", "mouseOver", "mouseOut", "blur"]
>
> > > > >         processEvents(locator, events, defaultEvents){
> > > > >            dispatcher.typeRepeated(locator, input)
> > > > >         }
> > > > >     }
>
> > > > > For org.tellurium.access.Accessor, it is simpler and just passes the
> > > > > method to the dispatcher as follows,
>
> > > > >     def boolean isVisible(String locator){
>
> > > > >         return dispatcher.isVisible(locator)
> > > > >     }
>
> > > > > Then you need to add the new method to your UI object, for example,
>
> > > > > class InputBox extends UiObject{
> > > > >     ...
> > > > >     def typeRepeated(String input, Closure c){
> > > > >         c(locator, respondToEvents)
> > > > >     }
> > > > >     ...
>
> > > > > }
>
> > > > > After that, you are done. In your test file, you can use the
> > > > > typeRepeated now
>
> > > > > typeRepeated "google_start_page.inputbox", "tellurium"
>
> > > > > It is a bit complicated at the first sight, but not really after you
> > > > > read the code since
> > > > > the code looks like boilerplate code. Also you should understand the
> > > > > call flow in
> > > > > Tellurium.
>
> > > > >            DslContext
> > > > >                     |
> > > > >            UI Object
> > > > >                     |
> > > > >            EventHandler / Accessor
> > > > >                     |
> > > > >            Dispatcher
> > > > >                    |
> > > > >            SeleniumClient
> > > > >                    |
> > > > >            SeleniumConnector
> > > > >                    |
> > > > >            CustomSelenium
> > > > >                    |
> > > > > ----------------------------------------
> > > > >                    |
> > > > >            Selenium RC
> > > > >                    |
> > > > >            Selenium Server
> > > > >                    |
> > > > >             Selenium Core
>
> > > > > Let me know if you have any further questions.
>
> > > > > Thanks,
>
> > > > > Jian
--~--~---------~--~----~------------~-------~--~----~
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