Handling Ajax events:
If you want to automate an UI which is having some UI elements are behaving based on ajax events.
Suppose there is an UI element (text field),when you type some text on the field that will invoke some ajax call for hitting the server and get some info from server and showing on the screen.
Now problem is when you use the type command in selenium ,it wont call the ajax events.You need to call
ajax events after type the text into the text field.
Selenium is providing the following commands for automate the ajax events.
Selenium.type(xpath of element,some text); // this will do the type the text ,but it wont invokes the ajax events
Selenium.fireEvent(xpath of element,"blur"); //this will do the ajax calls.
Verify vertical scrollbar appears for the text-area element:
Selenium is not providing any command to checking the appearance of the vertical scrollbar.
We need to findout by using java script and need to invoke the script by the selenium.
Selenium API is providing the command for executing the java script.
Use below script when you know only the classname for the text-area.
Selenium.type(xpath of the text-area element,text value);
String str1=Selenium.getEval("this.browserbot.getCurrentWindow().document.getElementsByClassName('cssclassname')[0].clientHeight");
String str = Selenium.getEval("this.browserbot.getCurrentWindow().document.getElementsByClassName('cssclassname')[0].scrollHeight");
int clientHeight = Integer.parseInt(str1);
int scrollHeight = Integer.parseInt(str);
if(clientHeight < scrollHeight){
System.out.println("Vertical scrollbar appears");
}else{
System.out.println("Vertical scrollbar is not appear");
}
Note: If you know the Id or Name of the text-area field then
use getElementById() or getElementByName() instead of the getElementByClassName method.
I'm unable to upload a file using selenium core; when I try to type in the file upload text field, nothing happens!
There seems to be two inter-related problems:
1 – Unfortunately, this is yet another JavaScript security restriction; JS is not allowed to modify the value of input type=”file” form fields. You can work around this by running your tests under Selenium IDE or under Selenium RC running in the experimental “*chrome” mode for Firefox, but at present there is no straight forward way to do this in Selenium Core.
2 – Handling of the “Choose File” dialog box with Selenium alone is not possible. We need to have another program running to select the path and file from the “Choose File” dialog box.
So, How can we upload files?
Fortunately, there exists a workaround to the above problems. This is where the magic of AutoIt and Selenium combination can work wonders!
First we will write a simple script in AutoIt and save the file as an executable: (please read documentation on
AutoIt website to learn how to save the scripts as an executable file)
1 WinWaitActive("Choose file")
2 Send("C:\attach\samplefile.txt") \\location of the file you want to attach to the form and submit
3 Send("{ENTER}")
We shall name the above file as attachFile.exe
Now, within a Java code, we can run a process which will execute the above program just before when we want to upload and submit a file.
01 package com.company;
02
03 import java.io.IOException;
04 import com.thoughtworks.selenium.Selenium;
05
06 public class AddAttachment {
07 public static void attach(Selenium selenium, String fileName) {
08 try {
09 String[] commands = new String[]{};
10 commands = new String[]{"c:\\test\\attachFile.exe"}; //location of the autoit executable
11 Runtime.getRuntime().exec(commands);
12 } catch (IOException e) {}
13
14 //autoit executable is now waiting for a "Choose file" dialog to popup
15 selenium.click("name=browseButton");
16 //once the "Choose file" dialog is opened, the autoit will input the path and file name
17 }
18 }
The above seems to be the easiest way to deal with file uploads and attachments using Selenium.
Note: Use AutoIt for the things which are not automated by the selenium-core like handling browser certification,authentication popups etc.
How to start selenium server using Java code
When test automating a web application using Selenium, we have to start the Selenium server first, so that a new Selenium session is created to talk to the web browser. This can be either done manually, i.e user running a command line to start the Selenium server, or to get the pure automation effect of Selenium, it is best to start the Selenium server via a program code.
01 package com.company;
02 import org.openqa.selenium.server.RemoteControlConfiguration;
03 import org.openqa.selenium.server.SeleniumServer;
04 import com.thoughtworks.selenium.Selenium;
05 import java.net.BindException;
06 import java.net.ServerSocket;
07
08 public class Server {
09 public static SeleniumServer server;
10 public static void startSeleniumServer() throws Exception {
11
12 try {
13 ServerSocket serverSocket = new ServerSocket(RemoteControlConfiguration.DEFAULT_PORT);
14 serverSocket.close();
15 //Server not up, start it
16 try {
17 RemoteControlConfiguration rcc = new RemoteControlConfiguration();
18 rcc.setPort(RemoteControlConfiguration.DEFAULT_PORT);
19 server = new SeleniumServer(false, rcc);
20
21 } catch (Exception e) {
22 System.err.println("Could not create Selenium Server because of: "
23 + e.getMessage());
24 e.printStackTrace();
25 }
26 try {
27 server.start();
28 System.out.println("Server started");
29 } catch (Exception e) {
30 System.err.println("Could not start Selenium Server because of: "
31 + e.getMessage());
32 e.printStackTrace();
33 }
34 } catch (BindException e) {
35 System.out.println("Selenium server already up, will reuse...");
36 }
37 }
38
39 public static void stopSeleniumServer(Selenium selenium){
40 selenium.stop();
41 if (server != null)
42 {
43 try
44 {
45 selenium.shutDownSeleniumServer();
46 server.stop();
47
48 server = null;
49 }
50 catch (Exception e)
51 {
52 e.printStackTrace();
53 }
54 }
55 }
56
57 }
Selenium Failed to start new browser in iexplore mode when starting/stoping the server dynamically by the code in IE.
I'm unable to run my scripts with IE using iexplore mode when starting the server using java code(dynamically) and I'm getting below error
java.lang.RuntimeException: Could not start Selenium session: Failed to start new browser session: Error while launching browser
at com.thoughtworks.selenium.DefaultSelenium.start(DefaultSelenium.java:89)
at com.aol.patch.util.SeleniumBase.openBrowser(SeleniumBase.java:91)
at com.aol.patch.tests.CommonTest.testEnter(CommonTest.java:28)
Caused by: com.thoughtworks.selenium.SeleniumException: Failed to start new browser session: Error while launching browser
at com.thoughtworks.selenium.HttpCommandProcessor.throwAssertionFailureExceptionOrError(HttpCommandProcessor.java:97)
at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(HttpCommandProcessor.java:91)
at com.thoughtworks.selenium.HttpCommandProcessor.getString(HttpCommandProcessor.java:262)
at com.thoughtworks.selenium.HttpCommandProcessor.start(HttpCommandProcessor.java:223)
at com.thoughtworks.selenium.DefaultSelenium.start(DefaultSelenium.java:81)
Here the problem is selenium is trying to start in iehta mode eventhough specified that start in a iexplore mode.
After doing some quick search, I found that there is work around to start a selenium in iehta mode.
The only way to get the original iexplore is to change the browser mode to "*iexploreproxy" or "piiexplore".
So, I changed my config file to start selenium using "*iexploreproxy" instead of "*iexplore" and working fine with IE.
I hope this can be helpful.