Some useful information for Android and IOS testing

This basic information wrote down in this post is maybe unneeded and not necessary for most of users, but just remember, when you got the first Android/IOS device and need to setup something. So the information below is a basic testing startup guide.
First important thing is to check your Android or IOS device system version. The possibilities are different for Android or IOS systems and the application settings are depending of the OS versions. It is very important to the developers to have the information, which device was used for testing and which characteristics they have.

Local test run – Maven – NoSuchMethodError during driver creation

When you are getting the following exception during firefoxdriver initialization:

java.lang.NoSuchMethodError: org.openqa.selenium.Proxy.extractFrom(Lorg/openqa/selenium/Capabilities;)Lorg/openqa/selenium/Proxy;
        at org.openqa.selenium.firefox.FirefoxDriver.dropCapabilities(FirefoxDriver.java:313)
        at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:191)
        at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:186)
        at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:103)
        at test.java.com.ch.forsight.main.TestBase.getLocalDriver(TestBase.java:85)
        at test.java.com.ch.forsight.main.TestBase.createDrivers(TestBase.java:72)  

try to put this dependency into pom.xml:

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-firefox-driver</artifactId>
            <version>2.43.1</version>
        </dependency>

If you still getting the same exception you should try to experiment with the order of the imports.
Sometimes small order changes can make the project work again, who knows which one depends on an old utility…

How to avoid App Store rejection

If you are iOS developer, I’m sure that you have heard several stories (or experienced yourself) of how difficult can be to get Apple’s approval for your app. Why does Apple reject apps or what are the big mistakes that most developers make?
I have searched for the reasons and in this post I will give you a little guide what must to be observed to avoid app rejection.
First of all you have to read the “App Store Review Guidelines”. Here you can find every important information what is needed during the development/app building. The list is very long, so it is hard to remember every point from this list, and this was the main reason why has Apple created a page and explain which rules are broken the most often.

Simple and advanced usage of LoadableComponent

We all know that the navigation between pages is sometimes painful, and we need to write a lot lines of code to get to the right place. Using LoadableComponent is a better way to manage your navigation, especially if you need to go through welcome pages, login pages etc. in every single case of test. As simple as possible you just need to extend your Page Object classes with “LoadableComponent< T >” like this:

public class WelcomePage extends LoadableComponent<WelcomePage>

You need to override two methods:

@Override
	protected void isLoaded() throws Error{}

@Override
	protected void load() {}

Page Object pattern and Page Factory

As a developer of automated tests for web pages one always has to deal with often changes on a site. This also means constant changes in test cases too. The developers’ main goal is to make as high quality code as possible with the least investment. This is also true for tests changes. Both goals can be reached with using the correct tool. The Page Object pattern hand in hand with Page Factory could provide a healthy code and maintainable tests.
Page Object is one of the most popular patterns which is used for developing automated web test. It maps the pages to objects which contains all the required data and functions that help the developer to test the site. The fields contain all the information what is needed and the methods do all the job to navigate in pages, fill the inputs or click the buttons.
Web driver provides more way to grab the element from the site. All of them are based on search in DOM tree of the webpage based on locators. The locators are strings that describe the position of the required web element. It can be located based on its name, id or src attributes or any custom conditions like CSS or Xpath selector. Let’s take a look for an example. The test case is really simple. Log in to Gmail and check the title of the next site. If the page title contains word Inbox, it’s done. Otherwise something went wrong.

How to read text from PDF file using Java and Selenium Webdriver

Sometimes we need to verify a PDF content but Selenium WebDriver doesn’t have any direct methods to do that.
If we want to extract the PDF content then we can use for example Apache PDFBox.
Simply download the .jar files and add them to your Eclipse Class path.
Here is a sample script which will extract text from a sample PDF file:

How to test different resolutions – Part two – Firefox resolutions testing

Continuing from the last months Chrome resolution testing, we are going to test tools from Firefox. None of the tools listed simulate mobile devices. So for mobile testing the mobile web address will have to be manually used, as the browser won’t be recognized as a mobile device. Unfortunately this will not work with every site, and even on sites that work, some pages may not be displayed correctly.

FireSizer

This add-on uses the Add-on bar at the bottom of the Firefox window. Unfortunately this feature was removed in Firefox version 29+, so an additional add-on is required to make it work (https://addons.mozilla.org/en-US/firefox/addon/the-addon-bar/). After installing the add-on bar it will appear at the bottom of the screen, from where the FireSizer can be used. The FireSizer will be located in the bottom right of the screen. It will show only as the current window resolution, right clicking the displayed resolution shows additional options. You can select from existing presets, or add you own. You can also save the current window size. This add-on doesn’t resize only the HTML area (viewport), but takes into account window borders, top/bottom status bars, menus, navigation buttons, etc. This isn’t so good for mobile testing, but makes more sense for desktop testing.

Random encounter #01

If you see the code below, then you probably copied the wrong url to your browser, try to remove /wd/hub from its end.
Eg.: instead of localhost:4444/wd/hub try just localhost:4444

{"status":13,"value":{"class":"java.lang.NullPointerException","stackTrace":
[{"fileName":"ExternalSessionKey.java","lineNumber":75,"className":"org.openqa.grid.internal.ExternalSessionKey","methodName":"fromWebDriverRequest"},
{"fileName":"WebDriverRequest.java","lineNumber":60,"className":"org.openqa.grid.web.servlet.handler.WebDriverRequest","methodName":"extractSession"},
{"fileName":"RequestHandler.java","lineNumber":237,"className":"org.openqa.grid.web.servlet.handler.RequestHandler","methodName":"getSession"},
{"fileName":"RequestHandler.java","lineNumber":119,"className":"org.openqa.grid.web.servlet.handler.RequestHandler","methodName":"process"},
{"fileName":"DriverServlet.java","lineNumber":83,"className":"org.openqa.grid.web.servlet.DriverServlet","methodName":"process"},
{"fileName":"DriverServlet.java","lineNumber":61,"className":"org.openqa.grid.web.servlet.DriverServlet","methodName":"doGet"},
{"fileName":"HttpServlet.java","lineNumber":707,"className":"javax.servlet.http.HttpServlet","methodName":"service"},
{"fileName":"HttpServlet.java","lineNumber":820,"className":"javax.servlet.http.HttpServlet","methodName":"service"},
{"fileName":"ServletHolder.java","lineNumber":565,"className":"org.seleniumhq.jetty7.servlet.ServletHolder","methodName":"handle"},
{"fileName":"ServletHandler.java","lineNumber":479,"className":"org.seleniumhq.jetty7.servlet.ServletHandler","methodName":"doHandle"},
{"fileName":"SessionHandler.java","lineNumber":225,"className":"org.seleniumhq.jetty7.server.session.SessionHandler","methodName":"doHandle"},
{"fileName":"ContextHandler.java","lineNumber":1031,"className":"org.seleniumhq.jetty7.server.handler.ContextHandler","methodName":"doHandle"},
{"fileName":"ServletHandler.java","lineNumber":406,"className":"org.seleniumhq.jetty7.servlet.ServletHandler","methodName":"doScope"},
{"fileName":"SessionHandler.java","lineNumber":186,"className":"org.seleniumhq.jetty7.server.session.SessionHandler","methodName":"doScope"},
{"fileName":"ContextHandler.java","lineNumber":965,"className":"org.seleniumhq.jetty7.server.handler.ContextHandler","methodName":"doScope"},
{"fileName":"ScopedHandler.java","lineNumber":117,"className":"org.seleniumhq.jetty7.server.handler.ScopedHandler","methodName":"handle"},
{"fileName":"HandlerWrapper.java","lineNumber":111,"className":"org.seleniumhq.jetty7.server.handler.HandlerWrapper","methodName":"handle"},
{"fileName":"Server.java","lineNumber":349,"className":"org.seleniumhq.jetty7.server.Server","methodName":"handle"},
{"fileName":"AbstractHttpConnection.java","lineNumber":452,"className":"org.seleniumhq.jetty7.server.AbstractHttpConnection","methodName":"handleRequest"},
{"fileName":"BlockingHttpConnection.java","lineNumber":47,"className":"org.seleniumhq.jetty7.server.BlockingHttpConnection","methodName":"handleRequest"},
{"fileName":"AbstractHttpConnection.java","lineNumber":884,"className":"org.seleniumhq.jetty7.server.AbstractHttpConnection","methodName":"headerComplete"},
{"fileName":"AbstractHttpConnection.java","lineNumber":938,"className":"org.seleniumhq.jetty7.server.AbstractHttpConnection$RequestHandler","methodName":"headerComplete"},
{"fileName":"HttpParser.java","lineNumber":634,"className":"org.seleniumhq.jetty7.http.HttpParser","methodName":"parseNext"},
{"fileName":"HttpParser.java","lineNumber":230,"className":"org.seleniumhq.jetty7.http.HttpParser","methodName":"parseAvailable"},
{"fileName":"BlockingHttpConnection.java","lineNumber":66,"className":"org.seleniumhq.jetty7.server.BlockingHttpConnection","methodName":"handle"},
{"fileName":"SocketConnector.java","lineNumber":254,"className":"org.seleniumhq.jetty7.server.bio.SocketConnector$ConnectorEndPoint","methodName":"run"},
{"fileName":"QueuedThreadPool.java","lineNumber":599,"className":"org.seleniumhq.jetty7.util.thread.QueuedThreadPool","methodName":"runJob"},
{"fileName":"QueuedThreadPool.java","lineNumber":534,"className":"org.seleniumhq.jetty7.util.thread.QueuedThreadPool$3","methodName":"run"},
{"lineNumber":-1,"className":"java.lang.Thread","methodName":"run"}]}}

How to open a link in a new tab or window and switch to it with Selenium WebDriver

The following codes are works both in Firefox and Chrome browsers.

Open a link in a new window and switch to it:

How to test different resolutions – Part one – Chrome resolutions testing

Often testing can mean checking a sites pages in different resolutions. When a site gets a new layout, it is important to make sure it displays correctly on different browsers and resolutions. While adjusting the resolution manually is an option, it takes too long.
In this post we will talk about resolution testing on Chrome. We were testing some possibilities, and will share our experience with you. We tried a few extensions to see which of them can speed up or make our work easier for us.
Their drawback of these extensions is that web-sites won’t recognize small resolutions as handheld devices, because the browser windows are only re-sized. This unfortunately means that you can’t see what a site would look like, on Chrome, on a mobile device. However they are still useful for desktop testing, and if you don’t want to pay for the service, the following extensions are a must try.