Can find_element_by_class_name do the same as find_element_by_xpath

613 views
Skip to first unread message

Tatu Aalto

unread,
Jun 14, 2014, 3:34:04 PM6/14/14
to appium-...@googlegroups.com
Ugh

I am new to this mobile automation world, so sorry if this has been asked already. But I could not find answer this from the documentation, unit tests or from the user group.

Basically I have an application that is (somewhat) dynamic and what user sees on the UI depends on various things (date&time, user settings and so on). In the web world, when automating things on top of the selenium, xpath works quite well, but here in the mobile side xpath seems to broken. Also I see the similar result, because xpath gives quite random results when I run code against my application.

Because of the dynamic content, I am forced to search over the elements, usually RelativeLayout(s), that contains the desired amount of buttons and text elements. In xpath it quite easy to express this by the index: //element[3]/button[1], //element[3]/button[2], //element[3]/text[1], //element[3]/text[2]. If I did find all the required child elements under the element, I am (quite) sure that I have correct element in hand and I can start interacting with the element. Now because the xpath does not work in reliable manner, all the bugs and discussions indicate that I should use the: find_element_by_class_name. But I am not able swing my head around, how I do the same find_element_by_class_name as I do with xpath. Is there some earlier discussions, examples or documentation that could explain me how to use the find_element_by_class_name?

I live in the Python and Android word and I am forced to Appium version 0.18.0 because newer version of Appium does not work for some group of people, including me. Thanks you in advance

-Tatu

bootstrap online

unread,
Jun 14, 2014, 3:43:34 PM6/14/14
to Tatu Aalto, appium-...@googlegroups.com
I think what you meant is findElementByAndroidUIAutomator and not
class_name. This seems to be a common question. I'll work on writing
some docs for this.
> --
> http://appium.io
> ---
> You received this message because you are subscribed to the Google Groups
> "Appium-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to appium-discus...@googlegroups.com.
> Visit this group at http://groups.google.com/group/appium-discuss.
> For more options, visit https://groups.google.com/d/optout.

Tatu Aalto

unread,
Jun 14, 2014, 5:08:49 PM6/14/14
to appium-...@googlegroups.com, aalto...@gmail.com
Ugh

Yes, class_name is direct webdriver function and findElementByAndroidUIAutomator is Appium function, sorry. Just got mixed up in the function names, with all this head banning. 
-Tatu

Tatu Aalto

unread,
Jun 14, 2014, 6:48:04 PM6/14/14
to appium-...@googlegroups.com, aalto...@gmail.com
Ugh

After getting those function names cleared and sorted in my head, I did had a revelation. By using [1] your demo app, I did do this:

===========
from appium import webdriver

app_package = 'D:\\workspace\\ContactManager.apk'
ANDROID_CAPS = {'app': app_package,
                'version': '4.2',
                'device': 'android',
                'app-activity': '.ContactManager',
                'app-package': "com.example.android.contactmanager"}
REMOTE_SERVER = 'http://127.0.0.1:4723/wd/hub'

if __name__ == '__main__':
    driver = webdriver.Remote(REMOTE_SERVER, ANDROID_CAPS)
    print 'find'
    element = driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.LinearLayout")')
    print 'no text', element[0].text
    button = element[0].find_elements_by_android_uiautomator('new UiSelector().className("android.widget.Button")')
    print button[0].text
    driver.quit()
    print 'quit'
===============
And it prints:
===============
find
no text
Add Contact
quit
===============

And I have the basic building blocks at my hand, where I can do the xpath index search without find_element_by_xpath. Although it does not come with one liner, like xpath, it certainly looks promising and quite clear. But do I get it right, in practice I can select by all methods that are listed in the UiSelector [2] documentation? If yes, then that is so cool :-) If not, then what are the limitations?

But because this was a quite long journey for me and if it gets asked quite often, I totally agree that more documentation on the matter could be better. Specially now when the xpath is more or less broken. And in any case, thanks for clearing my head from the noise.

-Tatu

[1] https://github.com/appium/appium/tree/master/sample-code/apps/ContactManager
[2] http://developer.android.com/tools/help/uiautomator/UiSelector.html

bootstrap online

unread,
Jun 15, 2014, 8:31:10 AM6/15/14
to Tatu Aalto, appium-...@googlegroups.com
On Sat, Jun 14, 2014 at 6:48 PM, Tatu Aalto <aalto...@gmail.com> wrote:
> I can select by all methods that are listed in the UiSelector [2]
> documentation? If yes, then that is so cool :-)

Yes. You can eve use UiScrollable and some others.

Tatu Aalto

unread,
Jun 16, 2014, 9:58:54 AM6/16/14
to appium-...@googlegroups.com, aalto...@gmail.com
Ugh

Well I was too happy, when trying to get it working on my app, there are similar errors as in xpath. Let say that when I have two elements (class="android.widget.LinearLayout") that contains mixed number of elements (class="android.widget.ImageButton" and class="android.widget.TextView"). In my example, the LinearLayout[1] contains six ImageButton and four TextView elements. The LinearLayout[2] contains eight ImageButton and five TextView elements.

Problem One
No when I do this:
==================================
LinearLayout = 'new UiSelector().className("android.widget.LinearLayout")'
TextView = 'new UiSelector().className("android.widget.TextView")'
ImageButton = 'new UiSelector().className("android.widget.ImageButton")'

frame = driver.find_elements_by_android_uiautomator(LinearLayout)

print 'LinearLayout1'
elements1 = frame[1].find_elements_by_android_uiautomator(TextView)
elements2 = frame[1].find_elements_by_android_uiautomator(ImageButton)
print len(elements1)
print len(elements2)

print 'LinearLayout2'
elements1 = frame[2].find_elements_by_android_uiautomator(TextView)
elements2 = frame[1].find_elements_by_android_uiautomator(ImageButton)
print len(elements1)
print len(elements2)
==================================
Then I do get this:
==================================
LinearLayout1
5
8
LinearLayout2
5
8
==================================
Which is wrong, I should get
LinearLayout1
4
6
LinearLayout2
5
8
When print the TextView element text attribute I can see that frame[1] does access the frame[2] elements.

Problem Two
Regardelss what I put in the instance value, it always click the first button in the frame.

I am using this code:
ImageButton = 'new UiSelector().className("android.widget.ImageButton").instance(2)'
button2 = frame[1].find_element_by_android_uiautomator(ImageButton)
button2.click()

And if I use index instead of instance, it kind a works
ImageButton = 'new UiSelector().className("android.widget.ImageButton").instance(2)'
button2 = frame[1].find_element_by_android_uiautomator(ImageButton)
button2.click()
But index clicks on the wrong LinearLayout[, it click on the LinearLayout[2], insted of the LinearLayout[1] .

I did try different selenium and Appium-Python-Client versions, but bugs where always the same. The best result I did get with these versions:
selenium==2.41.0
Appium-Python-Client==0.7
Appium-Windows-Client==0.18.0

So any hint how to get it working would be really nice.

-Tatu

bootstrap online

unread,
Jun 16, 2014, 10:03:50 AM6/16/14
to Tatu Aalto, appium-...@googlegroups.com
Try this:

button2 = find_elements(:class, 'android.widget.ImageButton')[1]
button2.click

Tatu Aalto

unread,
Jun 16, 2014, 10:05:26 AM6/16/14
to appium-...@googlegroups.com, aalto...@gmail.com
Ugh

And fixing few copy/paste errors
=========================

elements1 = frame[2].find_elements_by_android_uiautomator(TextView)
elements2 = frame[1].find_elements_by_android_uiautomator(ImageButton)


elements1 = frame[2].find_elements_by_android_uiautomator(TextView)
elements2 = frame[2].find_elements_by_android_uiautomator(ImageButton)
=========================

ImageButton = 'new UiSelector().className("android.widget.ImageButton").instance(2)'
button2 = frame[1].find_element_by_android_uiautomator(ImageButton)


ImageButton = 'new UiSelector().className("android.widget.ImageButton").index(3)'

button2 = frame[1].find_element_by_android_uiautomator(ImageButton)
=========================
Sorry from the spam.

-Tatu

bootstrap online

unread,
Jun 16, 2014, 10:30:39 AM6/16/14
to appium-...@googlegroups.com
The syntax I used is Ruby. For Python,try:

button2 = driver.find_elements_by_class_name('android.widget.ImageButton')[1]
button2.click

On Mon, Jun 16, 2014 at 10:15 AM, Tatu Aalto <aalto...@gmail.com> wrote:
> Hmm, I see exception:
>
> In your example:
> File "C:\XXX\UiSelector.py", line 95
> button2 = frame[1].find_elements(:class,
> 'android.widget.ImageButton')[1]
> ^
> SyntaxError: invalid syntax
>
> When I try this:
> button2 = frame[1].find_elements('class', 'android.widget.ImageButton')[1]
> Traceback (most recent call last):
> File "C:\XXX\UiSelector.py", line 95, in <module>
> button2 = frame[1].find_elements('class',
> 'android.widget.ImageButton')[1]
> File
> "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py",
> line 381, in find_elements
> raise InvalidSelectorException("Invalid locator values passed in")
> selenium.common.exceptions.InvalidSelectorException: Message: 'Invalid
> locator values passed in'
>
> -Tatu

bootstrap online

unread,
Jun 16, 2014, 10:53:55 AM6/16/14
to appium-...@googlegroups.com
I think the proper fix is to attach a unique id to the elements you're
interested in automating.

On Mon, Jun 16, 2014 at 10:43 AM, Tatu Aalto <aalto...@gmail.com> wrote:
> Clicking works but, the problem is in the overflow.
> button2 =
> frame[1].find_elements_by_class_name('android.widget.ImageButton')[6]
> button2.click()
> => Clicks on the correct element.
>
> button2 =
> frame[1].find_elements_by_class_name('android.widget.ImageButton')[6]
> button2.click()
> => Clicks on the wrong element (there seems to be index off bug). It does
> click on LinearLayout[1] sub-elements, it clicks on the LinearLayout[2]
> sub-elements.
>
> button2 = frame[1].find_elements_by_class_name('android.widget.ImageButton')
> print len(button2
> Prints out 8, and there are only 6 ImageButtons in LinearLayout[1]. In xpath
> term //LinearLayout[1]/ImageButton[7] //LinearLayout[1]/ImageButton[8] are
> actually //LinearLayout[2]/ImageButton[1] //LinearLayout[2]/ImageButton[2].
> And because I can not hard code the count of the LinearLayout sub-elements I
> would need to somehow determine the count of the LinearLayout sub-elements.
>
> -Tatu
>
>
>
>
>
> On Mon, Jun 16, 2014 at 5:30 PM, bootstrap online <ma...@bootstraponline.com>
>> You received this message because you are subscribed to a topic in the
>> Google Groups "Appium-discuss" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/appium-discuss/nBzcKBxW71o/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to

Tatu Aalto

unread,
Jun 16, 2014, 4:43:01 PM6/16/14
to bootstrap online, appium-...@googlegroups.com
Ugh

I did find few similar layouts from the ApiDemos-debug.apk, but I am not
able reproduce the problem. Then it must be a problen in my apk and not
in the Appium/Selenium. Really vierd, they should be standart android
elements...

But in anycase, thanks from helping and sorting out the problem. For me
it is back to the drawing board but at least I know where to start digging.

-Tatu
PS: Added user group back to mailing list.
On 16.6.2014 18:26, bootstrap online wrote:
> If you have a way to demonstrate the problem, I will investigate.
> Here's a debug app:
> https://github.com/appium/appium/blob/master/assets/ApiDemos-debug.apk
>
> You could also try on Opera.
> http://ftp.opera.com/pub/opera/android/2100/Opera_21_Generic_Opera_ARMv7_LZMA.apk
>
> On Mon, Jun 16, 2014 at 11:21 AM, Tatu Aalto <aalto...@gmail.com> wrote:
>> Yes that what I had exactly in my mind. But now when I use index, the index
>> overflows to the other element, LinearLayout[2]. And does not raise element
>> not found exception as it should.
>>
>> Is there example program available that could be shared, that has of two (or
>> more) elements that contains other elements inside? I could, most likely,
>> easily demonstrate the problem?
>>
>>
>> On Mon, Jun 16, 2014 at 6:08 PM, bootstrap online <ma...@bootstraponline.com>
>> wrote:
>>> If the contents remain static then it should be possible to locate via
>>> class_name then use an index into the array. If the contents are
>>> changing and there's no unique ids, I'm not sure how you're going to
>>> automate that with any technology.
>>>
>>> On Mon, Jun 16, 2014 at 11:04 AM, Tatu Aalto <aalto...@gmail.com> wrote:
>>>> The uiautomatorviewer xml export from the LinearLayout[1] and
>>>> LinearLayout[2] looks like this:
>>>>
>>>> <node index="2" text=""
>>>> class="android.widget.LinearLayout" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[86,172][384,338]">
>>>> <node NAF="true" index="0" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[86,172][158,228]" />
>>>> <node NAF="true" index="1" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[159,172][231,228]" />
>>>> <node NAF="true" index="2" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[242,172][314,228]" />
>>>> <node index="3" text="-"
>>>> class="android.widget.TextView" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="false" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[86,229][158,281]" />
>>>> <node index="4" text="-"
>>>> class="android.widget.TextView" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="false" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[159,229][231,281]" />
>>>> <node index="5" text="."
>>>> class="android.widget.TextView" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="false" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[232,229][242,281]" />
>>>> <node index="6" text="-"
>>>> class="android.widget.TextView" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="false" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[242,229][314,281]" />
>>>> <node NAF="true" index="7" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[86,282][158,338]" />
>>>> <node NAF="true" index="8" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[159,282][231,338]" />
>>>> <node NAF="true" index="9" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[242,282][314,338]" />
>>>> </node>
>>>> <node index="3" text=""
>>>> class="android.widget.LinearLayout" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[86,430][384,596]">
>>>> <node NAF="true" index="0" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[86,430][158,486]" />
>>>> <node NAF="true" index="1" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[159,430][231,486]" />
>>>> <node NAF="true" index="2" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[242,430][314,486]" />
>>>> <node NAF="true" index="3" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[315,430][387,486]" />
>>>> <node index="4" text="-"
>>>> class="android.widget.TextView" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="false" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[86,487][158,539]" />
>>>> <node index="5" text="-"
>>>> class="android.widget.TextView" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="false" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[159,487][231,539]" />
>>>> <node index="6" text="."
>>>> class="android.widget.TextView" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="false" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[232,487][242,539]" />
>>>> <node index="7" text="-"
>>>> class="android.widget.TextView" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="false" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[242,487][314,539]" />
>>>> <node index="8" text="-"
>>>> class="android.widget.TextView" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="false" enabled="true"
>>>> focusable="false" focused="false" scrollable="false"
>>>> long-clickable="false"
>>>> password="false" selected="false" bounds="[315,487][387,539]" />
>>>> <node NAF="true" index="9" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[86,540][158,596]" />
>>>> <node NAF="true" index="10" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[159,540][231,596]" />
>>>> <node NAF="true" index="11" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[242,540][314,596]" />
>>>> <node NAF="true" index="12" text=""
>>>> class="android.widget.ImageButton" package="XXXXX" content-desc=""
>>>> checkable="false" checked="false" clickable="true" enabled="true"
>>>> focusable="true" focused="false" scrollable="false"
>>>> long-clickable="true"
>>>> password="false" selected="false" bounds="[315,540][387,596]" />
>>>> </node>
>>>>
>>>>
>>>> On Mon, Jun 16, 2014 at 6:01 PM, bootstrap online
>>>> <ma...@bootstraponline.com>
>>>> wrote:
>>>>> I can't tell without the apk. If you use uiautomatorviewer, that'll
>>>>> show the elements.
>>>>>
>>>>> On Mon, Jun 16, 2014 at 10:59 AM, Tatu Aalto <aalto...@gmail.com>
>>>>> wrote:
>>>>>> Yes, in the long term that is what I would do also. But in the short
>>>>>> term I
>>>>>> am not able to do it.
>>>>>>
>>>>>> But can you tell me, is this selenium bug? Because when I run it in
>>>>>> the
>>>>>> debugger, I get lost in the webdriver code and not really say where
>>>>>> the
>>>>>> extra elements come from.
>>>>>>
>>>>>> -Tatu
>>>>>>
>>>>>>
>>>>>> On Mon, Jun 16, 2014 at 5:53 PM, bootstrap online

Tatu Aalto

unread,
Jun 18, 2014, 9:45:38 AM6/18/14
to appium-...@googlegroups.com, ma...@bootstraponline.com
Ugh

Just wanted to inform that I think, that I did found the reason for the bug.

When I use a real device that has Android 4.2.1 installed, there is this index problem with my software.
When I use a real device that has Android 4.2.2 installed all works fine and I do not see any problems with my software.

But again thanks from help and I hope I do not have to deal with this type of problem again.

-Tatu
>>>>>>>>>>>> Visit this group at
>>>>>>>>>>>> http://groups.google.com/group/appium-discuss.
>>>>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> http://appium.io
>>>>>>>>> ---
>>>>>>>>> You received this message because you are subscribed to a topic
>>>>>>>>> in
>>>>>>>>> the
>>>>>>>>> Google Groups "Appium-discuss" group.
>>>>>>>>> To unsubscribe from this topic, visit
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> https://groups.google.com/d/topic/appium-discuss/nBzcKBxW71o/unsubscribe.
>>>>>>>>> To unsubscribe from this group and all its topics, send an email
>>>>>>>>> to
>>>>>>>>>
>>>>>>>>> Visit this group at
>>>>>>>>> http://groups.google.com/group/appium-discuss.
>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>> --
>>>>>>> http://appium.io
>>>>>>> ---
>>>>>>> You received this message because you are subscribed to a topic in
>>>>>>> the
>>>>>>> Google Groups "Appium-discuss" group.
>>>>>>> To unsubscribe from this topic, visit
>>>>>>>
>>>>>>>
>>>>>>> https://groups.google.com/d/topic/appium-discuss/nBzcKBxW71o/unsubscribe.
>>>>>>> To unsubscribe from this group and all its topics, send an email to

bootstrap online

unread,
Jun 18, 2014, 9:56:26 AM6/18/14
to Tatu Aalto, appium-...@googlegroups.com
It's not uncommon for the app under test to change based on the
Android version used.
>> >>>>>>>>>>>> email to appium-discus...@googlegroups.com.
>> >>>>>>>>>>>> Visit this group at
>> >>>>>>>>>>>> http://groups.google.com/group/appium-discuss.
>> >>>>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>> >>>>>>>>>>
>> >>>>>>>>> --
>> >>>>>>>>> http://appium.io
>> >>>>>>>>> ---
>> >>>>>>>>> You received this message because you are subscribed to a topic
>> >>>>>>>>> in
>> >>>>>>>>> the
>> >>>>>>>>> Google Groups "Appium-discuss" group.
>> >>>>>>>>> To unsubscribe from this topic, visit
>> >>>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>> https://groups.google.com/d/topic/appium-discuss/nBzcKBxW71o/unsubscribe.
>> >>>>>>>>> To unsubscribe from this group and all its topics, send an email
>> >>>>>>>>> to
>> >>>>>>>>> appium-discus...@googlegroups.com.
>> >>>>>>>>>
>> >>>>>>>>> Visit this group at
>> >>>>>>>>> http://groups.google.com/group/appium-discuss.
>> >>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>> >>>>>>>>
>> >>>>>>> --
>> >>>>>>> http://appium.io
>> >>>>>>> ---
>> >>>>>>> You received this message because you are subscribed to a topic in
>> >>>>>>> the
>> >>>>>>> Google Groups "Appium-discuss" group.
>> >>>>>>> To unsubscribe from this topic, visit
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> https://groups.google.com/d/topic/appium-discuss/nBzcKBxW71o/unsubscribe.
>> >>>>>>> To unsubscribe from this group and all its topics, send an email
>> >>>>>>> to
>> >>>>>>> appium-discus...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages