Driver.SwitchTo().Window(Driver.CurrentWindowHandle);
Wednesday, June 18, 2014
Clicking problems with IE and Selenium
Driver.SwitchTo().Window(Driver.CurrentWindowHandle);
Sunday, December 22, 2013
tcl: dumping tablelist data
For the tablelist widget I created a function to dump the table content to a file
proc dumpTableListToFile { tree { file preview.txt } } {
set rowCount [$tree size]
set file_writer [open $file w+]
for { set i 0 } { $i < $rowCount } { incr i } {
set rowData [$tree get $i]
puts $file_writer $rowData
}
close $file_writer
}parameters:
tree, is the table widget, file is the file name, optional.
Monday, December 16, 2013
tcl: find widget recursively
The function I initially created
1: proc findWidgetByName { wname {widget .mainwindow} } {
2: set pattern "*.${wname}"
3: #puts $widget
4: set all "[winfo children $widget]"
5: foreach child $all {
6: #puts "$child"
7: if { [winfo viewable $child] && [string match $pattern $child] } {
8: #puts $child
9: return $child
10: } else {
11: return [findWidgetByName $wname $child]
12: }
13: }
14: return 0
15: }
1: proc findWidgetByName { wname {widget .mainwindow} } {
2: set pattern "*.${wname}"
3: #puts $widget
4: set all "[winfo children $widget]"
5: foreach child $all {
6: #puts "$child"
7: if { [winfo viewable $child] && [string match $pattern $child] } {
8: #puts $child
9: return $child
10: } else {
11: set x [findWidgetByName $wname $child]
12: if { $x !=0 } {
13: return $x ;
14: }
15: }
16: }
17: return 0
18: }
When using for loops with recursion we need to put some condition when to break the for loop execution
I have created also another version to find widgets by label, in case of buttons or labels
1: proc findWidgetByLabel { label {widget .mainwindow} } {
2: set all "[winfo children $widget]"3: foreach child $all {
4: #puts "$child"
5: if {([winfo class $child]== "Label" || [winfo class $child]== "Button" ) && [winfo viewable $child] && [$child cget -text]==$label } {
6: #puts $child
7: return $child
8: } else {
9: set x [findWidgetByLabel $label $child]
10: if { $x !=0 } {
11: return $x ;
12: }
13: }
14: }
15: return 0
16: }
Friday, December 13, 2013
Extracting tcl treeview items
#this function dumps the 1st level in the tree to a file
proc dumpTreeDataTags { file } {
global treeControl
set file_writer [open $file w+]
foreach id [$treeControl item children root] {
set data [$treeControl item tag names $id]
puts $file_writer $data
}
close $file_writer
}
#this function dumps all the tree data, file is appended. File must be cleared before calling this function
proc dumpAllTreeDataTags { file { item root} } {
global treeControl
foreach id [$treeControl item children $item] {
set file_writer [open $file a+]
set data [$treeControl item tag names $id]
puts $file_writer $data
close $file_writer
dumpAllTreeDataTags $file $id
}
}
Explaining the functions:
The first one, i am extracting the first level only, and saving to the file, the file is opened in write mode, and replaced every time the function is called.
The second function is using recursion to iterate starting from the root node, through the children, and then calling the function again for each children, and so on. File is opened in append mode, so that when called in recursion, the previous data written to the file is not lost
Sunday, November 10, 2013
TCL: invalid command name "else"
if { ... } {
...
}
else {
...
}
To get ride of this error, put the "else" and the "if" ending brackets in the same line
if { ... } {
...
} else {
...
}
Monday, August 5, 2013
.NET: Deserialize error while parsing the XML
The code I was using
string fileName = "file.txt";
System.Xml.Serialization.XmlSerializer s =
new System.Xml.Serialization.XmlSerializer(typeof(myObject));
System.IO.StreamWriter sw = new System.IO.StreamWriter(fileName, true);
s.Serialize(sw, myObject);
sw.Close();
Unhandled Exception: System.Xml.XmlException: XML declaration cannot appear in this state
I did some search and found people talking about encoding problems, and I found some articles guiding to change the encoding, using XmlWriter instead of StreamWriter, I changed my code to below to see if this will impact my error.
System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings(); settings.Encoding = new System.Text.UnicodeEncoding(false, false); settings.Indent = true; string fileName = "file.txt"; System.Xml.Serialization.XmlSerializer s = new System.Xml.Serialization.XmlSerializer(typeof(myObject)); System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(fileName, settings); s.Serialize(xw, myObject); xw.Close();
Unhandled Exception: System.Xml.XmlException: a name did not start with a legal character
Which means that the name was invalid, so I changed the encoding to be Ascii, ASCIIEncoding
System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings();
settings.Encoding = new System.Text.ASCIIEncoding();
settings.Indent = true;
System.Xml.Serialization.XmlSerializer s = new System.Xml.Serialization.XmlSerializer(typeof(mybject));
System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create("filename", settings);
s.Serialize(xw, myObject);
file.Close();
Monday, June 17, 2013
Selenium: Dealing with HTML loading modal panel
While playing back a test for a java rich faces application, the test was failing in the middle, debugging and playing back step by step, the test was passing with no issues. Looking more into the steps, there was a step that is causing ajax call, and after it there is a button click step, the one that was failing was the next one after the button click. When I checked the screen, there was a loading panel displayed during the ajax call, freezing all the screen, so I figured out that when this loading panel is displayed, selenium was able to find the button and click on it, but it is not actually clicked on the UI of the application, which cause that next step after to fail.
To resolve this, first I tried to look for something to make sure the button is clickable, I found something but for Java, and doesn’t exist for .NET
wait.until(elementToBeClickable(By.partialLinkText("SomeID")));
My test was on IE, and when I tried it with java, I had problems creating the selenium session with the selenium IE server.
Then I thought of something else, to identify any element change in the page that tells that the ajax call is done, then I can use this before the button click, to make sure it is clickable. I looked into the html page before, during and after the ajax call and compared. Before the call and when the loading panel was not visible, I found hidden div with ID ajaxLoadingModalPanelContainer, it looked like below
<div id="ajaxLoadingModalPanelContainer" class="rich-modalpanel " style="position: absolute; z-index: 100; background-color: inherit; display: none;">
when the loading panel was visible, there was a div in the body like below (same as above, but the display style is gone)
<div id="ajaxLoadingModalPanelContainer" class="rich-modalpanel " style="position: absolute; z-index: 100; background-color: inherit;">
After the ajax call, the loading panel disappears and it changes back to have “display:none”
<div id="ajaxLoadingModalPanelContainer" class="rich-modalpanel " style="position: absolute; z-index: 100; background-color: inherit; display: none;">
I then created a function to wait for the ajaxLoadingModalPanelContainer div to be displayed, then to wait until it is hidden again like below
public void WaitForModalPanel()
{
string element_xpath = ".//*[@id='ajaxLoadingModalPanelContainer' and not(contains(@style,'display: none'))]";
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 2, 0));
wait.Until(ExpectedConditions.ElementIsVisible(By.XPath(element_xpath)));
element_xpath = ".//*[@id='ajaxLoadingModalPanelContainer' and contains(@style,'DISPLAY: none')]";
wait.Until(ExpectedConditions.ElementExists(By.XPath(element_xpath)));
}
Calling the above function before the button click, the button click was also clicked on the UI and the test was passing successfully
Sunday, June 16, 2013
Selenium: unable to locate element using style attribute with internet explorer
While developing a selenium test and running it on IE, I was trying to locate an element on the page with xpath, selenium couldn’t find the element, I was getting exception: “NoSuchElementException: Unable to find element with xpath == ……”
I thought at the beginning that there is something wrong with my xpath string, and I kept looking into this for a while. I have installed FirePath plugin for Firefox to verify my xpath, and my xpath was working find, xpath could locate element
Finally I spotted something on selenium documentation under section “IE and Style Attributes” that says that if you are trying to locate an element with the style attribute, it might not work in internet explorer as IE interpret the style parameters in upper case differently that other browsers, so locating with style and lowercase will success in Firefox, Chrome, etc… but will fail in IE
looking back to my xpath, my element xpath was ".//*[@id='ajaxLoadingModalPanelContainer' and contains(@style,'display: none')]"
Changing it to ".//*[@id='ajaxLoadingModalPanelContainer' and contains(@style,DISPLAY: none')]" my test was able to find the element successfully
Wednesday, June 12, 2013
C#: Inserting duplicates into sorted List
To insert in the list sorted, I used the binary search method, to find the first item less then or equal to the inserted item
Suppose we have a sorted list “list”, and we want to insert item i keeping it sorted
List<int> list= new List<int>();
int index = list.BinarySearch(i);
if (index < 0)
list.Insert(~index, i);
else
list.Insert(index, i);
public class DuplicateKeyComparer<TKey>:IComparer<TKey> where TKey : IComparable
{
public int Compare(TKey x, TKey y)
{
int result = x.CompareTo(y);
if (result == 0)
return 1; // Handle equality as being greater
return result;
}
}
Monday, April 8, 2013
Running Selenium tests from Visual Studio – Step by step
From Firefox, record new selenium test, for example for Google search
Export the test to C# web drive
This is how it looks like after export
Open visual studio, create new test project
By default the file UnitTest1.cs is created
Create a new cs file, name it for example GoogleSearch
Copy the code from the cs file generated by selenium and paste it in the file GoogleSearch.cs
Add reference in the project to Selenium .Net WebDriver, WebDriver.dll and WebDriver.Support.dl
Now the references added, you can see that the editor recognizes the selenium name spaces
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;
Find and replace “TestFixture” to “TestClass”, “SetUp” to “TestInitialize()”, “Test” to “TestMethod”, “TearDown” to “TestCleanup()”
To run with Chrome, download chromedriver.exe from https://code.google.com/p/chromedriver/downloads/list, place it in the bin folder
Change the driver in the code to Chrome then run the test
driver = new OpenQA.Selenium.Chrome.ChromeDriver();
Running the test, chrome will open, and Google search page will be displayed, displaying search results then closed
This was a step by step example on running selenium test from visual studio