Using espresso, webClick() a dropdown list in webview? - android-testing

Our app is kind of a hybrid app. In the webview part of the app, I am trying to find and click the dropdown list.
The element is found and clicked but the click does not really happen. I do not see any errors, which means the click is happening just in the wrong place. I have tried various different combinations of css selectors. They all pass but it doesnt seem to be clicking in the right place.
Anyone know if there are issues with webClick() for dropdown lists?
public void clickNextOnDomainScreen() throws InterruptedException {
onWebView()
.withElement(findElement(Locator.CSS_SELECTOR, "fieldset > form#userStoreForm.form-userStore > div.clearfix > div.login-field > select#userStoreDomain.login-select"))
.perform(webClick());
}

You can try this
onWebView(Matchers.allOf(isDisplayed(), isJavascriptEnabled()))
.withElement(findElement(Locator.XPATH, "//option[#value='01']"))
.perform(webClick());
it's work fine for me

Related

Javascript void(0)

I came across this piece of code in a website I was asked to help with.
`
<script>
function removeLinks(links) {
if (!arguments[0]) return;
var a = arguments[0];
$(".WaGadgetMenuHorizontal a:not(.wa-authenticateLoginLink), .WaGadgetMenuVertical a:not(.wa-authenticateLoginLink),.WaGadgetMobilePanel a:not(.wa-authenticateLoginLink)").each(function() {
var curhref=$(this).attr('href').split("/")[3];
if (
(typeof(a)=='string' && a==curhref)||
(typeof(a)=='object' && ($.inArray(curhref, a)>-1))
) {
$(this).attr("href", "javascript:void(0)").css("cursor","context-menu");
}
});
}
removeLinks("Philanthropy");
</script>`
This makes the Philanthropy link unclickable but there are 2 issues to be resolved.
Clicking the Philanthropy link shows the words Javascript:void(0) in the bottom left of the screen
Clicking the Philanthropy link takes you to whatever page you were on previously which is confusing to users, especially on the mobile version of the website where you simply jump from the click on the link to whatever previous page you were on. AT least on the PC you are still on the link with the previous page in the background so to speak.
Is there a way to remove the message that shows at the bottom left of the screen and to click on the link and stay on the link unless you click away to another link?
I tried to modify the code with different things that I found online but nothing seems to work

Selenium code to click/tap on a link, which opens a new tab on ipad/iphone

I have been trying to click/tap on a link using selenium, which opens a new tab on ipad/iphone. The test, I have written is working fine on desktop but it is not clicking the element, when it runs on ipad/iphone (saucelab). The step, which clicks the element is Passed (no error) but the click is not happened and there is only one window handle (parent) available. When I try to click on the element manually (on saucelab as well on physical device), it works fine & the new tab opens. Tried with different locators & all identifies the element correctly. Tried with different methods like javascript, actions, TouchActions, long press & release and even send keys. I observed the same behavior in other sites as well.
It seems like a generic issue. Please help me to fix this.
Similar scenario: Verify clicking on the link 'Google’s Terms of Service' on page "https://www.google.com/gmail/about/policy/" opens a new tab.
code segment
driverThread.get().get("https://www.google.com/gmail/about/policy/");
String parentHandle = driverThread.get().getWindowHandle();
System.out.println("Parent Handle --- " + parentHandle);
WebElement element = driverThread.get().findElement(By.cssSelector("body > main > section > section > div > p:nth-child(2) > a"));
element.click(); // **please help me to click/tap this element**
String newHandle = null;
System.out.println("Window Handles size --- " + driverThread.get().getWindowHandles().size());
for (String handle : driverThread.get().getWindowHandles()) {
System.out.println("Handle --- " + handle);
if(!handle.equalsIgnoreCase(parentHandle))
newHandle = handle;
}
driverThread.get().switchTo().window(newHandle);
System.out.println("New Tab URL --- "+ driverThread.get().getCurrentUrl());
You can use this code for clicking on the link :
WebElement element = driverThread.get().findElement(By.linkText("Google’s Terms of Service"));
element.click();
try out this code ! hope this will help you resolve your issue.

Text URL in AIR iOS app not selectable

I'm using AIR 2.0 (soon will be updating to 3.3 with Flash CS6) to create an iPad app. We have textfields (Classic, dynamic) which sometimes contain one or multiple htmlText links which need to be clickable. In the desktop version of the program, all text is selectable and the links are easily accessed. My problem is that it takes me mashing the link like 20 times on the iPad before it will recognize that there's a link and navigate to it in Safari. The other strange thing is that none of the text appears to be selectable - I can't get the iPad cursor, copy/paste menu, etc. to show up.
I think, from reading other threads, that the hit area for the URL is only the stroke on the text itself... if that's true, what can I do to increase the hit area? Or make text selectable? It was suggested elsewhere to put movieclips behind the URLs but that's not really possible as this is all dynamic text from XML files.
I've read about StageText but I gather this is only used for input fields, which is not the case here.
I'm reasonably advanced in AS3 but I'd prefer an easy solution over re-writing large chunks of code. At the moment the only thing I can think to do is get the URL and make it so that as soon as you touch anywhere on the textfield, it navigates to the link. But this would break down if there were more than 1 URL in a given textfield.
Any ideas?
I had this exact same issue, and it's had me flummoxed for a while.
Here's what I did to get the desired behaviour:
1) Instead of using a listener for TextEvent.LINK, listen for MouseEvent.CLICK (or TouchEvent.TAP) on the TextField.
eg.
var tf:TextField = new TextField();
tf.addEventListener(MouseEvent.CLICK, linkClicked);
2) In the linkClicked() handler, you use getCharIndexAtPoint() to determine the index of the character that was clicked, and then from that determine the URL from the TextFormat of the character. This is adapted from a post by Colin Holgate on the Adobe Forums (http://forums.adobe.com/thread/231754)
public function linkClicked(e:MouseEvent):void {
var idx:int = e.target.getCharIndexAtPoint(e.localX, e.localY);
trace("Tapped:",idx);
var tf:TextFormat = e.target.getTextFormat(idx);
if(tf.url != "" && tf.url != null) {
var linkURL:String = tf.url;
trace(linkURL);
// Hyperlink processing code here
dispatchEvent(new UIEvent(UIEvent.LINK_TAPPED,tf.url));
}
}
3) The last line (dispatchEvent()) is sending a custom event to another function to process the link, but you could easily inline your code here.
I've tested on an iPad 3 running iOS6.1, building with AIR3.5. Links are much more responsive, and I don't find myself mashing the screen trying to hit the stroke of the text!

Editing a BrowserField's History

I have a BrowserField in my app, which works great. It intercept NavigationRequests to links on my website which go to external sites, and brings up a new windows to display those in the regular Browser, which also works great.
The problem I have is that if a user clicks a link to say "www.google.com", my app opens that up in a new browser, but also logs it into the BrowserHistory. So if they click back, away from google, they arrive back at my app, but then if they hit back again, the BrowserHistory would land them on the same page they were on (Because going back from Google doesn't move back in the history) I've tried to find a way to edit the BrowserField's BrowserHistory, but this doesn't seem possible. Short of creating my own class for logging the browsing history, is there anything I can do?
If I didn't do a good job explaining the problem, don't hesitate for clarification.
Thanks
One possible solution to this problem would be to keep track of the last inner URL visited before the current NavigationRequest URL. You could then check to see whether the link clicked is an outside link, as you already do, and if it is call this method:
updateHistory(String url, boolean isRedirect)
with the last URL before the outside link. Using your example this should overwrite "www.google.com" with the last inner URL before the outside link was clicked.
Here is some half pseudocode/half Java to illustrate my solution:
BrowserFieldHistory history = browserField.getHistory():
String lastInnerURL = "";
if navigationRequest is an outside link {
history.updateHistory(lastInnerURL, true);
// Handle loading of outer website
} else {
lastInnerURL = navigationRequest;
// Visit inner navigation request as normal
}
http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/browser/field2/BrowserFieldHistory.html#updateHistory(java.lang.String, boolean)
I had a similar but a little bit different issue. Special links in html content like device:smth are used to open barcode scanner, logout etc and I wanted them not to be saved in BrowserFieldHistory. I found in WebWork source code interesting workaround for that. All that you need is throw exception at the end like below:
public void handleNavigationRequest( BrowserFieldRequest request ) throws Exception {
if scheme equals to device {
// perform logout, open barcode scanner, etc
throw new Exception(); // this exception prevent saving history
} else {
// standard behavior
}
}

ie9: annoying pops-up while debugging: "Error: '__flash__removeCallback' is undefined"

I am working on a asp.net mvc site that uses facebook social widgets. Whenever I launch the debugger (ie9 is the browser) I get many error popups with: Error: '__flash__removeCallback' is undefined.
To verify that my code was not responsible I just created a brand new asp.net mvc site and hit F5.
If you navigate to this url: http://developers.facebook.com/docs/guides/web/#plugins you will see the pop-ups appearing.
When using other browsers the pop-up does not appear.
I had been using the latest ie9 beta before updating to ie9 RTM yesterday and had not run into this issue.
As you can imagine it is extremely annoying...
How can I stop those popups?
Can someone else reproduce this?
Thank you!
I can't seem to solve this either, but I can at least hide it for my users:
$('#video iframe').attr('src', '').hide();
try {
$('#video').remove();
} catch(ex) {}
The first line prevents the issue from screwing up the page; the second eats the error when jquery removes it from the DOM explicitly. In my case I was replacing the HTML of a container several parents above this tag and exposing this exception to the user until this fix.
I'm answering this as this drove me up the wall today.
It's caused by flash, usually when you haven't put a unique id on your embed object so it selects the wrong element.
The quickest (and best) way to solve this is to just:
add a UNIQUE id to your embed/object
Now this doesn't always seem to solve it, I had one site where it just would not go away no matter what elements I set the id on (I suspect it was the video player I was asked to use by the client).
This javascript code (using jQuery's on document load, replace with your favourite alternative) will get rid of it. Now this obviously won't remove the callback on certain elements. They must want to remove it for a reason, perhaps it will lead to a gradual memory leak on your site in javascript, but it's probably trivial.
this is a secondary (and non-optimal) solution
$(function () {
setTimeout(function () {
if (typeof __flash__removeCallback != "undefined") {
__flash__removeCallback = __flash__removeCallback__replace;
} else {
setTimeout(arguments.callee, 50);
}
}, 50);
});
function __flash__removeCallback__replace(instance, name) {
if(instance != null)
instance[name] = null;
}
I got the solution.
try {
ytplayer.getIframe().src='';
} catch(ex) {
}
It's been over a months since I last needed to debug the project.
Facebook has now fixed this issue. The annoying pop-up no longer shows up.
I have not changed anything.

Resources