Saturday, July 12, 2014

Android - SSL errors even after installing custom CA certificate

I followed these steps to install my custom CA cert on an Android device

  1. adb push mycert.cer /sdcard/
  2. Go to Settings->Security->Credential storage->Install from device storage
  3. Select the certificate and install
  4. Confirm that the certificate is installed in Settings->Security->Trusted credentials->User

However, the certificate was still not trusted and I was seeing SSL errors on trying to reach an SSL endpoint using the CA cert.

The issue turned out to be that the Date and time was not set correctly on the device. I fixed the Date and time and the SSL errors went away. Yay!

Tuesday, June 10, 2014

Selenium WebDriver Practical Guide

Reviewed a book on Selenium WebDriver Practical Guide. You can find it here http://www.packtpub.com/selenium-webdriver-practical-guide/book

 

 


 

Microsoft UI Automation Framework

Microsoft UI Automation is the new accessibility framework for Microsoft Windows used to provide programmatic access to UI elements on the desktop. It can be used to automate Windows applications, Web applications and Windows Store apps

To inspect the automation element properties, you can use the accessibility tools that ship with Windows SDK http://blogs.msdn.com/b/seealso/archive/2010/07/22/where-did-the-accessibility-tools-go.aspx
 

 
Pre-Requisite
Add a reference to UIAutomationClient.dll and UIAutomationTypes.dll and include the namespace
using System.Windows.Automation;

Desktop or Root element
The root element is desktop which can be obtained by
AutomationElement desktop = AutomationElement.RootElement;

 Finding the Application under Test

The application under test can be found by looking for the children of desktop
AutomationElement applicationUnderTest = desktop.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "ApplicationName"));

Finding Child elements of Application under Test

AutomationElement child = applicationUnderTest.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "ChildName"));

Finding Descendants of Application under Test

AutomationElement child = applicationUnderTest.FindFirst(TreeScope. Descendants, new PropertyCondition(AutomationElement.NameProperty, "DescendentName"));

Various ways of finding an Element

AutomationElement.NameProperty
AutomationElement.AutomationIdProperty
AutomationElement.ClassNameProperty
AutomationElement.FromHandle(IntPtr hwnd)
AutomationElement.ControlTypeProperty
Etc.

Entering Text in an Element

AutomationElement textbox = applicationUnderTest.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "TextboxName"));
object textboxValuePattern = null;
if (textbox.TryGetCurrentPattern(ValuePattern.Pattern, out textboxValuePattern))
{
   ((ValuePattern) textboxValuePattern.SetValue("Desired text");
}

Clicking a button

AutomationElement button = applicationUnderTest.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "ButtonName"));
object t buttonPattern = null;
if (button.TryGetCurrentPattern(InvokePattern.Pattern, out buttonPattern))
{
   ((InvokePattern) buttonPattern.Invoke();
}

Finding the Application under Test using Pointer to a Handle

Sometimes it’s difficult to find an application just by looking at the children of desktop. In these case, it can be found using pointer to its handle

First, create a class which uses Windows USER (User32.dll) component of Windows Operating System
public static class Win32
    {
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(String sClassName, String sAppName);
    }

Then get a handle of the application window. You will have to include the namespace
using interop.UIAutomationCore;
IntPtr handle = Win32.FindWindow("Windows.UI.Core.CoreWindow", " ApplicationName ");

Now, you can find the application under test
AutomationElement applicationUnderTest = AutomationElement.FromHandle(handle);

Tuesday, August 6, 2013

Test SQL connection from a windows machine

I wanted to test SQL connection from a Windows machine which didn't have any SQL tools installed. Found a cool way to do so as mentioned below:

  1. Create a blank udl file e.g. test.udl
  2. Double click it
  3. Enter the connection properties and click Test Connection. Sweet!

 

Thursday, May 9, 2013

Automated Website Testing with FiddlerCore

There are various UI automation tools to automate your website and validate the UI. However, it’s also important to capture and validate the network traffic. This can be done using FiddlerCore. You can also perform various types of testing like low bandwidth testing, mobile device testing and localization testing using FiddlerCore.

You can download FiddlerCore from http://fiddler2.com/fiddlercore

To start FiddlerApplication, call FiddlerApplication.Startup(0, FiddlerCoreStartupFlags.Default);

Enable HTTPS Decryption

You can enable HTTPS Decryption while starting Fiddler Application

 FiddlerApplication.Startup(0, FiddlerCoreStartupFlags.DecryptSSL);

 You also need to create and import Root cert for Fiddler

 if (!CertMaker.rootCertExists())
{
            if (!CertMaker.createRootCert())
            {
                        throw new Exception("Unable to create cert for FiddlerCore.");
            }
}

X509Certificate2 oRootCert = CertMaker.GetRootCertificate();
X509Store certStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadWrite);

try
{
            certStore.Add(oRootCert);
}
finally
{
            certStore.Close();
}


Capture Network Traffic

You can capture the network traffic in a list and then perform various validations like checking for response time, response string, etc. for the captured sessions.
List<Session> _sessions = new List<Session>();

FiddlerApplication.BeforeRequest += delegate(Session oSession)

            {

                Monitor.Enter(_sessions);

                _sessions.Add(oSession);

                Monitor.Exit(_sessions);

            };


Simulate Modem Speeds


You can add a delay of specific milliseconds per KB uploaded as well as for per KB downloaded. This simulates a slow network and can be used to test scenarios where specific requests shouldn’t be made on a slow network. For example, Yahoo mail downloads an image on good network but doesn’t on a slow network.

High Bandwidth

 Low Bandwidth
 
FiddlerApplication.BeforeRequest += delegate(Session oSession)

            {

                if (!_applyrule) return;

                oSession["request-trickle-delay"] = sendDelayinMillisecPerKb;

                oSession["response-trickle-delay"] = receiveDelayinMillisecPerKb;

            };

Mobile Device Testing


Most websites rely on the User Agent string to determine if a request is coming from a mobile device. Hence to test the behavior of a website on a mobile device, corresponding User Agent is set using the Fiddler proxy. For example, when you send the user agent for WP 7.5 i.e. Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Microsoft; XDeviceEmulator) , Gmail looks different than that on IE 9

Internet Explorer 9

 
Windows Phone 7.5

 
FiddlerApplication.BeforeRequest += delegate(Session oSession)

            {

                if (_applyrule)

                {

                    oSession.oRequest["User-Agent"] = userAgent;

                }

            };

Localization Testing


Localization testing can be performed by requesting the content in a specific language. This is done by modifying the Accept-Language header using the Fiddler proxy. For example, Hotmail looks the opposite for English and Hebrew Language.

English (en-US)
 

Hebrew (he)

 
FiddlerApplication.BeforeRequest += delegate(Session oSession)

            {

                if (_applyrule)

                {

                    oSession.oRequest["Accept-Language"] = languageAbbreviation;

                }

            };

 

Thursday, March 14, 2013

Capturing traffic from Windows Phone 8 Emulator running on a VM

Usually when you would want to capture traffic from a Windows Phone emulator, you will check "Allow Remote computers to connect" and run the below command in Fiddler QuickExec box

prefs set fiddler.network.proxy.registrationhostname <MachineName>

Then restart Fiddler and Emulator.

However, this does not work when Windows Phone 8 Emulator is running on a VM by following the steps at http://www.developer.nokia.com/Community/Wiki/Windows_Phone_8_SDK_on_a_Virtual_Machine_with_Working_Emulator

The fix is really easy. Instead of using the machine name of the VM, use the IP address of the VM when configuring fiddler.

Check "Allow Remote computers to connect" in Tools->Fiddler Options->Connections and run the below command in Fiddler QuickExec box

prefs set fiddler.network.proxy.registrationhostname <IP Address>

Then restart Fiddler and Emulator.

Tuesday, February 26, 2013

Find when a file was copied to a folder

Often you will find a file in a folder showing the DateModified column.
This value represents when the last changes were made  to this file.
However, a file might have been created way back and copied to a folder recently.

If you want to know when a file was copied to a folder, you can do that by Adding a column DateCreated.

 


You can also find it by passing the argument /T:C to dir command