Expresso testing on webview with href - android

I am trying to write some instrumentation tests on an Android application which has a webview with some contents in href tag.
The following is the snippet of the webview.
<table width="90%" class="welcome">
<tr>
<td><a href="/demo/TransactionFree"><img
src="/demo/pen.png" width="80" /><br /></a><b> Text <br></td>
<td><a href="/demo/Transaction"><img
src="/portaldemo/pen.png" width="80" /><br /></a>Text Twor</b><br> <br></td>
</table>
I want to click on the first item. So I wrote the following test in Expresso.
onWebView().withElement(findElement(Locator.CSS_SELECTOR, "a[href='*TransactionFree']")).perform(DriverAtoms.webClick());
It is working on newer phones with Android, but fails on low end phones like Samsung S3. It fails to find the element.
How can I fix it ?

Finally figured it out how to do it. Open the html page in the chrome browser -> right click on the particular element to be clicked on -> inspect element -> copy XPath
Will get something like this /html/body/div/div/div[2]/div/table[1]/tbody/tr/td[1]/a/img
Just change the expresso command to
onWebView().withElement(findElement(Locator.XPATH, "/html/body/div/div/div[2]/div/table[1]/tbody/tr/td[1]/a/img")).perform(webClick());
It should be clicking on that specific element.

Related

Android Robotium solo - how to access WebElements contained in an IFRAME?

Scenario:
I'm using Android Robotium Solo (v5.6.3) to automate web page interactions within my app. I need to automate data entry into INPUT fields that are contained within an IFRAME but I do not have much luck!
The Problem:
When I attempt to use, for example, solo.waitForWebElement(By.id("room-number", 5000, true) and solo.typeTextInWebElement(By.id("room-number", "101"), solo is unable to locate the element.
The discussion on this related issue "Accessing an iFrame inside a WebView #794" (https://github.com/RobotiumTech/robotium/issues/794), suggests that it's possible to use "solo.getConfig().webFrame = XXX" to focus solo on the content of a specific IFRAME and then access the WebElements. Unfortunately, I've not been able to get it to work and haven't been able to find any full examples. I assume XXX might need to be the "id" of the IFRAME but in my scenario (where I don't have control of the source code for the web pages being automated) the IFRAME tag has no id assigned.
I've created a simple example test scenario:
index.html - the main page that hosts the IFRAME
<html>
<body bgcolor="#AA3333">
<div id="wrapper">
<iframe src="embed.html" width="100%" height="100%" frameborder="0"></iframe>
</div>
</body>
</html>
embed.html - the source for the IFRAME that contains the INPUT element.
<html>
<body bgcolor="#3333AA">
<div id="page-container" style="height:100vh; width:100%;">
<label>Room Number</label>
<input type="text" name="ROOM_NUMBER" id="room-number">
</div>
</body>
</html>
After reviewing the source code for Robotium in more detail I confirmed that using
solo.getConfig().webFrame = ['id' of IFRAME as a String]
allows subsequent calls to solo.typeTextInWebElement etc. to work OK as expected.
The trick in my scenario is that the parent page assigned no id to the IFRAME so I programatically assign one at runtime using the following javascript
document.getElementsByTagName("iframe")[0].id = "test";
and then use
solo.getConfig().webFrame = "test"

Input date placeholder dont show in android browser

as the title in my question.
I have this simple script
<input type="date" aria-label="Check Out" class="form-control contact-form hidden-sm hidden-xs" id="b-checkout" placeholder="<?php date('d-m-Y') ?>" />
In Dekstop version is working well, and than I use mobile view in inspect element also working well.
But when I test with android browser, the placeholder dont show for the first time, but after I chose the date, the place holder will appear.
what I have done is I add this css script
input[type="date"]::before {
content: attr(placeholder);
width:100%;
}
But after I test in android browser, the placeholder will be 2 content after I select diferent date, see the image.
and than I make some changes in input date
<input onfocus="this.placeholder = ''" type="date" type="date" aria-label="Check In" class="form-control date-mobile hidden-lg hidden-md" id="b-checkin2" placeholder="<?php date('d-m-Y') ?>" />
In android browser it working well, but in mobile view in inspect element, the place holder dont show after I select the date, see the image
and make some changes again
<input onfocus="this.placeholder = ''" onchange="this.placeholder= this.value" type="date" type="date" aria-label="Check In" class="form-control date-mobile hidden-lg hidden-md" id="b-checkin2" placeholder="<?php date('d-m-Y') ?>" />
but after I test in android browser is error, see the image
i think tht's because you specify that you won't display this element if the size of the screen is small or medium ...
...hidden-lg hidden-md....
If you remove it it should display well.

Why does Chrome not show up the default value to 'input type="date"' on mobile?

I'm just making a site for study proposes...
When I'm on desktop, the input type="date" shows up a default value with the letters dd/mm/aaaa...
on desktop
But when I'm on my mobile (Android), the input type="date" shows an empty field...
on mobile Android
The code is (I'm using Bootstrap 3):
...
<div>
<input type="date" class="form-control" id="data" name="data" style="width:65%;" required>
</div>
...
I tried placeholder="dd/mm/aaaa" too... But without success...
Why is this happening?
Could someone help me please?
Thanks in advance!
Android WebKit 4 is such a mess that it needs its own, private compatibility table for some types. 
Although the implementations of <input type="date" > are different across the various mobile OS platforms, support is quite widespread, with the exception of the stock Android browser.
For this browser and for low-end devices a simple text field will be displayed. This is not very user-friendly for date input.
As you are using bootstrap I reccomend going through : this
EDIT :
I found an interesting way of solving this issue :
A tool called Modernizr tells you what HTML, CSS and JavaScript features the user’s browser has to offer. Using that you can try the following which shows how you can use the native datepicker when available, and fallback to jQuery UI’s picker in unsupported browsers(in this case : Chrome -> Android Webkit).
if (!Modernizr.inputtypes.date) {
$('input[type=date]').datepicker({
// Consistent format with the HTML5 picker
dateFormat: 'yy-mm-dd'
});
}
Your complete code will look like this :
HTML:
<input type="date">
<br><br>
<input type="text" id="myDate" />
JAVASCRIPT:
$(function() {
if (!Modernizr.inputtypes['date']) {
$('input[type=date]').datepicker();
}
});

label click event not working with Check box jquery in some android OS

Here is a Html page where i am using jquery and css with phonegap and implementing the UI , However this code is correctly working on webkit of Andorid OS 4.x version while the check while the function is not getting called in Label named changePageTermUse() in Android 2.3 device , i e clicking on label text refresh the checkbox only , while the same logic works on android 4.x devices , Whether I am doing something wrong or do i need to implement other way for android old version of OS like 2.3 .. etc
For Reference I am attaching the image at the end
<div class="chkbox-large-text">
<label>
<input name="checkbox-0 " type="checkbox" data-iconpos="left" id="Chkterms" />
I accept the <a style="text-decoration:underline;" onclick="changePageTermUse()">Terms of Use</a>.
</label>
</div>
JS
function changePageTermUse() {
$.mobile.changePage( "#terms-of-service", {transition: "none"});
}
Term of Use label text has click event that is working in Android 4.x but not working in 2.3 OS Any suggestion will be appreciated
give the same values of label for and id of checkbox
<label for="aa">
<input type="checkbox" id="aa">
A few days ago I had a Problem with no response on a click Event on Android. But it worked on iOS. I found out, that the Parent div had no height. Always check this...

Input error with keyboard on Galaxy S2 using jQuery Mobile and Phonegap

We are developing a mobile web app in jQuery Mobile 1.0.1 and Phonegap 1.4.1 and have run into issues with the keyboard on the galaxy s2.
We have a menu which slides out and contains a search input:
<input type="search" placeholder="Search..." name="search" id="menu_search" data-role="none" />
When we tap in the input so that it gains focus, the keyboard opens but does not allow us to type anything in. I guess a clue here is that its giving us a regular text keyboard and not the search keyboard (which has a magnifying glass as the enter key)
If we focus the input when the menu opens: $("#menu_search").focus() - The search keyboard is open when the menu displays and we are able to search BUT as soon as we tap in the input the keyboard changes to a regular keyboard and we a not able to type anything.
Another clue is that while typing in the keyboard the auto-predict works but when tapping on the correct option only a space is added to the input and none of the other characters.
We have tried a bunch of other attribues on the search input to no avail:
<input type="search" placeholder="Search..." name="search" id="menu_search" value="" data-role="none" autocomplete="off" autocorrect="off" autocapitalization="off" role="textbox" aria-autocomplete="list" aria-haspopup="true" style="-webkit-appearance:searchfield;" class="ui-autocomplete-input" />
This all works fine on a HTC Desire running 2.2 and a desire running CM7 (Android 2.3.7)
We even tried changing the input to a textarea but this did pretty much the same thing :(
I also tried:
$("#menu_search").live('focus',function(event){
event.preventDefault();
});
to see if that would prevent it from changing keyboards but no luck either.
We do however have another search input elsewhere in the app which works fine, the only difference being that the other search is in a "propper" page: data-role="page" and the menu is outside of all of the other pages and in its own just set to hidden initially.
Please help, im crying blood atm!
You probably have
-webkit-user-select: none;
In your CSS somewhere. If you enable text selection for inputs
input, textarea { -webkit-user-select: text; }
it works again!
Did you try adding data-native-menu="false" attribute to your search input tag.
If you're still stuck on this, try updating to phonegap 2.0. It fixes some input problems.
$('#pageid').live('pageshow', function(event, ui) {
$(this).delegate('input[data-type="search"]', 'keyup', function () {
if($(this).val().length != 0)
keyword = $(this).val();
});
});
i'v create an app using phonegap + jequery you look for it in playStore "AssignmentReminder" or type in the search field koshWTF.
anyway. i'd encouraged this issue before and haven't fixed it as i guess its 4.0.1 issue not the phone gap nor jquery mobile , because i still can type under 4.0.4 and lesser. hope you find the answer for it because i did search aloot last time and couldn't find it.
I have/had the same issue on my Note II running 4.1.1 rooted using Phonegap 2.6.0 (though I can also replicate it in 2.5.0), jQuery Mobile 1.2.0, and jQuery 1.7.2. My keyboard is SwiftKey 4.0.1.128.
Except rather than just one input causing me issues, my form has multiple inputs that eventually cause me trouble. It's a real headache because it's hard to replicate - the input always works at first, but if you switch between inputs randomly and long enough, it eventually stops working at a random time.
This error used to happen fairly quickly, so that it would make it a pretty significant issue considering I would have to restart the app to get the form working again, which would eventually stop working yet again. My new form structure seems to work well; the error occurs after literally minutes of typing long strings and randomly switching inputs, which I assume no user will be doing; but it still upsets me that the error is there.
I tried to get help on this error on the jQuery Mobile forum, but they gave me some snarky comment about how it's likely just my element ID usage, because apparently 99% (probably not even realistic) of JQM errors are from incorrect ID usage. I know for a fact my IDs are all unique across every page, but they insist it's an ID error without even trying to correctly diagnose the issue, but I digress.
I should also note that I found the CSS solution that was provided in another answer in many other similar issues across the web, but not this exact issue; while I understand its usage, the CSS did not fix the issue for me.
My form is dynamically loaded into a data-role="content" DIV inside of a data-role="page" DIV, so:
<div data-role="page">
<div data-role="content" id="my-form-holder">
</div>
</div>
I've found the best form structure, at least in my application, to cause the error least frequently is:
<form id="account-add" action="add-edit-account.php" method="post" data-ajax="false" autocomplete="off">
<div data-role="fieldcontain" class="ui-hide-label">
<label for="custom-name">
</label>
<input name="custom-name" placeholder="Account Name" value="Service Name Here" type="text"><br>
<label for="custom-1">
</label>
<input name="custom-1" placeholder="User ID" type="text"><br>
<label for="custom-2">
</label>
<input name="custom-2" placeholder="Password" type="password"><br>
<input type="hidden" name="action" value="add-2">
<input type="hidden" name="newserviceid" value="3">
<input type="hidden" name="userid" value="1">
<input id="account-add-submit" type="submit" name="account-add-submit" value="Add Account">
</div>
</form>
The form HTML is fetched via AJAX and loaded into the DIV by:
$(ajaxData).appendTo("#my-form-holder").trigger("create");
Naturally, your form will be a bit different, and you may not even have a form since you just have a search input (getting to that in a moment). But if you do have a form, that's what works best for me.
Since you're in Phonegap, you may not even need an action theoretically since you likely have jQuery to handle the input, but jQuery Mobile docs state forms must have action and method attributes, so I didn't want to go against that. Also, jQuery Mobile usually has a data-role="field-contain" DIV around each label/input group, but I found that the error occurred sooner if I did this. Again, the error occurs at an arbitrary moment that is never the same, so I don't know if it's directly related to the DIV.
I also have an input hard-coded into another page:
<div data-role="fieldcontain" class="ui-hide-label">
<label for="service-search-input">
</label>
<input name="service-search-input" id="service-search-input" placeholder="Enter a service to search for" type="search">
</div>
This seems to work fine. However, there are no other inputs to switch to, so the best I can do to try to replicate the error is focus/unfocus the input by tapping elsewhere on the page. Though, I am always able to type initially whereas your error doesn't let you type at all if I understand correctly. You may want to try that HTML structure and see if it works. There is no form tag surrounding that input.
Our issues are a little different (I have most of my issues with a dynamically injected form whereas yours is hard-coded from what I gather), but this is the only page I could find anywhere that directly addresses this exact issue, so hopefully this helps and we can get some further insight on this issue.

Categories

Resources