Android - issue in controlling builtin app using Robotium - android

I am writing an android testing application which automates testing on the device.
I am targeting facebook as my base application and writing an app using the Robotium framework in order to accomplish my requirement.
Until now i have successfully implemented a few features, but I am stuck at one point: I want to automate the "upload picture" functionality, but as soon as the upload button is clicked, the device builtin application gets activated. I could not control the default app using Robotium.
Is there any way to solve this, by writing some code using robotium or writing a layer between the OS and Robotium which can generate key stokes?

I don't think you can do that. However you might be able to make your own modified version of the built-in application and use that instead (if you can make it default and so not have to go through a selection screen), or root a phone and break its security model to use as an automated testing device.

You said
a layer between the OS and Robotium.
If you were ok with that, there is the black-box UIAutomator-Framework by google, which might be able to do that.
Additionally,
You might want to use monkeyrunner like this:
$ monkeyrunner
>>> from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
>>> device = MonkeyRunner.waitForConnection()
>>> device.touch(200, 400, MonkeyDevice.DOWN_AND_UP)
You can also do a drag, start activies etc. Have a look at the api for
MonkeyDevice.
(from this SO answer).

Related

Is it possible to do automated testing with detox outside of the target application?

I have built a react-native application and am trying to build a few specific end-to-end tests on the android side. For this, I have setup detox. Unfortunately, to test properly, I need to see how the application responds when the user is performing actions outside of the target application.
e.g. I need to automate click A within target application A, click android home button, swipe right on screen and then open application B. Application A should then open itself and the test can confirm if it has opened to the right screen.
Is something like this possible within Detox? If not, are there any frameworks that would allow me to test this?
What you are wanting to do is use something called 'Appium' instead of 'Detox'. This is due to Appium interfacing with the androids uiAutomator API which allows automation and testing outside of a single application, Detox is more for testing the behaviour within the application itself rather than outside of it.

How to execute commands on a 3rd party app using adb commands or something similar

I have a use case which requires an app, not developed by me, to be controlled. I have adb access to the android device. These are the steps that are required to be performed:
Input text in two fields
Press Enter
Select checkboxes
Enter text into another text field
Enter
I know I can use adb input keyevent <event-code> and adb input touchpad tap <x> <y>, but these are brutish methods that won't work every time. I have looked into appium, but it seems to be limited to mobile web applications. Other frameworks like Espresso work, if you've built the app yourself.
I could not find any good answer to this problem. Any help is highly appreciated!
Take a look at UiAutomator.
It will enable you to launch a third-party app and perform any actions you want with it. In order to examine the UI and create the right locators, there's a command-line tool called uiautomatorviewer, bundled along with Android SDK.

Is there a way to check that emulator is controller by monkeyrunner?

I want to put some conditions in my code to behave one way, if it's tested by monkeyrunner and another way, if it's used by a user.
How to check that in tested application that emulator/application is driven by monkeyrunner?
P.S. I am aware that it's bad practice to do such checks (the code under test should be the same code as in production). However, it's for one off case, which is hard to handle other way.
I didn't find a clean way to check that except uploading a file to a Emulator/device as part of MonkeyRunner tests and after checking for it in application source code.

GUI-less programming for Android as if it were an ordinary Linux system

I need to do some menial batch tasks on my phone, and I don't want to jump through all the hoops of making an "app" with a GUI and all that just to do them (the tasks are of the type you'd hack together in BASH in five minutes on a sane system). I can't seem to find any place on the net that explains how to simply make an ordinary program (in any language, but Java is OK if that eases interaction with Android) with access to the Android API that can simply be run by SSHing into the phone and running it as a normal process. No need for an APK package, no need for a GUI, no nothing. This should be the simplest thing in the world, but every example out there seems to be first and foremost concerned with making a GUI and working with Eclipse and the SDK instead of doing the basics first.
Any tips?
(I know this is probably borderline SuperUser, but then again, there's a programming question at the bottom: How do you make an ordinary (Java) program that can be run from the terminal on an Android phone and still use the API?)
Here : Running a shell script on android device using adb
and : https://play.google.com/store/apps/details?id=stericson.busybox&hl=en
and : http://forum.xda-developers.com/showthread.php?t=537827
and : http://strawp.net/archive/recipe-for-a-decent-bash-shell-in-android/
and : http://digitaldumptruck.jotabout.com/?p=938
I can't seem to find any place on the net that explains how to simply make an ordinary program (in any language, but Java is OK if that eases interaction with Android) with access to the Android API that can simply be run by SSHing into the phone and running it as a normal process.
That's because it's not especially important to the bulk of Android users or developers.
How do you make an ordinary (Java) program that can be run from the terminal on an Android phone and still use the API?
You are welcome to use the Scripting Layer for Android to write some scripts, but you have limited access to the Android SDK, and they cannot "simply be run by SSHing into the phone". This is supported by the SL4A team.
You are welcome to experiment with the dalvikvm command, though off the top of my head I do not recall whether or not it is available on production devices, and I do not know if it can "simply be run by SSHing into the phone". And, bear in mind that using this is completely unsupported.
You are welcome to write your own C/C++ code for ARM (or whatever CPU architecture your device runs). This "simply be run by SSHing into the phone" but has no access to the Android SDK.
I still cannot believe that that kind of stuff isn't on the first page of every Android development introduction out there.
There are over 200 million users of Android devices. What percentage of those users do you think want to
"make an ordinary program... with access to the Android API that can simply be run by SSHing into the phone and running it as a normal process"? 0.01%? 0.001%? My money is on 0.0001%.
The "first page of every Android development introduction out there" should be focused on stuff that matters to closer to 100% of the user base. You, of course, are welcome to build up your own site focused on this sort of thing, to cater to those users who are interested in creating these sorts of programs.
From http://git-annex.branchable.com/design/assistant/blog/day_184__just_wanna_run_something/:
While I already have Android "hello world" executables to try, I have
not yet been able to run them. Can't seem to find a directory I can
write to on the Asus Transformer, with a filesystem that supports the
+x bit. Do you really have to root Android just to run simple binaries? I'm crying inside.
It seems that the blessed Android NDK way would involve making a Java
app, that pulls in a shared library that contains the native code. For
haskell, the library will need to contain a C shim that, probably,
calls an entry point to the Haskell runtime system. Once running, it
can use the FFI to communicate back to the Java side, probably. The
good news is that CJ van den Berg, who already saved my bacon once by
developing ghc-android, tells me he's hard at work on that very thing.
and some specific advices in the comments below:
See http://kevinboone.net/android_nonroot.html for info on where in
the android filesystem you have write, exec ability.
Basically you have these abilities in /data/local from adb shell (and
in debuggable app's folders using run-as with adb shell), and in
/data/data// for each app (for example the terminal emulator's
data dir when using the terminal emulator).
...
http://git-annex.branchable.com/design/assistant/blog/day_185__android_liftoff/:
Thanks to hhm, who pointed me at KBOX, I have verified that I can
build haskell programs that work on Android.
http://kevinboone.net/kbox.html:
KBOX [...] gives you the terminal emulator, a
decent set of Linux utilities (supplied by busybox), ssh and rsync
clients and servers, and a few other things. In addition, there are a
number of add-on packages for expanded functionality.
Well, it's just about running an executable on Android, and not about writing an executable that would access Android API...
I can't seem to find any place on the net that explains how to simply make an ordinary program [...] with access to the Android API that can simply be run by SSHing into the phone and running it as a normal process.
An answer, translated from a note by vitus-wagner:
Termux is an advanced terminal emulator plus lots of Unix-like software with command-line interface (in packages managed by APT). Actually, not only CLI (command-line), but also GUI as well (though the GUI software not tried yet).
Unlike the way of the various popular "linux deploy" (which make something like a container, at least a chroot, with things installed into directories according to the traditional filesystem hierarchy), Termux seems to aim at integrating into the host system. For this purpose, it has a plugin, Termux:api which is able to do a lot of interaction with the system: open a file in a native Android app, send an sms, take a picture with the camera, or even say something by means of the system TTS engine.
There are many more addons -- see wiki.
(A side note. An integration like that could be expected--if not from MSYS--from GnuWin32, but there is nothing close to Termux under Windows w.r.t. the degree of integration.
However, for some strange reason, people are asking much more about how to make it more "Linux-like" on the forum, rather than how to use it effectively to solve smartphone-specific tasks...)
A toolkit for cross-compilation is available, so that one can try to package his favorite software.
Actually, it is able to do compilation locally on the device, but it seems not to be able to make a package locally.
Some things to know:
One needs Hacker's keyboard or something similar. One can't live here without Esc, Tab, Control. Or one could try to learn the Touch Keyboard.
vim ran with an encoding different from utf-8, and the Russian letters were displayed incorrectly. So, set encoding=utf-8 had to be written in .vimrc.
ssh to another computer at home couldn't login. The reason was simple: it used the username u0_a95 instead of one's usual username. (One can write User your_username in .ssh/config to permanently "fix" it.)
I'd recommend doing a research on XDA-Developers board

Android Usability Testing Setup (ddms, screenshots, touchevent)

im thinking of an easy-to-use android usability testing tool, that will allow the user to record and log relevant information during app testing. As a first result i would like to have a screenshot taken each time the user interacts with the touchscreens where the position, duration and type of the touch event is shown.
As android does not allow me to take screenshots easily and as its not possible to log touchevents from an service here are my questions:
Does Logcat give me any information about TouchEvents (I tried but i couldt produce any touch-Logs)
Is it possible to evoke the ddms-Screenshot-action from terminal? (./ddms -takescreenshot)
Does Logcat give me any information about TouchEvents (I tried but i couldt produce any touch-Logs)
No.
Is it possible to evoke the ddms-Screenshot-action from terminal? (./ddms -takescreenshot)
Not via the ddms command AFAIK. Either use monkeyrunner (as another answer suggested), or write your own code to the JAR file that DDMS uses. I used that to create a software projector; another developer extended that concept.
If you are looking to automate these things, you can use the Monkey Runner tool, it specifically has a call to take screen shots automatically.
http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html
It specifically runs Python scripts, that you would use to design an automated regression test.

Categories

Resources