watin-commits Mailing List for WatiN
Brought to you by:
jvmenen
You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(17) |
Sep
(18) |
Oct
(29) |
Nov
(23) |
Dec
(12) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(37) |
Feb
(38) |
Mar
(25) |
Apr
(12) |
May
(13) |
Jun
(4) |
Jul
(12) |
Aug
(7) |
Sep
(37) |
Oct
(34) |
Nov
(14) |
Dec
(13) |
2008 |
Jan
(29) |
Feb
(13) |
Mar
(22) |
Apr
(14) |
May
(15) |
Jun
(5) |
Jul
|
Aug
(1) |
Sep
(13) |
Oct
(24) |
Nov
(6) |
Dec
(25) |
2009 |
Jan
(45) |
Feb
(63) |
Mar
(82) |
Apr
(24) |
May
(3) |
Jun
(15) |
Jul
(35) |
Aug
(14) |
Sep
(10) |
Oct
(4) |
Nov
(26) |
Dec
(13) |
2010 |
Jan
(8) |
Feb
(5) |
Mar
|
Apr
|
May
|
Jun
(2) |
Jul
|
Aug
(8) |
Sep
(7) |
Oct
(10) |
Nov
(32) |
Dec
(4) |
2011 |
Jan
(6) |
Feb
(18) |
Mar
(3) |
Apr
(5) |
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(3) |
Nov
|
Dec
|
2012 |
Jan
|
Feb
|
Mar
(4) |
Apr
(10) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <jv...@us...> - 2012-04-23 21:22:11
|
Revision: 1217 http://watin.svn.sourceforge.net/watin/?rev=1217&view=rev Author: jvmenen Date: 2012-04-23 20:10:18 +0000 (Mon, 23 Apr 2012) Log Message: ----------- Update to use Mozrepl plugin in Firefox instead of JSSH. This allows for using the latest version of FireFox in your tests. Thanx to Aurelian Maga for this patch! Modified Paths: -------------- trunk/src/Core/FireFox.cs trunk/src/Core/Logging/Logger.cs trunk/src/Core/Native/Chrome/ChromeClientPort.cs trunk/src/Core/Native/ClientPortBase.cs trunk/src/Core/Native/IClientPort.cs trunk/src/Core/Native/ICssSelector.cs trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs trunk/src/Core/Native/InternetExplorer/IESWindowHelper.cs trunk/src/Core/Native/JSBrowserBase.cs trunk/src/Core/Native/JSElement.cs trunk/src/Core/Native/Mozilla/FFBrowser.cs trunk/src/Core/Native/Mozilla/FireFoxClientPort.cs trunk/src/Core/Native/Mozilla/FireFoxException.cs trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs trunk/src/UnitTests/BrowserTests.cs trunk/src/UnitTests/Native/FireFoxTests/FireEventTests.cs trunk/src/UnitTests/Native/FireFoxTests/FireFoxTests.cs trunk/src/UnitTests/Native/JSElementCollectionBaseTests.cs trunk/src/UnitTests/UnitTests.csproj Modified: trunk/src/Core/FireFox.cs =================================================================== --- trunk/src/Core/FireFox.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/FireFox.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -189,7 +189,7 @@ } else { - throw new FireFoxException("Unable to determine the current version of FireFox tried looking in the registry and the common locations on disk, please make sure you have installed FireFox and Jssh correctly"); + throw FireFoxException.FireFoxNotInstalled(); } } } @@ -206,21 +206,20 @@ var currentVersion = (string)mozillaKey.GetValue("CurrentVersion"); if (string.IsNullOrEmpty(currentVersion)) { - throw new FireFoxException("Unable to determine the current version of FireFox using the registry, please make sure you have installed FireFox and Jssh correctly"); + throw FireFoxException.FireFoxNotInstalled(); } var currentMain = mozillaKey.OpenSubKey(string.Format(@"{0}\Main", currentVersion)); if (currentMain == null) { - throw new FireFoxException( - "Unable to determine the current version of FireFox using the registry, please make sure you have installed FireFox and Jssh correctly"); + throw FireFoxException.FireFoxNotInstalled(); } var path = (string)currentMain.GetValue("PathToExe"); if (!File.Exists(path)) { throw new FireFoxException( - "FireFox executable listed in the registry does not exist, please make sure you have installed FireFox and Jssh correctly"); + "FireFox executable listed in the registry does not exist, please make sure you have installed FireFox and MozRepl correctly"); } return path; Modified: trunk/src/Core/Logging/Logger.cs =================================================================== --- trunk/src/Core/Logging/Logger.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Logging/Logger.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -140,7 +140,7 @@ set { mLogWriter = value ?? DefaultLogWriter(); } } - private static NoLog DefaultLogWriter() + private static ILogWriter DefaultLogWriter() { return new NoLog(); } Modified: trunk/src/Core/Native/Chrome/ChromeClientPort.cs =================================================================== --- trunk/src/Core/Native/Chrome/ChromeClientPort.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/Chrome/ChromeClientPort.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -159,8 +159,8 @@ } catch (SocketException sockException) { - Logger.LogDebug(string.Format("Failed connecting to jssh server.\nError code:{0}\nError message:{1}", sockException.ErrorCode, sockException.Message)); - throw new ChromeException("Unable to connect to jssh server, please make sure you have correctly installed the jssh.xpi plugin", sockException); + Logger.LogDebug(string.Format("Failed connecting to chrome server.\nError code:{0}\nError message:{1}", sockException.ErrorCode, sockException.Message)); + throw new ChromeException("Unable to connect to chrome server, please make sure you have correctly installed the jssh.xpi plugin", sockException); } this.Connected = true; Modified: trunk/src/Core/Native/ClientPortBase.cs =================================================================== --- trunk/src/Core/Native/ClientPortBase.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/ClientPortBase.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -36,7 +36,7 @@ private bool? _javaSriptSupportsQuerySelector = null; /// <summary> - /// Gets the last response recieved from the jssh server + /// Gets the last response recieved from the mozrepl server /// </summary> private string _lastResponse; @@ -75,6 +75,13 @@ } /// <summary> + /// Gets the name of javascript prompt name + /// </summary> + public abstract string PromptName + { + get; + } + /// <summary> /// Gets or sets the browser process. /// </summary> /// <value>The browser process.</value> @@ -93,7 +100,7 @@ protected StringBuilder Response { get; set; } /// <summary> - /// Gets or sets the last reponse recieved from the jssh server + /// Gets or sets the last reponse recieved from the mozrepl server /// </summary> protected string LastResponse { @@ -156,7 +163,7 @@ } /// <summary> - /// Writes the specified data to the jssh server. + /// Writes the specified data to the mozrepl server. /// </summary> /// <param name="data">The data to write.</param> /// <param name="args">Arguments to be passed to <see cref="string.Format(string,object[])"/></param> @@ -242,7 +249,7 @@ /// <summary> - /// Writes the specified data to the jssh server. + /// Writes the specified data to the mozrepl server. /// </summary> /// <param name="data">The data to write.</param> /// <param name="resultExpected"><c>true</c> if a result is expected.</param> Modified: trunk/src/Core/Native/IClientPort.cs =================================================================== --- trunk/src/Core/Native/IClientPort.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/IClientPort.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -24,7 +24,7 @@ public interface IClientPort { /// <summary> - /// Writes the specified data to the jssh server. + /// Writes the specified data to the mozrepl server. /// </summary> /// <param name="data">The data to write.</param> /// <param name="args">Arguments to be passed to <see cref="string.Format(string,object[])"/></param> Modified: trunk/src/Core/Native/ICssSelector.cs =================================================================== --- trunk/src/Core/Native/ICssSelector.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/ICssSelector.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -1,4 +1,22 @@ -using System; +#region WatiN Copyright (C) 2006-2011 Jeroen van Menen + +//Copyright 2006-2011 Jeroen van Menen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion Copyright + +using System; using System.Collections.Generic; using System.Linq; using System.Text; Modified: trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -107,6 +107,10 @@ container += _element.GetJavaScriptElementReference(); } } + else + { + //container = CreateArray(); + } domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript()); @@ -116,6 +120,21 @@ return new JScriptElementArrayEnumerator((IEDocument) domContainer.NativeDocument, "___WATINRESULT"); } + private string CreateArray() + { + var elements = "["; + + foreach (var element in AsNative(_htmlElementCollection)) + { + elements += element.GetJavaScriptElementReference() + ","; + } + + elements = elements.Remove(elements.LastIndexOf(",", StringComparison.Ordinal), 1); + + return elements + "]"; + + } + private static IEnumerable<INativeElement> AsNative(IEnumerable htmlElementCollection) { foreach (IHTMLElement htmlElement in htmlElementCollection) Modified: trunk/src/Core/Native/InternetExplorer/IESWindowHelper.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IESWindowHelper.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/InternetExplorer/IESWindowHelper.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -1,4 +1,22 @@ -using System; +#region WatiN Copyright (C) 2006-2011 Jeroen van Menen + +//Copyright 2006-2011 Jeroen van Menen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion Copyright + +using System; using WatiN.Core.Logging; using WatiN.Core.Native.Windows; Modified: trunk/src/Core/Native/JSBrowserBase.cs =================================================================== --- trunk/src/Core/Native/JSBrowserBase.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/JSBrowserBase.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -50,6 +50,11 @@ get { return ClientPort.BrowserVariableName; } } + public string PromptName + { + get { return ClientPort.PromptName; } + } + /// <inheritdoc /> public IntPtr hWnd { @@ -124,7 +129,9 @@ ClientPort.WriteAndRead("window.location.href"); break; case JavaScriptEngineType.Mozilla: + ClientPort.WriteAndRead(string.Format("{0}.home();true;", PromptName)); loading = ClientPort.WriteAndReadAsBool("{0}.webProgress.busyFlags!=0;", BrowserVariableName); + ClientPort.WriteAndRead(string.Format("if(typeof(w0)!=='undefined'){0}.enter(w0.content);true;", PromptName)); break; default: throw new NotImplementedException(); @@ -148,13 +155,21 @@ public int WindowCount { - get { return ClientPort.WriteAndReadAsInt("getWindows().length"); } + get + { + ClientPort.WriteAndRead(string.Format("{0}.home();true;", ClientPort.PromptName)); + var windowCount = ClientPort.WriteAndReadAsInt(string.Format("{0}.getWindows().length", ClientPort.PromptName)); + ClientPort.WriteAndRead(string.Format("if(typeof(w0)!=='undefined'){0}.enter(w0.content);true;", ClientPort.PromptName)); + + return windowCount; + } } private bool Navigate(string action) { var ticks = Guid.NewGuid().ToString(); ClientPort.Write("{0}.WatiNGoBackCheck='{1}';",ClientPort.DocumentVariableName, ticks); + ClientPort.WriteAndRead(string.Format("{0}.home();true;", ClientPort.PromptName)); ClientPort.Write("{0}.{1}();", BrowserVariableName, action); ClientPort.InitializeDocument(); Modified: trunk/src/Core/Native/JSElement.cs =================================================================== --- trunk/src/Core/Native/JSElement.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/JSElement.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -159,7 +159,7 @@ public INativeElementCollection Children { - get { return new JSElementArray(ClientPort, FireFoxClientPort.GetChildElementsFunctionName + "(" + ElementReference +")"); } + get { return new JSElementArray(ClientPort, ClientPort.PromptName + "." + FireFoxClientPort.GetChildElementsFunctionName + "(" + ElementReference +")"); } } public INativeElementCollection AllDescendants @@ -275,7 +275,9 @@ if (attributeName == "disabled") return IsDisabled; // Return value - return UsePropertyInsteadOfAttribute.Contains(attributeName) ? GetProperty(attributeName) : GetAttribute(attributeName); + var value = UsePropertyInsteadOfAttribute.Contains(attributeName) ? GetProperty(attributeName) : GetAttribute(attributeName); + + return string.IsNullOrEmpty(value) ? null : value; } public string IsDisabled Modified: trunk/src/Core/Native/Mozilla/FFBrowser.cs =================================================================== --- trunk/src/Core/Native/Mozilla/FFBrowser.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/Mozilla/FFBrowser.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -40,7 +40,9 @@ /// <param name="waitForComplete">If false, makes to execution of LoadUri asynchronous.</param> protected override void LoadUri(Uri url, bool waitForComplete) { - var command = string.Format("{0}.loadURI(\"{1}\");", BrowserVariableName, url.AbsoluteUri); + var command = string.Format("{0}.loadURI(\"{1}\");", ClientPort.PromptName, url.AbsoluteUri); + + //var command = string.Format("w0.content.location.href = \"{0}\"; }}",url.AbsoluteUri); if (!waitForComplete) { command = JSUtils.WrapCommandInTimer(command); Modified: trunk/src/Core/Native/Mozilla/FireFoxClientPort.cs =================================================================== --- trunk/src/Core/Native/Mozilla/FireFoxClientPort.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/Mozilla/FireFoxClientPort.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -27,14 +27,15 @@ using Logging; using Windows; using UtilityClasses; + using System.Net; /// <summary> - /// The firefox client port used to communicate with the remote automation server jssh. + /// The firefox client port used to communicate with the remote automation server. /// </summary> public class FireFoxClientPort : ClientPortBase { public const string LOCAL_IP_ADRESS = "127.0.0.1"; - public static int DEFAULT_PORT = 9997; + public static int DEFAULT_PORT = 4242; public string IpAdress { get; set; } public int Port { get; set; } @@ -59,6 +60,13 @@ /// </summary> private Socket _telnetSocket; + /// <summary> + /// mozrepl prompt name + /// </summary> + private string _prompt; + + private const string _promptSuffix = "> "; + private bool _emulateActiveElement; private bool _emulateActiveElementChecked; @@ -79,6 +87,11 @@ } /// <summary> + /// Gets the javascript prompt name + /// </summary> + public override string PromptName { get { return _prompt; } } + + /// <summary> /// Gets a value indicating whether this <see cref="FireFoxClientPort"/> is connected. /// </summary> /// <value><c>true</c> if connected; otherwise, <c>false</c>.</value> @@ -89,7 +102,7 @@ /// </summary> public override string DocumentVariableName { - get { return "doc"; } + get { return "document"; } } /// <summary> @@ -174,17 +187,17 @@ if (createNewFireFoxInstance) CreateNewFireFoxInstance(url); - Logger.LogDebug("Attempting to connect to jssh server on localhost port 9997."); + Logger.LogDebug("Attempting to connect to mozrepl server on {0} port {1}.", IpAdress, Port); - ConnectToJsshServer(); + ConnectToMozReplServer(); WaitForConnectionEstablished(); - Logger.LogDebug("Successfully connected to FireFox using jssh."); + Logger.LogDebug("Successfully connected to FireFox using mozrepl."); - if (createNewFireFoxInstance) DefineDefaultJSVariablesForWindow(0); + DefineDefaultJSVariablesForWindow(0); } - private void ConnectToJsshServer() + private void ConnectToMozReplServer() { _telnetSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) {Blocking = true}; @@ -195,8 +208,8 @@ } catch (SocketException sockException) { - Logger.LogDebug(string.Format("Failed connecting to jssh server.\nError code:{0}\nError message:{1}", sockException.ErrorCode, sockException.Message)); - throw new FireFoxException("Unable to connect to jssh server, please make sure you have correctly installed the jssh.xpi plugin", sockException); + Logger.LogDebug(string.Format("Failed connecting to mozrepl.\nError code:{0}\nError message:{1}", sockException.ErrorCode, sockException.Message)); + throw new FireFoxException("Unable to connect to mozrepl, please make sure you have correctly installed the mozrepl plugin", sockException); } } @@ -219,7 +232,7 @@ CloseExistingFireFoxInstances(); if (string.IsNullOrEmpty(url)) url = "about:blank"; - FireFox.CreateProcess(url + " -jssh", true); + FireFox.CreateProcess(url, true); if (IsMainWindowVisible) return; if (!IsRestoreSessionDialogVisible) return; @@ -235,7 +248,7 @@ { if (Connected) { - throw new FireFoxException("Already connected to jssh server."); + throw new FireFoxException("Already connected to mozrepl server."); } } @@ -260,14 +273,8 @@ /// </summary> public override void InitializeDocument() { - // Check to see if setting the reference (and doing the loop for activeElement which is time consuming) - // is needed. - var needToUpdateDocumentReference = WriteAndReadAsBool("{0} != {1}.document", DocumentVariableName, WindowVariableName); - if (!needToUpdateDocumentReference) return; + WriteAndRead("if(typeof(w0)!=='undefined'){0}.enter(w0.content);true", PromptName); - // Sets up the document variable - Write("var {0} = {1}.document;", DocumentVariableName, WindowVariableName); - if (!EmulateActiveElement()) return; // Javascript to implement document.activeElement if not supported by browser (FireFox 2.x) @@ -308,7 +315,8 @@ { try { - var windowCount = WriteAndReadAsInt("getWindows().length", null); + WriteAndRead("{0}.home();", PromptName); + var windowCount = WriteAndReadAsInt("{0}.getWindows().length", PromptName); Logger.LogDebug(string.Format("Closing window. {0} total windows found", windowCount)); SendCommand(string.Format("{0}.close();", WindowVariableName)); if (windowCount == 1) @@ -320,12 +328,12 @@ else { TryFuncUntilTimeOut waiter = new TryFuncUntilTimeOut(TimeSpan.FromMilliseconds(2000)); - bool windowClosed = waiter.Try<bool>(() => { return WriteAndReadAsInt("getWindows().length", null) == windowCount - 1; }); + bool windowClosed = waiter.Try<bool>(() => { return WriteAndReadAsInt("{0}.getWindows().length", PromptName) == windowCount - 1; }); } } catch (IOException ex) { - Logger.LogDebug("Error communicating with jssh server to initiate shut down, message: {0}", ex.Message); + Logger.LogDebug("Error communicating with mozrepl server to initiate shut down, message: {0}", ex.Message); } } } @@ -375,13 +383,13 @@ public void CloseConnection() { - Logger.LogDebug("Closing connection to jssh."); + Logger.LogDebug("Closing connection to mozrepl."); _telnetSocket.Close(); Connected = false; } /// <summary> - /// Writes the specified data to the jssh server. + /// Writes the specified data to the mozrepl server. /// </summary> /// <param name="data"> /// The data. @@ -397,7 +405,7 @@ var command = UtilityClass.StringFormat(data, args); SendCommand(command); - ReadResponse(resultExpected, checkForErrors); + ReadResponse(checkForErrors); } /// <summary> @@ -414,12 +422,12 @@ return; } - if (response.StartsWith("SyntaxError", StringComparison.InvariantCultureIgnoreCase) || + if (response.StartsWith("!!! Error", StringComparison.InvariantCultureIgnoreCase) || response.StartsWith("TypeError", StringComparison.InvariantCultureIgnoreCase) || response.StartsWith("uncaught exception", StringComparison.InvariantCultureIgnoreCase) || - response.StartsWith("ReferenceError:", StringComparison.InvariantCultureIgnoreCase)) + response.StartsWith("!!! ReferenceError:", StringComparison.InvariantCultureIgnoreCase)) { - throw new FireFoxException(string.Format("Error sending last message to jssh server: {0}", response)); + throw new FireFoxException(string.Format("Error sending last message to mozrepl server: {0}", response)); } } @@ -432,11 +440,28 @@ /// <returns> /// Response from FireFox with out any of the telnet UI characters /// </returns> - private static string CleanTelnetResponse(string response) + private string CleanTelnetResponse(string response) { // HACK refactor in the future, should find a cleaner way of doing if (!string.IsNullOrEmpty(response)) { + response = response.Replace(string.Format("\r\n{0}> ", PromptName), string.Empty); + response = response.Replace(string.Format("\r\n{0}>", PromptName), string.Empty); + response = response.Replace(string.Format("\n{0}> ", PromptName), string.Empty); + response = response.Replace(string.Format("\n{0}>", PromptName), string.Empty); + response = response.Replace(string.Format("{0}>", PromptName), string.Empty); + response = response.Trim(); + + if (response.StartsWith("\"")) + { + response = response.Substring(1); + } + + if(response.EndsWith("\"")) + { + response = response.Substring(0, response.Length - 1); + } + if (response.EndsWith(string.Format("{0}>", "\n"))) { response = response.Substring(0, response.Length - 2); @@ -493,28 +518,34 @@ /// <param name="windowIndex">Index of the window.</param> internal void DefineDefaultJSVariablesForWindow(int windowIndex) { - Write("var w0 = getWindows()[{0}];", windowIndex.ToString()); - Write("var {0} = {1}", GetChildElementsFunctionName, GetChildElementsFunction()); + Write("{0}.home();", PromptName); + + Write("{0}.getWindows = {1}", PromptName, GetWindowsFunction()); + Write("{0}.loadURI = function(url){{ content.location.href = url; }};", PromptName); + Write("{0}.{1} = {2}", PromptName, GetChildElementsFunctionName, GetChildElementsFunction()); + + Write("var w0 = {0}.getWindows()[{1}];", PromptName, windowIndex.ToString()); Write("var {0} = w0.content;", WindowVariableName); - Write("var {0} = w0.document;", DocumentVariableName); Write("var {0} = w0.getBrowser();", BrowserVariableName); } + private string GetWindowsFunction() + { + return "function() { var windowEnum = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getEnumerator(''); var windows = []; while(windowEnum.hasMoreElements()) windows.push(windowEnum.getNext()); return windows; }"; + } + private static string GetChildElementsFunction() { return "function(node){var a=[];var tags=node.childNodes;for (var i=0;i<tags.length;++i){if (tags[i].nodeType!=3) a.push(tags[i]);} return a;}"; } /// <summary> - /// Reads the response from the jssh server. + /// Reads the response from the mozrepl server. /// </summary> - /// <param name="resultExpected"> - /// The result Expected. - /// </param> /// <param name="checkForErrors"> /// The check For Errors. /// </param> - private void ReadResponse(bool resultExpected, bool checkForErrors) + private void ReadResponse(bool checkForErrors) { var stream = new NetworkStream(_telnetSocket); @@ -530,17 +561,26 @@ System.Threading.Thread.Sleep(10); } - string readData; + var readData = String.Empty; + var EOR = string.Format("{0}{1}", PromptName, _promptSuffix); + const string emergency = "Host context unloading! Going back to creation context."; + do { var read = stream.Read(buffer, 0, bufferSize); - readData = Encoding.UTF8.GetString(buffer, 0, read); - - Logger.LogDebug("jssh says: '{0}'", readData.Replace("\n", "[newline]")); - LastResponseRaw += readData; - AddToLastResponse(CleanTelnetResponse(readData)); + readData += Encoding.UTF7.GetString(buffer, 0, read); + Logger.LogDebug("readdata on {1}: {0}", readData, _prompt); + + // Recover + if (readData.Contains(emergency)) + { + readData = string.Empty; + SendCommand(";"); + } } - while (!readData.EndsWith("> ") || stream.DataAvailable || (resultExpected && string.IsNullOrEmpty(LastResponse))); + while (!readData.EndsWith(EOR)); + LastResponseRaw += readData; + AddToLastResponse(CleanTelnetResponse(readData)); // Convert \n to newline if (LastResponse != null) @@ -570,9 +610,9 @@ throw new FireFoxException("You must connect before writing to the server."); } - var bytes = Encoding.ASCII.GetBytes(data + "\n"); + var bytes = Encoding.ASCII.GetBytes(data + "\r\n"); - Logger.LogDebug("sending: {0}", data); + Logger.LogDebug("sending on {1}: {0}", data, _prompt); using (var networkStream = new NetworkStream(_telnetSocket)) { networkStream.Write(bytes, 0, bytes.Length); @@ -600,20 +640,31 @@ } /// <summary> - /// Writes a line to the jssh server. + /// Writes a line to the mozrepl server. /// </summary> private void WaitForConnectionEstablished() { - SendCommand("\n"); - var rawResponse = string.Empty; - var responseToWaitFor = "Welcome to the Mozilla JavaScript Shell!\n\n> \n> \n> "; // .Replace("\n", Environment.NewLine); + var responseToWaitFor = "Welcome to MozRepl"; // .Replace("\n", Environment.NewLine); - while (rawResponse != responseToWaitFor) + while (!rawResponse.Contains(responseToWaitFor)) { - ReadResponse(false, true); + ReadResponse(true); rawResponse += LastResponseRaw; } + + SendCommand(";"); + rawResponse = string.Empty; + while (!rawResponse.Contains(_promptSuffix)) + { + ReadResponse(true); + rawResponse += LastResponseRaw; + } + + _prompt = string.Format("repl{0}", ((IPEndPoint)_telnetSocket.LocalEndPoint).Port); + SendCommand(string.Format("repl.rename(\"{0}\");", _prompt)); + ReadResponse(true); + Logger.LogDebug("mozrepl connected: '{0}'", LastResponseRaw); } } -} \ No newline at end of file +} Modified: trunk/src/Core/Native/Mozilla/FireFoxException.cs =================================================================== --- trunk/src/Core/Native/Mozilla/FireFoxException.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/Core/Native/Mozilla/FireFoxException.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -27,6 +27,13 @@ { public FireFoxException(string message) : base(message) { } public FireFoxException(string message, Exception innerexception) : base(message, innerexception) { } - public FireFoxException(SerializationInfo info, StreamingContext context) : base(info, context) {} + public FireFoxException(SerializationInfo info, StreamingContext context) : base(info, context) { } + + public static FireFoxException FireFoxNotInstalled() + { + return new FireFoxException( + "Unable to determine the current version of FireFox using the registry, please make sure you have installed FireFox and MozRepl correctly"); + + } } } \ No newline at end of file Modified: trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs =================================================================== --- trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -278,7 +278,25 @@ Assert.That(link.Exists); }); } + + [Test, Ignore("Not working yet")] + public void Should_be_able_to_filter_an_already_filtered_element_collection() + { + ExecuteTest(browser => + { + // GIVEN + var forms = browser.Elements.Filter(Find.BySelector("form")); + Console.WriteLine(">>> count: " +forms.Count); + // WHEN + var first = forms.Filter(Find.BySelector(":first")).First(); + + // THEN + Assert.That(first.Exists); + Assert.That(first.Id, Is.EqualTo("name")); + }); + } + public override Uri TestPageUri { get { return MainURI; } Modified: trunk/src/UnitTests/BrowserTests.cs =================================================================== --- trunk/src/UnitTests/BrowserTests.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/UnitTests/BrowserTests.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -249,7 +249,7 @@ } - [Test] + [Test, Ignore("MOZREPL ISSUE")] public void Reopen() { ExecuteTest(browser => Modified: trunk/src/UnitTests/Native/FireFoxTests/FireEventTests.cs =================================================================== --- trunk/src/UnitTests/Native/FireFoxTests/FireEventTests.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/UnitTests/Native/FireFoxTests/FireEventTests.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -215,6 +215,10 @@ throw new NotImplementedException(); } + public override string PromptName + { + get { throw new NotImplementedException(); } + } #endregion } Modified: trunk/src/UnitTests/Native/FireFoxTests/FireFoxTests.cs =================================================================== --- trunk/src/UnitTests/Native/FireFoxTests/FireFoxTests.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/UnitTests/Native/FireFoxTests/FireFoxTests.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -103,6 +103,7 @@ [Test] public void FireFoxCanAttachByTitle() { + Settings.AttachToBrowserTimeOut = 3; using (var fireFox = new FireFox(NewWindowUri)) { fireFox.Links[0].Click(); @@ -115,6 +116,7 @@ [Test] public void FireFoxCanAttachByUri() { + Settings.AttachToBrowserTimeOut = 3; using (var fireFox = new FireFox(NewWindowUri)) { fireFox.Links[0].Click(); @@ -127,6 +129,7 @@ [Test] public void FireFoxCanDisposeAttachedBrowser() { + Settings.AttachToBrowserTimeOut = 3; using (var fireFox = new FireFox(NewWindowUri)) { fireFox.Buttons[0].Click(); Modified: trunk/src/UnitTests/Native/JSElementCollectionBaseTests.cs =================================================================== --- trunk/src/UnitTests/Native/JSElementCollectionBaseTests.cs 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/UnitTests/Native/JSElementCollectionBaseTests.cs 2012-04-23 20:10:18 UTC (rev 1217) @@ -116,6 +116,11 @@ { return; } + + public override string PromptName + { + get { return string.Empty; } + } } public class WrappedJSElementCollection : JSElementCollectionBase Modified: trunk/src/UnitTests/UnitTests.csproj =================================================================== --- trunk/src/UnitTests/UnitTests.csproj 2012-04-11 21:34:38 UTC (rev 1216) +++ trunk/src/UnitTests/UnitTests.csproj 2012-04-23 20:10:18 UTC (rev 1217) @@ -184,7 +184,9 @@ </ProjectReference> </ItemGroup> <ItemGroup> - <None Include="App.config" /> + <None Include="App.config"> + <SubType>Designer</SubType> + </None> <None Include="html\html_with_object_tag.html"> <CopyToOutputDirectory>Never</CopyToOutputDirectory> </None> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-04-11 21:34:48
|
Revision: 1216 http://watin.svn.sourceforge.net/watin/?rev=1216&view=rev Author: jvmenen Date: 2012-04-11 21:34:38 +0000 (Wed, 11 Apr 2012) Log Message: ----------- Initial drop of WebDriver as a BrowserDriver implementation for WatiN. Using the WebDriver.Net bindings. Added Paths: ----------- trunk/src/BrowserDrivers/ trunk/src/BrowserDrivers/WebDriver/ trunk/src/BrowserDrivers/WebDriver/WatinWebDriverBrowser.sln trunk/src/BrowserDrivers/WebDriver/packages/ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/ASL - Apache Software Foundation License.txt trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/BreakingChanges.txt trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Castle.Core.3.0.0.4001.nupkg trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Changes.txt trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Committers.txt trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net35/ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net35/Castle.Core.dll trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net35/Castle.Core.xml trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net40-client/ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net40-client/Castle.Core.dll trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net40-client/Castle.Core.xml trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/sl4/ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/sl4/Castle.Core.dll trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/sl4/Castle.Core.xml trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/readme.txt trunk/src/BrowserDrivers/WebDriver/packages/DotNetZip.1.9.1.8/ trunk/src/BrowserDrivers/WebDriver/packages/DotNetZip.1.9.1.8/DotNetZip.1.9.1.8.nupkg trunk/src/BrowserDrivers/WebDriver/packages/DotNetZip.1.9.1.8/lib/ trunk/src/BrowserDrivers/WebDriver/packages/DotNetZip.1.9.1.8/lib/net20/ trunk/src/BrowserDrivers/WebDriver/packages/DotNetZip.1.9.1.8/lib/net20/Ionic.Zip.dll trunk/src/BrowserDrivers/WebDriver/packages/DotNetZip.1.9.1.8/lib/net20/Ionic.Zip.xml trunk/src/BrowserDrivers/WebDriver/packages/DotNetZip.1.9.1.8/lib/sl/ trunk/src/BrowserDrivers/WebDriver/packages/DotNetZip.1.9.1.8/lib/sl/Ionic.Zip.dll trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/ trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/BreakingChanges.txt trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/CHANGELOG.txt trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/LICENSE.txt trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/NSubstitute.1.3.0.0.nupkg trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/README.txt trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/acknowledgements.txt trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/lib/ trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/lib/NET35/ trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/lib/NET35/NSubstitute.XML trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/lib/NET35/NSubstitute.dll trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/lib/NET40/ trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/lib/NET40/NSubstitute.XML trunk/src/BrowserDrivers/WebDriver/packages/NSubstitute.1.3.0.0/lib/NET40/NSubstitute.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/ trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/Logo.ico trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/NUnit.2.5.10.11092.nupkg trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/NUnitFitTests.html trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/fit-license.txt trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/lib/ trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/lib/nunit.framework.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/lib/nunit.framework.xml trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/lib/nunit.mocks.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/lib/pnunit.framework.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/license.txt trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/ trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/NUnitTests.VisualState.xml trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/NUnitTests.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/NUnitTests.nunit trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/TestResult.xml trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/agent.conf trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/agent.log.conf trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/launcher.log.conf trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/ trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/Failure.png trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/Ignored.png trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/Inconclusive.png trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/Skipped.png trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/Success.png trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/fit.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/log4net.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/nunit-console-runner.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/nunit-gui-runner.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/nunit.core.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/nunit.core.interfaces.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/nunit.fixtures.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/nunit.uiexception.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/nunit.uikit.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/lib/nunit.util.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-agent-x86.exe trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-agent-x86.exe.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-agent.exe trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-agent.exe.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-console-x86.exe trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-console-x86.exe.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-console.exe trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-console.exe.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-x86.exe trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit-x86.exe.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit.exe trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit.exe.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/nunit.framework.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/pnunit-agent.exe trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/pnunit-agent.exe.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/pnunit-launcher.exe trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/pnunit-launcher.exe.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/pnunit.framework.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/pnunit.tests.dll trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/runFile.exe trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/runFile.exe.config trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/runpnunit.bat trunk/src/BrowserDrivers/WebDriver/packages/NUnit.2.5.10.11092/tools/test.conf trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/ trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/Newtonsoft.Json.4.0.6.nupkg trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/ trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net20/ trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net20/Newtonsoft.Json.dll trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net20/Newtonsoft.Json.pdb trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net20/Newtonsoft.Json.xml trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net35/ trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net35/Newtonsoft.Json.dll trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net35/Newtonsoft.Json.pdb trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net35/Newtonsoft.Json.xml trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net40/ trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net40/Newtonsoft.Json.dll trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net40/Newtonsoft.Json.pdb trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/net40/Newtonsoft.Json.xml trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl3-wp/ trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl3-wp/Newtonsoft.Json.dll trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl3-wp/Newtonsoft.Json.pdb trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl3-wp/Newtonsoft.Json.xml trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl4/ trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl4/Newtonsoft.Json.dll trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl4/Newtonsoft.Json.pdb trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl4/Newtonsoft.Json.xml trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl4-windowsphone71/ trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl4-windowsphone71/Newtonsoft.Json.dll trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl4-windowsphone71/Newtonsoft.Json.pdb trunk/src/BrowserDrivers/WebDriver/packages/Newtonsoft.Json.4.0.6/lib/sl4-windowsphone71/Newtonsoft.Json.xml trunk/src/BrowserDrivers/WebDriver/packages/Selenium.Support.2.18.1/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.Support.2.18.1/Selenium.Support.2.18.1.nupkg trunk/src/BrowserDrivers/WebDriver/packages/Selenium.Support.2.18.1/lib/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.Support.2.18.1/lib/net35/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.Support.2.18.1/lib/net35/WebDriver.Support.dll trunk/src/BrowserDrivers/WebDriver/packages/Selenium.Support.2.18.1/lib/net35/WebDriver.Support.xml trunk/src/BrowserDrivers/WebDriver/packages/Selenium.Support.2.18.1/lib/net40/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.Support.2.18.1/lib/net40/WebDriver.Support.dll trunk/src/BrowserDrivers/WebDriver/packages/Selenium.Support.2.18.1/lib/net40/WebDriver.Support.xml trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.0/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.0/Selenium.WebDriver.2.18.0.nupkg trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.0/lib/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.0/lib/net35/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.0/lib/net35/WebDriver.dll trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.0/lib/net35/WebDriver.xml trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.0/lib/net40/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.0/lib/net40/WebDriver.dll trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.0/lib/net40/WebDriver.xml trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.1/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.1/Selenium.WebDriver.2.18.1.nupkg trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.1/lib/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.1/lib/net35/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.1/lib/net35/WebDriver.dll trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.1/lib/net35/WebDriver.xml trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.1/lib/net40/ trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.1/lib/net40/WebDriver.dll trunk/src/BrowserDrivers/WebDriver/packages/Selenium.WebDriver.2.18.1/lib/net40/WebDriver.xml trunk/src/BrowserDrivers/WebDriver/packages/repositories.config trunk/src/BrowserDrivers/WebDriver/src/ trunk/src/BrowserDrivers/WebDriver/src/Properties/ trunk/src/BrowserDrivers/WebDriver/src/Properties/AssemblyInfo.cs trunk/src/BrowserDrivers/WebDriver/src/WatinWebDriver.csproj trunk/src/BrowserDrivers/WebDriver/src/WebDriver.cs trunk/src/BrowserDrivers/WebDriver/src/WebDriverBrowser.cs trunk/src/BrowserDrivers/WebDriver/src/WebDriverNativeDocument.cs trunk/src/BrowserDrivers/WebDriver/src/WebDriverNativeElement.cs trunk/src/BrowserDrivers/WebDriver/src/WebDriverNativeElementCollection.cs trunk/src/BrowserDrivers/WebDriver/src/WebDriverNativeElementCollectionSpecial.cs trunk/src/BrowserDrivers/WebDriver/src/WebDriverSelectAction.cs trunk/src/BrowserDrivers/WebDriver/src/WebDriverTypeText.cs trunk/src/BrowserDrivers/WebDriver/src/chromedriver.exe trunk/src/BrowserDrivers/WebDriver/src/packages.config trunk/src/BrowserDrivers/WebDriver/unittests/ trunk/src/BrowserDrivers/WebDriver/unittests/Properties/ trunk/src/BrowserDrivers/WebDriver/unittests/Properties/AssemblyInfo.cs trunk/src/BrowserDrivers/WebDriver/unittests/WDBrowserTestManager.cs trunk/src/BrowserDrivers/WebDriver/unittests/WatiNWebDriverUnitTests.csproj trunk/src/BrowserDrivers/WebDriver/unittests/WebDriverNativeElementCollectionSpecialTests.cs trunk/src/BrowserDrivers/WebDriver/unittests/WebDriverTests.cs trunk/src/BrowserDrivers/WebDriver/unittests/packages.config Property changes on: trunk/src/BrowserDrivers/WebDriver ___________________________________________________________________ Added: svn:ignore + _ReSharper.WatinWebDriverBrowser *.ncrunchsolution *.user *.suo Added: trunk/src/BrowserDrivers/WebDriver/WatinWebDriverBrowser.sln =================================================================== --- trunk/src/BrowserDrivers/WebDriver/WatinWebDriverBrowser.sln (rev 0) +++ trunk/src/BrowserDrivers/WebDriver/WatinWebDriverBrowser.sln 2012-04-11 21:34:38 UTC (rev 1216) @@ -0,0 +1,92 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core", "..\..\Core\Core.csproj", "{217E2D34-F6DF-431B-AC5A-B368F481A530}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "..\..\UnitTests\UnitTests.csproj", "{D6E231B3-28D9-4F73-9586-738FB528B4DB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WatinWebDriver", "src\WatinWebDriver.csproj", "{6BDD4419-AA39-4597-9435-03D34B14D995}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WatiNWebDriverUnitTests", "unittests\WatiNWebDriverUnitTests.csproj", "{EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + AutomatedDebug|Any CPU = AutomatedDebug|Any CPU + ChromeTesting|Any CPU = ChromeTesting|Any CPU + Debug (.Net 3.5)|Any CPU = Debug (.Net 3.5)|Any CPU + Debug (.Net 4.0)|Any CPU = Debug (.Net 4.0)|Any CPU + Debug|Any CPU = Debug|Any CPU + Release (.Net 3.5)|Any CPU = Release (.Net 3.5)|Any CPU + Release (.Net 4.0)|Any CPU = Release (.Net 4.0)|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {217E2D34-F6DF-431B-AC5A-B368F481A530}.AutomatedDebug|Any CPU.ActiveCfg = AutomatedDebug|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.AutomatedDebug|Any CPU.Build.0 = AutomatedDebug|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.ChromeTesting|Any CPU.ActiveCfg = AutomatedDebug|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.ChromeTesting|Any CPU.Build.0 = AutomatedDebug|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug (.Net 3.5)|Any CPU.ActiveCfg = Debug (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug (.Net 3.5)|Any CPU.Build.0 = Debug (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug (.Net 4.0)|Any CPU.ActiveCfg = Debug (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug (.Net 4.0)|Any CPU.Build.0 = Debug (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug|Any CPU.ActiveCfg = AutomatedDebug|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug|Any CPU.Build.0 = AutomatedDebug|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release (.Net 3.5)|Any CPU.ActiveCfg = Release (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release (.Net 3.5)|Any CPU.Build.0 = Release (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release (.Net 4.0)|Any CPU.ActiveCfg = Release (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release (.Net 4.0)|Any CPU.Build.0 = Release (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release|Any CPU.ActiveCfg = Release (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release|Any CPU.Build.0 = Release (.Net 4.0)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.AutomatedDebug|Any CPU.ActiveCfg = Release (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.AutomatedDebug|Any CPU.Build.0 = Release (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.ChromeTesting|Any CPU.ActiveCfg = ChromeTesting|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.ChromeTesting|Any CPU.Build.0 = ChromeTesting|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug (.Net 3.5)|Any CPU.ActiveCfg = Debug (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug (.Net 3.5)|Any CPU.Build.0 = Debug (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug (.Net 4.0)|Any CPU.ActiveCfg = Debug (.Net 4.0)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug (.Net 4.0)|Any CPU.Build.0 = Debug (.Net 4.0)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug|Any CPU.ActiveCfg = Debug (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug|Any CPU.Build.0 = Debug (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release (.Net 3.5)|Any CPU.ActiveCfg = Release (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release (.Net 3.5)|Any CPU.Build.0 = Release (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release (.Net 4.0)|Any CPU.ActiveCfg = Release (.Net 4.0)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release (.Net 4.0)|Any CPU.Build.0 = Release (.Net 4.0)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release|Any CPU.ActiveCfg = Release (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release|Any CPU.Build.0 = Release (.Net 3.5)|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.AutomatedDebug|Any CPU.ActiveCfg = Debug|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.AutomatedDebug|Any CPU.Build.0 = Debug|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.ChromeTesting|Any CPU.ActiveCfg = Release|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.ChromeTesting|Any CPU.Build.0 = Release|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Debug (.Net 3.5)|Any CPU.ActiveCfg = Debug|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Debug (.Net 3.5)|Any CPU.Build.0 = Debug|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Debug (.Net 4.0)|Any CPU.ActiveCfg = Debug|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Debug (.Net 4.0)|Any CPU.Build.0 = Debug|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Release (.Net 3.5)|Any CPU.ActiveCfg = Release|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Release (.Net 3.5)|Any CPU.Build.0 = Release|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Release (.Net 4.0)|Any CPU.ActiveCfg = Release|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Release (.Net 4.0)|Any CPU.Build.0 = Release|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6BDD4419-AA39-4597-9435-03D34B14D995}.Release|Any CPU.Build.0 = Release|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.AutomatedDebug|Any CPU.ActiveCfg = Debug|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.AutomatedDebug|Any CPU.Build.0 = Debug|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.ChromeTesting|Any CPU.ActiveCfg = Release|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.ChromeTesting|Any CPU.Build.0 = Release|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Debug (.Net 3.5)|Any CPU.ActiveCfg = Debug|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Debug (.Net 3.5)|Any CPU.Build.0 = Debug|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Debug (.Net 4.0)|Any CPU.ActiveCfg = Debug|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Debug (.Net 4.0)|Any CPU.Build.0 = Debug|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Release (.Net 3.5)|Any CPU.ActiveCfg = Release|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Release (.Net 3.5)|Any CPU.Build.0 = Release|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Release (.Net 4.0)|Any CPU.ActiveCfg = Release|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Release (.Net 4.0)|Any CPU.Build.0 = Release|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EA31AAEC-3E40-43E3-8AC9-64AB11ED0375}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal Added: trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/ASL - Apache Software Foundation License.txt =================================================================== --- trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/ASL - Apache Software Foundation License.txt (rev 0) +++ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/ASL - Apache Software Foundation License.txt 2012-04-11 21:34:38 UTC (rev 1216) @@ -0,0 +1,57 @@ +Apache License, Version 2.0 + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and + + 2. You must cause any modified files to carry prominent notices stating that You changed the files; and + + 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS Added: trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/BreakingChanges.txt =================================================================== --- trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/BreakingChanges.txt (rev 0) +++ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/BreakingChanges.txt 2012-04-11 21:34:38 UTC (rev 1216) @@ -0,0 +1,70 @@ +================================================================================================ +change - Removed overloads of logging methods that were taking format string from ILogger and + ILogger and IExtendedLogger and didn't have word Format in their name. + For example: + void Error(string format, params object[] args); // was removed + void ErrorFormat(string format, params object[] args); //use this one instead + + +impact - low +fixability - medium +revision - + +description - To minimize confusion and duplication those methods were removed. + +fix - Use methods that have explicit "Format" word in their name and same signature. +================================================================================================ +change - Removed WebLogger and WebLoggerFactory + +impact - low +fixability - medium +revision - + +description - To minimize management overhead the classes were removed so that only single + Client Profile version of Castle.Core can be distributed. + +fix - You can use NLog or Log4Net web logger integration, or reuse implementation of existing + web logger and use it as a custom logger. + +================================================================================================ +change - Removed obsolete overload of ProxyGenerator.CreateClassProxy + +impact - low +fixability - trivial +revision - + +description - Deprecated overload of ProxyGenerator.CreateClassProxy was removed to keep the + method consistent with other methods and to remove confusion + +fix - whenever removed overload was used, use one of the other overloads. + +================================================================================================ +change - IProxyGenerationHook.NonVirtualMemberNotification method was renamed + +impact - high +fixability - easy +revision - + +description - to accommodate class proxies with target method NonVirtualMemberNotification on + IProxyGenerationHook type was renamed to more accurate NonProxyableMemberNotification + since for class proxies with target not just methods but also fields and other member that + break the abstraction will be passed to this method. + +fix - whenever NonVirtualMemberNotification is used/implemented change the method name to + NonProxyableMemberNotification. Implementors should also accommodate possibility that not + only MethodInfos will be passed as method's second parameter. + +================================================================================================ +change - DynamicProxy will now allow to intercept members of System.Object + +impact - very low +fixability - easy +revision - + +description - to allow scenarios like mocking of System.Object members, DynamicProxy will not + disallow proxying of these methods anymore. AllMethodsHook (default IProxyGenerationHook) + will still filter them out though. + +fix - whenever custom IProxyGenerationHook is used, user should account for System.Object's + members being now passed to ShouldInterceptMethod and NonVirtualMemberNotification methods + and if neccessary update the code to handle them appropriately. Added: trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Castle.Core.3.0.0.4001.nupkg =================================================================== (Binary files differ) Property changes on: trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Castle.Core.3.0.0.4001.nupkg ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Changes.txt =================================================================== --- trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Changes.txt (rev 0) +++ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Changes.txt 2012-04-11 21:34:38 UTC (rev 1216) @@ -0,0 +1,171 @@ +3.0.0 (2011-12-13) +================== +no major changes + +3.0.0 RC 1 (2011-11-20) +================== +- Applied Jeff Sharps patch that refactored Xml DictionaryAdapter to improve maintainability and enable more complete functionality + +- fixed DYNPROXY-165 - Object.GetType() and Object.MemberwiseClone() should be ignored and not reported as non-interceptable to IProxyGenerationHook +- fixed DYNPROXY-164 - Invalid Proxy type generated when there are more than one base class generic constraints +- fixed DYNPROXY-162 - ref or out parameters can not be passed back if proxied method throw an exception + +3.0.0 beta 1 (2011-08-14) +================== +- fixed CORE-37 - TAB characters in the XML Configuration of a component parameter is read as String.Empty +- fixed DYNPROXY-161 - Strong Named DynamicProxy Assembly Not Available in Silverligh +- fixed DYNPROXY-159 - Sorting MemberInfo array for serialization has side effects +- fixed DYNPROXY-158 - Can't create class proxy with target and without target in same ProxyGenerator +- fixed DYNPROXY-153 - When proxying a generic interface which has an interface as GenericType . No proxy can be created +- fixed DYNPROXY-151 - Cast error when using attributes + +- implemented CORE-33 - Add lazy logging +- implemented DYNPROXY-156 - Provide mechanism for interceptors to implement retry logic + +- removed obsolete members from ILogger and its implementations + +2.5.2 (2010-11-15) +================== +- fixed DYNPROXY-150 - Finalizer should not be proxied +- implemented DYNPROXY-149 - Make AllMethodsHook members virtual so it can be used as a base class +- fixed DYNPROXY-147 - Can't crete class proxies with two non-public methods having same argument types but different return type +- fixed DYNPROXY-145 Unable to proxy System.Threading.SynchronizationContext (.NET 4.0) +- fixed DYNPROXY-144 - params argument not supported in constructor +- fixed DYNPROXY-143 - Permit call to reach "non-proxied" methods of inherited interfaces +- implemented DYNPROXY-139 - Better error message +- fixed DYNPROXY-133 - Debug assertion in ClassProxyInstanceContributor fails when proxying ISerializable with an explicit implementation of GetObjectData +- fixed CORE-32 - Determining if permission is granted via PermissionUtil does not work in .NET 4 +- applied patch by Alwin Meijs - ExtendedLog4netFactory can be configured with a stream from for example an embedded log4net xml config +- Upgraded NLog to 2.0 Beta 1 +- Added DefaultXmlSerializer to bridge XPathAdapter with standard Xml Serialization. +- XPathAdapter for DictionaryAdapter added IXPathSerializer to provide hooks for custom serialization. + +2.5.1 (2010-09-21) +================== +- Interface proxy with target Interface now accepts null as a valid target value (which can be replaced at a later stage). +- DictionaryAdapter behavior overrides are now ordered with all other behaviors +- BREAKING CHANGE: removed web logger so that by default Castle.Core works in .NET 4 client profile +- added paramter to ModuleScope disabling usage of signed modules. This is to workaround issue DYNPROXY-134. Also a descriptive exception message is being thrown now when the issue is detected. +- Added IDictionaryBehaviorBuilder to allow grouping behaviors +- Added GenericDictionaryAdapter to simplify generic value sources +- fixed issue DYNPROXY-138 - Error message missing space +- fixed false positive where DynamicProxy would not let you proxy interface with target interface when target object was a COM object. +- fixed ReflectionBasedDictionaryAdapter when using indexed properties + +2.5.0 (2010-08-21) +================== +- DynamicProxy will now not replicate non-public attribute types +- Applied patch from Kenneth Siewers M\xF8ller which adds parameterless constructor to DefaultSmtpSender implementation, to be able to configure the inner SmtpClient from the application configuration file (system.net.smtp). +- added support for .NET 4 and Silverlight 4, updated solution to VisualStudio 2010 +- Removed obsolete overload of CreateClassProxy +- Added class proxy with taget +- Added ability to intercept explicitly implemented generic interface methods on class proxy. +- DynamicProxy does not disallow intercepting members of System.Object anymore. AllMethodsHook will still filter them out though. +- Added ability to intercept explicitly implemented interface members on class proxy. Does not support generic members. +- Merged DynamicProxy into Core binary +- fixed DYNPROXY-ISSUE-132 - "MetaProperty equals implementation incorrect" +- Fixed bug in DiagnosticsLoggerTestCase, where when running as non-admin, the teardown will throw SecurityException (contributed by maxild) +- Split IoC specific classes into Castle.Windsor project +- Merged logging services solution +- Merged DynamicProxy project + +1.2.0 (2010-01-11) +================== + +- Added IEmailSender interface and its default implementation + +1.2.0 beta (2009-12-04) +================== + +- BREAKING CHANGE - added ChangeProxyTarget method to IChangeProxyTarget interface +- added docs to IChangeProxyTarget methods +- Fixed DYNPROXY-ISSUE-108 - Obtaining replicated custom attributes on proxy may fail when property setter throws exception on default value +- Moved custom attribute replication from CustomAttributeUtil to new interface - IAttributeDisassembler +- Exposed IAttributeDisassembler via ProxyGenerationOptions, so that users can plug their implementation for some convoluted scenarios. (for Silverlight) +- Moved IInterceptorSelector from Dynamic Proxy to Core (IOC-ISSUE-156) + +1.1.0 (2009-05-04) +================== + +- Applied Eric Hauser's patch fixing CORE-ISSUE-22 + "Support for environment variables in resource URI" + +- Applied Gauthier Segay's patch fixing CORE-ISSUE-20 + "Castle.Core.Tests won't build via nant because it use TraceContext without referencing System.Web.dll" + +- Added simple interface to ComponentModel to make optional properties required. + +- Applied Mark's -- <mwa...@gm...> -- patch that changes + the Core to support being compiled for Silverlight 2 + +- Applied Louis DeJardin's patch adding TraceLogger as a new logger implementation + +- Applied Chris Bilson's patch fixing CORE-15 + "WebLogger Throws When Logging Outside of an HttpContext" + +Release Candidate 3 +=================== + +- Added IServiceProviderEx which extends IServiceProvider + +- Added Pair<T,S> class. + +- Applied Bill Pierce's patch fixing CORE-9 + "Allow CastleComponent Attribute to Specify Lifestyle in Constructor" + +- Added UseSingleInterfaceProxy to CompomentModel to control the proxying + behavior while maintaining backward compatibility. + Added the corresponding ComponentProxyBehaviorAttribute. + +- Made NullLogger and IExtnededLogger + +- Enabled a new format on ILogger interface, with 6 overloads for each method: + Debug(string) + Debug(string, Exception) + Debug(string, params object[]) + DebugFormat(string, params object[]) + DebugFormat(Exception, string, params object[]) + DebugFormat(IFormatProvider, string, params object[]) + DebugFormat(IFormatProvider, Exception, string, params object[]) + + The "FatalError" overloads where marked as [Obsolete], replaced by "Fatal" and "FatalFormat". + +0.0.1.0 +======= + +- Included IProxyTargetAccessor + +- Removed IMethodInterceptor and IMethodInvocation, that have been replaced + by IInterceptor and IInvocation + +- Added FindByPropertyInfo to PropertySetCollection + +- Made the DependencyModel.IsOptional property writable + +- Applied Curtis Schlak's patch fixing IOC-27 + "assembly resource format only works for resources where the assemblies name and default namespace are the same." + + Quoting: + + "I chose to preserve backwards compatibility by implementing the code in the + reverse order as suggested by the reporter. Given the following URI for a resource: + + assembly://my.cool.assembly/context/moo/file.xml + + It will initially look for an embedded resource with the manifest name of + "my.cool.assembly.context.moo.file.xml" in the loaded assembly my.cool.assembly.dll. + If it does not find it, then it looks for the embedded resource with the manifest name + of "context.moo.file.xml". + +- IServiceEnabledComponent Introduced to be used across the project as + a standard way to have access to common services, for example, logger factories + +- Added missing log factories + +- Refactor StreamLogger and DiagnosticLogger to be more consistent behavior-wise + +- Refactored WebLogger to extend LevelFilteredLogger (removed duplication) + +- Refactored LoggerLevel order + +- Project started Added: trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Committers.txt =================================================================== --- trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Committers.txt (rev 0) +++ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/Committers.txt 2012-04-11 21:34:38 UTC (rev 1216) @@ -0,0 +1,80 @@ +This file names who's behind the Castle Team. You can find more about us at http://www.castleproject.org/community/team.html + +Committers +========== +(ordered by the date when joined the project) + +- hammett/Hamilton Verissimo +- Henry Concei\xE7\xE3o +- Kevin Williams +- Craig Neuwirt +- Gilles Bayon +- Andrew Hallock +- Jason Nelson +- Dru Sellers +- John Morales +- CobraLord +- Dan +- Tatham Oddie +- Fabio David Batista +- Chad Humphries +- Ayende Rahien +- G. Richard Bellamy +- Roelof Blom +- Ahmed Ghandour +- Josh Robb +- Ernst Naezer +- Marc-Andre Cournoyer +- Fabian Schmied +- Dave Godfrey +- Markus Zywitza +- Lee Henson +- Ken Egozi +- Chris Ortman +- Jonathon Rossi +- Tuna Toks\xF6z +- Krzysztof Kozmic +- Mauricio Scheffer +- John Simons + +Managers +======== + + Patch Manager + ------------- + + - Josh Robb + + Documentation Manager + --------------------- + + - + + +PMC Members +=========== +(ordered by the date when joined the PMC) + +- hammett/Hamilton Verissimo (Chair) +- Henry Concei\xE7\xE3o +- Kevin Williams +- Craig Neuwirt +- Gilles Bayon +- Chad Humphries +- Ayende Rahien +- Fabio David Batista +- Roelof Blom +- Josh Robb +- Jonathon Rossi + +Emeritus +======== +(no longer active committers) + +- Gilles Bayon +- Dan +- Andrew Hallock +- John Morales +- CobraLord +- Tatham Oddie +- Ahmed Ghandour Added: trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net35/Castle.Core.dll =================================================================== (Binary files differ) Property changes on: trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net35/Castle.Core.dll ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net35/Castle.Core.xml =================================================================== --- trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net35/Castle.Core.xml (rev 0) +++ trunk/src/BrowserDrivers/WebDriver/packages/Castle.Core.3.0.0.4001/lib/net35/Castle.Core.xml 2012-04-11 21:34:38 UTC (rev 1216) @@ -0,0 +1,4820 @@ +<?xml version="1.0"?> +<doc> + <assembly> + <name>Castle.Core</name> + </assembly> + <members> + <member name="T:Castle.Components.DictionaryAdapter.ReferenceAttribute"> + <summary> + Specifies assignment by reference rather than by copying. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IfExistsAttribute"> + <summary> + Suppresses any on-demand behaviors. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.RemoveIfEmptyAttribute"> + <summary> + Removes a property if null or empty string, guid or collection. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.RemoveIfAttribute"> + <summary> + Removes a property if matches value. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.DictionaryBehaviorAttribute"> + <summary> + Assigns a specific dictionary key. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior"> + <summary> + Defines the contract for customizing dictionary access. + </summary> + </member> + <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehavior.Copy"> + <summary> + Copies the dictionary behavior. + </summary> + <returns>null if should not be copied. Otherwise copy.</returns> + </member> + <member name="P:Castle.Components.DictionaryAdapter.IDictionaryBehavior.ExecutionOrder"> + <summary> + Determines relative order to apply related behaviors. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter"> + <summary> + Defines the contract for updating dictionary values. + </summary> + </member> + <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)"> + <summary> + Sets the stored dictionary value. + </summary> + <param name="dictionaryAdapter">The dictionary adapter.</param> + <param name="key">The key.</param> + <param name="value">The stored value.</param> + <param name="property">The property.</param> + <returns>true if the property should be stored.</returns> + </member> + <member name="T:Castle.Components.DictionaryAdapter.ICondition"> + <summary> + Contract for value matching. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.VolatileAttribute"> + <summary> + Indicates that underlying values are changeable and should not be cached. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryInitializer"> + <summary> + Contract for dictionary initialization. + </summary> + </member> + <member name="M:Castle.Components.DictionaryAdapter.IDictionaryInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.Object[])"> + <summary> + Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> + </summary> + <param name="dictionaryAdapter">The dictionary adapter.</param> + <param name="behaviors">The dictionary behaviors.</param> + </member> + <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapterVisitor"> + <summary> + Abstract implementation of <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor"/>. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor"> + <summary> + Conract for traversing a <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryCreate"> + <summary> + Contract for creating additional Dictionary adapters. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"> + <summary> + Contract for manipulating the Dictionary adapter. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryEdit"> + <summary> + Contract for editing the Dictionary adapter. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryNotify"> + <summary> + Contract for managing Dictionary adapter notifications. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidate"> + <summary> + Contract for validating Dictionary adapter. + </summary> + </member> + <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder"> + <summary> + Defines the contract for building <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior"/>s. + </summary> + </member> + <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder.BuildBehaviors"> + <summary> + Builds the dictionary behaviors. + </summary> + <returns></returns> + </member> + <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter"> + <summary> + Abstract adapter for the <see cref="T:System.Collections.IDictionary"/> support + needed by the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory"/> + </summary> + </member> + <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Add(System.Object,System.Object)"> + <summary> + Adds an element with the provided key and value to the <see cref="T:System.Collections.IDictionary"></see> object. + </summary> + <param name="key">The <see cref="T:System.Object"></see> to use as the key of the element to add.</param> + <param name="value">The <see cref="T:System.Object"></see> to use as the value of the element to add.</param> + <exception cref="T:System.ArgumentException">An element with the same key already exists in the <see cref="T:System.Collections.IDictionary"></see> object. </exception> + <exception cref="T:System.ArgumentNullException">key is null. </exception> + <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception> + </member> + <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Clear"> + <summary> + Removes all elements from the <see cref="T:System.Collections.IDictionary"></see> object. + </summary> + <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only. </exception> + </member> + <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Contains(System.Object)"> + <summary> + Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key. + </summary> + <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param> + <returns> + true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false. + </returns> + <exception cref="T:System.ArgumentNullException">key is null. </exception> + </member> + <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.GetEnumerator"> + <summary> + Returns an <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object. + </summary> + <returns> + An <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object. + </returns> + </member> + <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Remove(System.Object)"> + <summary> + Removes the element with the specified key from the <see cref="T:System.Collections.IDictionary"></see> object. + </summary> + <param name="key">The key of the element to remove.</param> + <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception> + <exception cref="T:System.ArgumentNullException">key is null. </exception> + </member> + <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.CopyTo(System.Array,System.Int32)"> + <summary> + Copies the elements of the <see cref="T:System.Collections.ICollection"></see> to an <see cref="T:System.Array"></see>, starting at a particular <see cref="T:System.Array"></see> index. + </summary> + <param name="array">The one-dimensional <see cref="T:System.Array"></see> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"></see>. The <see cref="T:System.Array"></see> must have zero-based indexing.</param> + <param name="index">The zero-based index in array at which copying begins.</param> + <exception cref="T:System.ArgumentNullException">array is null. </exception> + <exception cref="T:System.ArgumentException">The type of the source <see cref="T:System.Collections.ICollection"></see> cannot be cast automatically to the type of the destination array. </exception> + <exception cref="T:System.ArgumentOutOfRangeException">index is less than zero. </exception> + <exception cref="T:System.ArgumentException">array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source <see cref="T:System.Collections.ICollection"></see> is greater than the available space from index to the end of the destination array. </exception> + </member> + <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.System#Collections#IEnumerable#GetEnumerator"> + <summary> + Returns an enumerator that iterates through a ... [truncated message content] |
From: <jv...@us...> - 2012-04-11 21:21:53
|
Revision: 1215 http://watin.svn.sourceforge.net/watin/?rev=1215&view=rev Author: jvmenen Date: 2012-04-11 21:21:47 +0000 (Wed, 11 Apr 2012) Log Message: ----------- Better exceptions if file or class specified in App.config are not found. Modified Paths: -------------- trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs Modified: trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs =================================================================== --- trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs 2012-04-11 19:34:57 UTC (rev 1214) +++ trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs 2012-04-11 21:21:47 UTC (rev 1215) @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; +using System.IO; using NUnit.Framework; using WatiN.Core.Exceptions; using WatiN.Core.Logging; @@ -78,9 +79,15 @@ var dll = section.GetValues(i)[0]; var managerClass = section.GetKey(i); + if (!File.Exists(dll)) + throw new Exception("Could not find file " + dll + ". Unable to run tests. Check UnitTests\\App.config Browsers/Managers section to correct file path."); + var assembly = Assembly.LoadFrom(dll); var manager = (IBrowserTestManager)assembly.CreateInstance(managerClass); + if (manager == null) + throw new Exception("Could not find specified BrowserTestManager class " + managerClass + " in file " + dll + ". Unable to run tests. Check UnitTests\\App.config Browsers/Managers section to correct class name."); + BrowsersToTestWith.Add(manager as IBrowserTestManager); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-04-11 19:35:08
|
Revision: 1214 http://watin.svn.sourceforge.net/watin/?rev=1214&view=rev Author: jvmenen Date: 2012-04-11 19:34:57 +0000 (Wed, 11 Apr 2012) Log Message: ----------- removed not committed file Modified Paths: -------------- trunk/src/UnitTests/UnitTests.csproj Modified: trunk/src/UnitTests/UnitTests.csproj =================================================================== --- trunk/src/UnitTests/UnitTests.csproj 2012-04-11 19:21:36 UTC (rev 1213) +++ trunk/src/UnitTests/UnitTests.csproj 2012-04-11 19:34:57 UTC (rev 1214) @@ -253,7 +253,6 @@ <Compile Include="ResearchTests\JavascriptErrorDetection.cs" /> <Compile Include="ResearchTests\PositionMousePointerOnElementTest.cs" /> <Compile Include="ResearchTests\ScriptLoaderTests.cs" /> - <Compile Include="SteveTests.cs" /> <Compile Include="TestUtils\BaseWatiNTest.cs"> <SubType>Code</SubType> </Compile> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-04-11 19:21:42
|
Revision: 1213 http://watin.svn.sourceforge.net/watin/?rev=1213&view=rev Author: jvmenen Date: 2012-04-11 19:21:36 +0000 (Wed, 11 Apr 2012) Log Message: ----------- Fixed tests due to change to ICssSelector Modified Paths: -------------- trunk/src/UnitTests/IdHinterTests.cs Modified: trunk/src/UnitTests/IdHinterTests.cs =================================================================== --- trunk/src/UnitTests/IdHinterTests.cs 2012-04-07 21:24:22 UTC (rev 1212) +++ trunk/src/UnitTests/IdHinterTests.cs 2012-04-11 19:21:36 UTC (rev 1213) @@ -78,7 +78,7 @@ var selector = hinter.GetSelector(); // THEN - Assert.That(selector, Is.EqualTo("#ID")); + Assert.That(selector.Selector(false), Is.EqualTo("#ID")); } [Test] @@ -105,7 +105,7 @@ var selector = hinter.GetSelector(); // THEN - Assert.That(selector, Is.EqualTo("#ID")); + Assert.That(selector.Selector(false), Is.EqualTo("#ID")); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-04-07 21:24:29
|
Revision: 1212 http://watin.svn.sourceforge.net/watin/?rev=1212&view=rev Author: jvmenen Date: 2012-04-07 21:24:22 +0000 (Sat, 07 Apr 2012) Log Message: ----------- - Fixed for IE (firefox already worked): var element = ie.Frame(name).Div(id).Element(Find.BySelector(....)); will return only matching elements nested in the div inside the frame - upgraded to latest Sizzle version Modified Paths: -------------- trunk/src/Core/Core.csproj trunk/src/Core/Frame.cs trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs trunk/src/Core/Properties/Resources.Designer.cs trunk/src/Core/Properties/Resources.resx trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs trunk/src/UnitTests/html/Index.html Modified: trunk/src/Core/Core.csproj =================================================================== --- trunk/src/Core/Core.csproj 2012-04-05 19:20:52 UTC (rev 1211) +++ trunk/src/Core/Core.csproj 2012-04-07 21:24:22 UTC (rev 1212) @@ -415,11 +415,6 @@ <Compile Include="DialogHandlers\VbScriptMsgBoxDialogHandler.cs"> <SubType>Code</SubType> </Compile> - <Compile Include="Properties\Resources.Designer.cs"> - <AutoGen>True</AutoGen> - <DesignTime>True</DesignTime> - <DependentUpon>Resources.resx</DependentUpon> - </Compile> <Compile Include="ElementTagAttribute.cs" /> <Compile Include="Div.cs"> <SubType>Code</SubType> @@ -502,6 +497,11 @@ <Compile Include="FindByDefaultFactory.cs"> <SubType>Code</SubType> </Compile> + <Compile Include="Properties\Resources.Designer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> <Compile Include="StaticElementFinder.cs" /> <Compile Include="UtilityClasses\EmptyArray.cs" /> <Compile Include="UtilityClasses\LazyList.cs" /> @@ -696,6 +696,7 @@ <ItemGroup> <EmbeddedResource Include="Properties\Resources.resx"> <Generator>ResXFileCodeGenerator</Generator> + <SubType>Designer</SubType> <LastGenOutput>Resources.Designer.cs</LastGenOutput> </EmbeddedResource> </ItemGroup> Modified: trunk/src/Core/Frame.cs =================================================================== --- trunk/src/Core/Frame.cs 2012-04-05 19:20:52 UTC (rev 1211) +++ trunk/src/Core/Frame.cs 2012-04-07 21:24:22 UTC (rev 1212) @@ -47,14 +47,15 @@ _frameDocument = frameDocument; FrameElement = CreateFrameElement(domContainer, frameDocument); - SetFrameHierarchy(parentDocument); + SetFrameHierarchy(parentDocument, frameDocument); } /// <summary> /// This is done to facilitate CSS selector look up in IEElementCollection /// </summary> /// <param name="parentDocument"> </param> - private void SetFrameHierarchy(Frame parentDocument) + /// <param name="frameDocument"> </param> + private void SetFrameHierarchy(Frame parentDocument, INativeDocument frameDocument) { var nameOrId = GetFrameElementNameOrId(FrameElement); @@ -69,7 +70,7 @@ hierarchy = hierarchy + nameOrId; FrameElement.SetAttributeValue("data-watinFrameHierarchy", hierarchy); - //frameDocument.RunScript(frameDocument.JavaScriptVariableName + ".___WATINFRAMEHIERARCHY = '" + hierarchy + "'", "javascript"); + frameDocument.RunScript(frameDocument.JavaScriptVariableName + ".___WATINFRAMEHIERARCHY = '" + hierarchy + "'", "javascript"); } private static string GetFrameElementNameOrId(Element frameElement) Modified: trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-04-05 19:20:52 UTC (rev 1211) +++ trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-04-07 21:24:22 UTC (rev 1212) @@ -94,7 +94,17 @@ } else { - container = _element.GetJavaScriptElementReference(); + var document = _element.AsHtmlElement.document; + var result = new Expando(document).GetValue<string>("___WATINFRAMEHIERARCHY"); + + container = ""; + if (result != null) + container = result; + + if (!string.IsNullOrEmpty(container)) + container += "."; + + container += _element.GetJavaScriptElementReference(); } } Modified: trunk/src/Core/Properties/Resources.Designer.cs =================================================================== --- trunk/src/Core/Properties/Resources.Designer.cs 2012-04-05 19:20:52 UTC (rev 1211) +++ trunk/src/Core/Properties/Resources.Designer.cs 2012-04-07 21:24:22 UTC (rev 1212) @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. -// Runtime Version:4.0.30319.1 +// Runtime Version:4.0.30319.261 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -115,7 +115,7 @@ } /// <summary> - /// Looks up a localized string similar to (function(){var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,b=0,c=Object.prototype.toString,d=!1,e=!0;[0,0].sort(function(){e=!1;return 0});var f=function(b,d,e,i){e=e||[],d=d||document;var j=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var l,m,n,o,p,r,s,t,u=!0,v=f.isXML(d),w=[],x=b;do{a.exec(""),l=a.exec(x);if(l){x=l[3],w.push(l[1]);if(l[2]){o=l[3];break}}}while(l);if(w.length>1&& [rest of string was truncated]";. + /// Looks up a localized string similar to (function(){var n=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,i="sizcache"+(Math.random()+"").replace(".",""),o=0,r=Object.prototype.toString,h=false,g=true,p=/\\/g,v=/\W/;[0,0].sort(function(){g=false;return 0});var d=function(A,e,D,E){D=D||[];e=e||document;var G=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!A||typeof A!=="string"){return D}var x,I,L,w,H,K,J,C,z=true,y=d.isXML(e),B=[],F=A;do{n.exec("");x=n.exec(F) [rest of string was truncated]";. /// </summary> internal static string sizzle { get { Modified: trunk/src/Core/Properties/Resources.resx =================================================================== --- trunk/src/Core/Properties/Resources.resx 2012-04-05 19:20:52 UTC (rev 1211) +++ trunk/src/Core/Properties/Resources.resx 2012-04-07 21:24:22 UTC (rev 1212) @@ -112,10 +112,10 @@ <value>2.0</value> </resheader> <resheader name="reader"> - <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> - <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name="BaseComponentCollection_DoesNotSupportSearchingByEquality" xml:space="preserve"> <value>Collection does not support searching by equality.</value> @@ -136,6 +136,6 @@ <value>Closing IE instance</value> </data> <data name="sizzle" xml:space="preserve"> - <value>(function(){var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,b=0,c=Object.prototype.toString,d=!1,e=!0;[0,0].sort(function(){e=!1;return 0});var f=function(b,d,e,i){e=e||[],d=d||document;var j=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var l,m,n,o,p,r,s,t,u=!0,v=f.isXML(d),w=[],x=b;do{a.exec(""),l=a.exec(x);if(l){x=l[3],w.push(l[1]);if(l[2]){o=l[3];break}}}while(l);if(w.length>1&&h.exec(b))if(w.length===2&&g.relative[w[0]])m=q(w[0]+w[1],d);else{m=g.relative[w[0]]?[d]:f(w.shift(),d);while(w.length)b=w.shift(),g.relative[b]&&(b+=w.shift()),m=q(b,m)}else{!i&&w.length>1&&d.nodeType===9&&!v&&g.match.ID.test(w[0])&&!g.match.ID.test(w[w.length-1])&&(p=f.find(w.shift(),d,v),d=p.expr?f.filter(p.expr,p.set)[0]:p.set[0]);if(d){p=i?{expr:w.pop(),set:k(i)}:f.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),m=p.expr?f.filter(p.expr,p.set):p.set,w.length>0?n=k(m):u=!1;while(w.length)r=w.pop(),s=r,g.relative[r]?s=w.pop():r="",s==null&&(s=d),g.relative[r](n,s,v)}else n=w=[]}n||(n=m),n||f.error(r||b);if(c.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&f.contains(d,n[t]))&&e.push(m[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(m[t]);else e.push.apply(e,n);else k(n,e);o&&(f(o,j,e,i),f.uniqueSort(e));return e};f.uniqueSort=function(a){if(m){d=e,a.sort(m);if(d)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},f.matches=function(a,b){return f(a,null,null,b)},f.matchesSelector=function(a,b){return f(b,null,null,[a]).length>0},f.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=g.order.length;e<f;e++){var h,i=g.order[e];if(h=g.leftMatch[i].exec(a)){var j=h[1];h.splice(1,1);if(j.substr(j.length-1)!=="\\"){h[1]=(h[1]||"").replace(/\\/g,""),d=g.find[i](h,b,c);if(d!=null){a=a.replace(g.match[i],"");break}}}}d||(d=b.getElementsByTagName("*"));return{set:d,expr:a}},f.filter=function(a,b,c,d){var e,h,i=a,j=[],k=b,l=b&&b[0]&&f.isXML(b[0]);while(a&&b.length){for(var m in g.filter)if((e=g.leftMatch[m].exec(a))!=null&&e[2]){var n,o,p=g.filter[m],q=e[1];h=!1,e.splice(1,1);if(q.substr(q.length-1)==="\\")continue;k===j&&(j=[]);if(g.preFilter[m]){e=g.preFilter[m](e,k,c,j,d,l);if(e){if(e===!0)continue}else h=n=!0}if(e)for(var r=0;(o=k[r])!=null;r++)if(o){n=p(o,e,r,k);var s=d^n;c&&n!=null?s?h=!0:k[r]=!1:s&&(j.push(o),h=!0)}if(n!==undefined){c||(k=j),a=a.replace(g.match[m],"");if(!h)return[];break}}if(a===i)if(h==null)f.error(a);else break;i=a}return k},f.error=function(a){throw"Syntax error, unrecognized expression: "+a};var g=f.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+-]?\d+|(?:[+-]?\d+)?n\s*(?:[+-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!/\W/.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var g=0,h=a.length,i;g<h;g++)if(i=a[g]){while((i=i.previousSibling)&&i.nodeType!==1){}a[g]=e||i&&i.nodeName.toLowerCase()===b?i||!1:i===b}e&&f.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,g=a.length;if(d&&!/\W/.test(b)){b=b.toLowerCase();for(;e<g;e++){c=a[e];if(c){var h=c.parentNode;a[e]=h.nodeName.toLowerCase()===b?h:!1}}}else{for(;e<g;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&f.filter(b,a,!0)}},"":function(a,c,d){var e,f=b++,g=p;typeof c==="string"&&!/\W/.test(c)&&(c=c.toLowerCase(),e=c,g=o),g("parentNode",c,f,a,e,d)},"~":function(a,c,d){var e,f=b++,g=p;typeof c==="string"&&!/\W/.test(c)&&(c=c.toLowerCase(),e=c,g=o),g("previousSibling",c,f,a,e,d)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(/\\/g,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(/\\/g,"")},TAG:function(a,b){return a[1].toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||f.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var c=/(-?)(\d*)(?:n([+-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=c[1]+(c[2]||1)-0,a[3]=c[3]-0}else a[2]&&f.error(a[0]);a[0]=b++;return a},ATTR:function(a,b,c,d,e,f){var h=a[1].replace(/\\/g,"");!f&&g.attrMap[h]&&(a[1]=g.attrMap[h]),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,h){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=f(b[3],null,null,c);else{var i=f.filter(b[3],c,d,!0^h);d||e.push.apply(e,i);return!1}else if(g.match.POS.test(b[0])||g.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return f(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.type},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],h=g.filters[e];if(h)return h(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||f.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var i=b[3];for(var j=0,k=i.length;j<k;j++)if(i[j]===a)return!1;return!0}f.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=g.attrHandle[c]?g.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],h=b[4];return d==null?f==="!=":f==="="?e===h:f==="*="?e.indexOf(h)>=0:f==="~="?(" "+e+" ").indexOf(h)>=0:h?f==="!="?e!==h:f==="^="?e.indexOf(h)===0:f==="$="?e.substr(e.length-h.length)===h:f==="|="?e===h||e.substr(0,h.length+1)===h+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=g.setFilters[e];if(f)return f(a,c,b,d)}}},h=g.match.POS,i=function(a,b){return"\\"+(b-0+1)};for(var j in g.match)g.match[j]=new RegExp(g.match[j].source+/(?![^\[]*\])(?![^\(]*\))/.source),g.leftMatch[j]=new RegExp(/(^(?:.|\r|\n)*?)/.source+g.match[j].source.replace(/\\(\d+)/g,i));var k=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(l){k=function(a,b){var d=0,e=b||[];if(c.call(a)==="[object Array]")Array.prototype.push.apply(e,a);else if(typeof a.length==="number")for(var f=a.length;d<f;d++)e.push(a[d]);else for(;a[d];d++)e.push(a[d]);return e}}var m,n;document.documentElement.compareDocumentPosition?m=function(a,b){if(a===b){d=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(m=function(a,b){var c,e,f=[],g=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){d=!0;return 0}if(h===i)return n(a,b);if(!h)return-1;if(!i)return 1;while(j)f.unshift(j),j=j.parentNode;j=i;while(j)g.unshift(j),j=j.parentNode;c=f.length,e=g.length;for(var k=0;k<c&&k<e;k++)if(f[k]!==g[k])return n(f[k],g[k]);return k===c?n(a,g[k],-1):n(f[k],b,1)},n=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),f.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=f.getText(c.childNodes));return b},function(){var a=document.createElement("div"),b="script"+(new Date).getTime(),c=document.documentElement;a.innerHTML="<a name='"+b+"'/>",c.insertBefore(a,c.firstChild),document.getElementById(b)&&(g.find.ID=function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d?d.id===a[1]||typeof d.getAttributeNode!=="undefined"&&d.getAttributeNode("id").nodeValue===a[1]?[d]:undefined:[]}},g.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),c.removeChild(a),c=a=null}(),function(){var a=document.createElement("div");a.appendChild(document.createComment("")),a.getElementsByTagName("*").length>0&&(g.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(g.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),document.querySelectorAll&&function(){var a=f,b=document.createElement("div"),c="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){f=function(b,d,e,g){d=d||document,b=b.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!g&&!f.isXML(d))if(d.nodeType===9)try{return k(d.querySelectorAll(b),e)}catch(h){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var i=d.getAttribute("id"),j=i||c;i?j=j.replace(/'/g,"\\$&"):d.setAttribute("id",j);try{return k(d.querySelectorAll("[id='"+j+"'] "+b),e)}catch(l){}finally{i||d.removeAttribute("id")}}return a(b,d,e,g)};for(var d in a)f[d]=a[d];b=null}}(),function(){var a=document.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector,c=!1;try{b.call(document.documentElement,"[test!='']:sizzle")}catch(d){c=!0}b&&(f.matchesSelector=function(a,d){d=d.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!f.isXML(a))try{if(c||!g.match.PSEUDO.test(d)&&!/!=/.test(d))return b.call(a,d)}catch(e){}return f(d,null,null,[a]).length>0})}(),function(){var a=document.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;g.order.splice(1,0,"CLASS"),g.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}();function o(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}function p(a,b,c,d,e,g){for(var h=0,i=d.length;h<i;h++){var j=d[h];if(j){var k=!1;j=j[a];while(j){if(j.sizcache===c){k=d[j.sizset];break}if(j.nodeType===1){g||(j.sizcache=c,j.sizset=h);if(typeof b!=="string"){if(j===b){k=!0;break}}else if(f.filter(b,[j]).length>0){k=j;break}}j=j[a]}d[h]=k}}}document.documentElement.contains?f.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:document.documentElement.compareDocumentPosition?f.contains=function(a,b){return a.compareDocumentPosition(b)&16}:f.contains=function(){return!1},f.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var q=function(a,b){var c,d=[],e="",h=b.nodeType?[b]:b;while(c=g.match.PSEUDO.exec(a))e+=c[0],a=a.replace(g.match.PSEUDO,"");a=g.relative[a]?a+"*":a;for(var i=0,j=h.length;i<j;i++)f(a,h[i],d);return f.filter(e,d)};window.Sizzle=f})()</value> + <value>(function(){var n=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,i="sizcache"+(Math.random()+"").replace(".",""),o=0,r=Object.prototype.toString,h=false,g=true,p=/\\/g,v=/\W/;[0,0].sort(function(){g=false;return 0});var d=function(A,e,D,E){D=D||[];e=e||document;var G=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!A||typeof A!=="string"){return D}var x,I,L,w,H,K,J,C,z=true,y=d.isXML(e),B=[],F=A;do{n.exec("");x=n.exec(F);if(x){F=x[3];B.push(x[1]);if(x[2]){w=x[3];break}}}while(x);if(B.length>1&&j.exec(A)){if(B.length===2&&k.relative[B[0]]){I=s(B[0]+B[1],e,E)}else{I=k.relative[B[0]]?[e]:d(B.shift(),e);while(B.length){A=B.shift();if(k.relative[A]){A+=B.shift()}I=s(A,I,E)}}}else{if(!E&&B.length>1&&e.nodeType===9&&!y&&k.match.ID.test(B[0])&&!k.match.ID.test(B[B.length-1])){H=d.find(B.shift(),e,y);e=H.expr?d.filter(H.expr,H.set)[0]:H.set[0]}if(e){H=E?{expr:B.pop(),set:l(E)}:d.find(B.pop(),B.length===1&&(B[0]==="~"||B[0]==="+")&&e.parentNode?e.parentNode:e,y);I=H.expr?d.filter(H.expr,H.set):H.set;if(B.length>0){L=l(I)}else{z=false}while(B.length){K=B.pop();J=K;if(!k.relative[K]){K=""}else{J=B.pop()}if(J==null){J=e}k.relative[K](L,J,y)}}else{L=B=[]}}if(!L){L=I}if(!L){d.error(K||A)}if(r.call(L)==="[object Array]"){if(!z){D.push.apply(D,L)}else{if(e&&e.nodeType===1){for(C=0;L[C]!=null;C++){if(L[C]&&(L[C]===true||L[C].nodeType===1&&d.contains(e,L[C]))){D.push(I[C])}}}else{for(C=0;L[C]!=null;C++){if(L[C]&&L[C].nodeType===1){D.push(I[C])}}}}}else{l(L,D)}if(w){d(w,G,D,E);d.uniqueSort(D)}return D};d.uniqueSort=function(w){if(q){h=g;w.sort(q);if(h){for(var e=1;e<w.length;e++){if(w[e]===w[e-1]){w.splice(e--,1)}}}}return w};d.matches=function(e,w){return d(e,null,null,w)};d.matchesSelector=function(e,w){return d(w,null,null,[e]).length>0};d.find=function(C,e,D){var B,x,z,y,A,w;if(!C){return[]}for(x=0,z=k.order.length;x<z;x++){A=k.order[x];if((y=k.leftMatch[A].exec(C))){w=y[1];y.splice(1,1);if(w.substr(w.length-1)!=="\\"){y[1]=(y[1]||"").replace(p,"");B=k.find[A](y,e,D);if(B!=null){C=C.replace(k.match[A],"");break}}}}if(!B){B=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:B,expr:C}};d.filter=function(G,F,J,z){var B,e,E,L,I,w,y,A,H,x=G,K=[],D=F,C=F&&F[0]&&d.isXML(F[0]);while(G&&F.length){for(E in k.filter){if((B=k.leftMatch[E].exec(G))!=null&&B[2]){w=k.filter[E];y=B[1];e=false;B.splice(1,1);if(y.substr(y.length-1)==="\\"){continue}if(D===K){K=[]}if(k.preFilter[E]){B=k.preFilter[E](B,D,J,K,z,C);if(!B){e=L=true}else{if(B===true){continue}}}if(B){for(A=0;(I=D[A])!=null;A++){if(I){L=w(I,B,A,D);H=z^L;if(J&&L!=null){if(H){e=true}else{D[A]=false}}else{if(H){K.push(I);e=true}}}}}if(L!==undefined){if(!J){D=K}G=G.replace(k.match[E],"");if(!e){return[]}break}}}if(G===x){if(e==null){d.error(G)}else{break}}x=G}return D};d.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var b=d.getText=function(z){var x,y,e=z.nodeType,w="";if(e){if(e===1||e===9||e===11){if(typeof z.textContent==="string"){return z.textContent}else{for(z=z.firstChild;z;z=z.nextSibling){w+=b(z)}}}else{if(e===3||e===4){return z.nodeValue}}}else{for(x=0;(y=z[x]);x++){if(y.nodeType!==8){w+=b(y)}}}return w};var k=d.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(B,w){var y=typeof w==="string",A=y&&!v.test(w),C=y&&!A;if(A){w=w.toLowerCase()}for(var x=0,e=B.length,z;x<e;x++){if((z=B[x])){while((z=z.previousSibling)&&z.nodeType!==1){}B[x]=C||z&&z.nodeName.toLowerCase()===w?z||false:z===w}}if(C){d.filter(w,B,true)}},">":function(B,w){var A,z=typeof w==="string",x=0,e=B.length;if(z&&!v.test(w)){w=w.toLowerCase();for(;x<e;x++){A=B[x];if(A){var y=A.parentNode;B[x]=y.nodeName.toLowerCase()===w?y:false}}}else{for(;x<e;x++){A=B[x];if(A){B[x]=z?A.parentNode:A.parentNode===w}}if(z){d.filter(w,B,true)}}},"":function(y,w,A){var z,x=o++,e=t;if(typeof w==="string"&&!v.test(w)){w=w.toLowerCase();z=w;e=a}e("parentNode",w,x,y,z,A)},"~":function(y,w,A){var z,x=o++,e=t;if(typeof w==="string"&&!v.test(w)){w=w.toLowerCase();z=w;e=a}e("previousSibling",w,x,y,z,A)}},find:{ID:function(w,x,y){if(typeof x.getElementById!=="undefined"&&!y){var e=x.getElementById(w[1]);return e&&e.parentNode?[e]:[]}},NAME:function(x,A){if(typeof A.getElementsByName!=="undefined"){var w=[],z=A.getElementsByName(x[1]);for(var y=0,e=z.length;y<e;y++){if(z[y].getAttribute("name")===x[1]){w.push(z[y])}}return w.length===0?null:w}},TAG:function(e,w){if(typeof w.getElementsByTagName!=="undefined"){return w.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(y,w,x,e,B,C){y=" "+y[1].replace(p,"")+" ";if(C){return y}for(var z=0,A;(A=w[z])!=null;z++){if(A){if(B^(A.className&&(" "+A.className+" ").replace(/[\t\n\r]/g," ").indexOf(y)>=0)){if(!x){e.push(A)}}else{if(x){w[z]=false}}}}return false},ID:function(e){return e[1].replace(p,"")},TAG:function(w,e){return w[1].replace(p,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){d.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var w=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(w[1]+(w[2]||1))-0;e[3]=w[3]-0}else{if(e[2]){d.error(e[0])}}e[0]=o++;return e},ATTR:function(z,w,x,e,A,B){var y=z[1]=z[1].replace(p,"");if(!B&&k.attrMap[y]){z[1]=k.attrMap[y]}z[4]=(z[4]||z[5]||"").replace(p,"");if(z[2]==="~="){z[4]=" "+z[4]+" "}return z},PSEUDO:function(z,w,x,e,A){if(z[1]==="not"){if((n.exec(z[3])||"").length>1||/^\w/.test(z[3])){z[3]=d(z[3],null,null,w)}else{var y=d.filter(z[3],w,x,true^A);if(!x){e.push.apply(e,y)}return false}}else{if(k.match.POS.test(z[0])||k.match.CHILD.test(z[0])){return true}}return z},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(x,w,e){return !!d(e[3],x).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(x){var e=x.getAttribute("type"),w=x.type;return x.nodeName.toLowerCase()==="input"&&"text"===w&&(e===w||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(w){var e=w.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===w.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(w){var e=w.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===w.type},button:function(w){var e=w.nodeName.toLowerCase();return e==="input"&&"button"===w.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(w,e){return e===0},last:function(x,w,e,y){return w===y.length-1},even:function(w,e){return e%2===0},odd:function(w,e){return e%2===1},lt:function(x,w,e){return w<e[3]-0},gt:function(x,w,e){return w>e[3]-0},nth:function(x,w,e){return e[3]-0===w},eq:function(x,w,e){return e[3]-0===w}},filter:{PSEUDO:function(x,C,B,D){var e=C[1],w=k.filters[e];if(w){return w(x,B,C,D)}else{if(e==="contains"){return(x.textContent||x.innerText||b([x])||"").indexOf(C[3])>=0}else{if(e==="not"){var y=C[3];for(var A=0,z=y.length;A<z;A++){if(y[A]===x){return false}}return true}else{d.error(e)}}}},CHILD:function(x,z){var y,F,B,E,e,A,D,C=z[1],w=x;switch(C){case"only":case"first":while((w=w.previousSibling)){if(w.nodeType===1){return false}}if(C==="first"){return true}w=x;case"last":while((w=w.nextSibling)){if(w.nodeType===1){return false}}return true;case"nth":y=z[2];F=z[3];if(y===1&&F===0){return true}B=z[0];E=x.parentNode;if(E&&(E[i]!==B||!x.nodeIndex)){A=0;for(w=E.firstChild;w;w=w.nextSibling){if(w.nodeType===1){w.nodeIndex=++A}}E[i]=B}D=x.nodeIndex-F;if(y===0){return D===0}else{return(D%y===0&&D/y>=0)}}},ID:function(w,e){return w.nodeType===1&&w.getAttribute("id")===e},TAG:function(w,e){return(e==="*"&&w.nodeType===1)||!!w.nodeName&&w.nodeName.toLowerCase()===e},CLASS:function(w,e){return(" "+(w.className||w.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(A,y){var x=y[1],e=d.attr?d.attr(A,x):k.attrHandle[x]?k.attrHandle[x](A):A[x]!=null?A[x]:A.getAttribute(x),B=e+"",z=y[2],w=y[4];return e==null?z==="!=":!z&&d.attr?e!=null:z==="="?B===w:z==="*="?B.indexOf(w)>=0:z==="~="?(" "+B+" ").indexOf(w)>=0:!w?B&&e!==false:z==="!="?B!==w:z==="^="?B.indexOf(w)===0:z==="$="?B.substr(B.length-w.length)===w:z==="|="?B===w||B.substr(0,w.length+1)===w+"-":false},POS:function(z,w,x,A){var e=w[2],y=k.setFilters[e];if(y){return y(z,x,w,A)}}}};var j=k.match.POS,c=function(w,e){return"\\"+(e-0+1)};for(var f in k.match){k.match[f]=new RegExp(k.match[f].source+(/(?![^\[]*\])(?![^\(]*\))/.source));k.leftMatch[f]=new RegExp(/(^(?:.|\r|\n)*?)/.source+k.match[f].source.replace(/\\(\d+)/g,c))}k.match.globalPOS=j;var l=function(w,e){w=Array.prototype.slice.call(w,0);if(e){e.push.apply(e,w);return e}return w};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(u){l=function(z,y){var x=0,w=y||[];if(r.call(z)==="[object Array]"){Array.prototype.push.apply(w,z)}else{if(typeof z.length==="number"){for(var e=z.length;x<e;x++){w.push(z[x])}}else{for(;z[x];x++){w.push(z[x])}}}return w}}var q,m;if(document.documentElement.compareDocumentPosition){q=function(w,e){if(w===e){h=true;return 0}if(!w.compareDocumentPosition||!e.compareDocumentPosition){return w.compareDocumentPosition?-1:1}return w.compareDocumentPosition(e)&4?-1:1}}else{q=function(D,C){if(D===C){h=true;return 0}else{if(D.sourceIndex&&C.sourceIndex){return D.sourceIndex-C.sourceIndex}}var A,w,x=[],e=[],z=D.parentNode,B=C.parentNode,E=z;if(z===B){return m(D,C)}else{if(!z){return -1}else{if(!B){return 1}}}while(E){x.unshift(E);E=E.parentNode}E=B;while(E){e.unshift(E);E=E.parentNode}A=x.length;w=e.length;for(var y=0;y<A&&y<w;y++){if(x[y]!==e[y]){return m(x[y],e[y])}}return y===A?m(D,e[y],-1):m(x[y],C,1)};m=function(w,e,x){if(w===e){return x}var y=w.nextSibling;while(y){if(y===e){return -1}y=y.nextSibling}return 1}}(function(){var w=document.createElement("div"),x="script"+(new Date()).getTime(),e=document.documentElement;w.innerHTML="<a name='"+x+"'/>";e.insertBefore(w,e.firstChild);if(document.getElementById(x)){k.find.ID=function(z,A,B){if(typeof A.getElementById!=="undefined"&&!B){var y=A.getElementById(z[1]);return y?y.id===z[1]||typeof y.getAttributeNode!=="undefined"&&y.getAttributeNode("id").nodeValue===z[1]?[y]:undefined:[]}};k.filter.ID=function(A,y){var z=typeof A.getAttributeNode!=="undefined"&&A.getAttributeNode("id");return A.nodeType===1&&z&&z.nodeValue===y}}e.removeChild(w);e=w=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){k.find.TAG=function(w,A){var z=A.getElementsByTagName(w[1]);if(w[1]==="*"){var y=[];for(var x=0;z[x];x++){if(z[x].nodeType===1){y.push(z[x])}}z=y}return z}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){k.attrHandle.href=function(w){return w.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=d,y=document.createElement("div"),x="__sizzle__";y.innerHTML="<p class='TEST'></p>";if(y.querySelectorAll&&y.querySelectorAll(".TEST").length===0){return}d=function(J,A,E,I){A=A||document;if(!I&&!d.isXML(A)){var H=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(J);if(H&&(A.nodeType===1||A.nodeType===9)){if(H[1]){return l(A.getElementsByTagName(J),E)}else{if(H[2]&&k.find.CLASS&&A.getElementsByClassName){return l(A.getElementsByClassName(H[2]),E)}}}if(A.nodeType===9){if(J==="body"&&A.body){return l([A.body],E)}else{if(H&&H[3]){var D=A.getElementById(H[3]);if(D&&D.parentNode){if(D.id===H[3]){return l([D],E)}}else{return l([],E)}}}try{return l(A.querySelectorAll(J),E)}catch(F){}}else{if(A.nodeType===1&&A.nodeName.toLowerCase()!=="object"){var B=A,C=A.getAttribute("id"),z=C||x,L=A.parentNode,K=/^\s*[+~]/.test(J);if(!C){A.setAttribute("id",z)}else{z=z.replace(/'/g,"\\$&")}if(K&&L){A=A.parentNode}try{if(!K||L){return l(A.querySelectorAll("[id='"+z+"'] "+J),E)}}catch(G){}finally{if(!C){B.removeAttribute("id")}}}}}return e(J,A,E,I)};for(var w in e){d[w]=e[w]}y=null})()}(function(){var e=document.documentElement,x=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(x){var z=!x.call(document.createElement("div"),"div"),w=false;try{x.call(document.documentElement,"[test!='']:sizzle")}catch(y){w=true}d.matchesSelector=function(B,D){D=D.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!d.isXML(B)){try{if(w||!k.match.PSEUDO.test(D)&&!/!=/.test(D)){var A=x.call(B,D);if(A||!z||B.document&&B.document.nodeType!==11){return A}}}catch(C){}}return d(D,null,null,[B]).length>0}}})();(function(){var e=document.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}k.order.splice(1,0,"CLASS");k.find.CLASS=function(w,x,y){if(typeof x.getElementsByClassName!=="undefined"&&!y){return x.getElementsByClassName(w[1])}};e=null})();function a(w,B,A,E,C,D){for(var y=0,x=E.length;y<x;y++){var e=E[y];if(e){var z=false;e=e[w];while(e){if(e[i]===A){z=E[e.sizset];break}if(e.nodeType===1&&!D){e[i]=A;e.sizset=y}if(e.nodeName.toLowerCase()===B){z=e;break}e=e[w]}E[y]=z}}}function t(w,B,A,E,C,D){for(var y=0,x=E.length;y<x;y++){var e=E[y];if(e){var z=false;e=e[w];while(e){if(e[i]===A){z=E[e.sizset];break}if(e.nodeType===1){if(!D){e[i]=A;e.sizset=y}if(typeof B!=="string"){if(e===B){z=true;break}}else{if(d.filter(B,[e]).length>0){z=e;break}}}e=e[w]}E[y]=z}}}if(document.documentElement.contains){d.contains=function(w,e){return w!==e&&(w.contains?w.contains(e):true)}}else{if(document.documentElement.compareDocumentPosition){d.contains=function(w,e){return !!(w.compareDocumentPosition(e)&16)}}else{d.contains=function(){return false}}}d.isXML=function(e){var w=(e?e.ownerDocument||e:0).documentElement;return w?w.nodeName!=="HTML":false};var s=function(x,e,B){var A,C=[],z="",D=e.nodeType?[e]:e;while((A=k.match.PSEUDO.exec(x))){z+=A[0];x=x.replace(k.match.PSEUDO,"")}x=k.relative[x]?x+"*":x;for(var y=0,w=D.length;y<w;y++){d(x,D[y],C,B)}return d.filter(z,C)};window.Sizzle=d})();</value> </data> </root> \ No newline at end of file Modified: trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs =================================================================== --- trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2012-04-05 19:20:52 UTC (rev 1211) +++ trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2012-04-07 21:24:22 UTC (rev 1212) @@ -79,12 +79,12 @@ } [Test] - public void Should_only_element_inside_container_element() + public void Should_find_element_inside_container_element() { ExecuteTest(browser => { // GIVEN - var querySelectorConstraint = new QuerySelectorConstraint("#popupid"); + var querySelectorConstraint = new QuerySelectorConstraint(":first"); var containerElement = browser.Form("Form"); // WHEN @@ -92,7 +92,7 @@ // THEN Assert.That(element.Exists, Is.True); - Assert.That(element.Id, Is.EqualTo("popupid")); + Assert.That(element.Id, Is.EqualTo("name")); }); } @@ -262,7 +262,7 @@ }); } - [Test, Ignore("work in progress")] + [Test] public void Should_find_element_within_containing_element_in_frame_within_frame() { ExecuteTest(browser => @@ -279,7 +279,6 @@ }); } - public override Uri TestPageUri { get { return MainURI; } Modified: trunk/src/UnitTests/html/Index.html =================================================================== --- trunk/src/UnitTests/html/Index.html 2012-04-05 19:20:52 UTC (rev 1211) +++ trunk/src/UnitTests/html/Index.html 2012-04-07 21:24:22 UTC (rev 1212) @@ -7,7 +7,7 @@ </head> <body> <p></p> - <P><a href="http://www.google.com" target="main" id="googlelink">Google</a></P> - <P><a href="http://www.microsoft.com" id="Microsoft">Microsoft</a></P> + <p><a href="http://www.google.com" target="main" id="googlelink">Google</a></p> + <div id="microsoftDivId"><p><a href="http://www.microsoft.com" id="Microsoft">Microsoft</a></p></div> </body> </html> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-04-05 19:20:57
|
Revision: 1211 http://watin.svn.sourceforge.net/watin/?rev=1211&view=rev Author: jvmenen Date: 2012-04-05 19:20:52 +0000 (Thu, 05 Apr 2012) Log Message: ----------- Removed some specific test code Modified Paths: -------------- trunk/src/UnitTests/UnitTests.csproj Modified: trunk/src/UnitTests/UnitTests.csproj =================================================================== --- trunk/src/UnitTests/UnitTests.csproj 2012-04-05 19:18:47 UTC (rev 1210) +++ trunk/src/UnitTests/UnitTests.csproj 2012-04-05 19:20:52 UTC (rev 1211) @@ -195,7 +195,6 @@ <Compile Include="ControlCollectionTests.cs" /> <Compile Include="ControlTests.cs" /> <Compile Include="ComponentExtensionsTests.cs" /> - <Compile Include="html\DataBoundSupport\Class1.cs" /> <Compile Include="ElementFactoryTests.cs" /> <Compile Include="ElementOfTypeTests.cs" /> <Compile Include="HtmlColorTests.cs" /> @@ -435,10 +434,6 @@ <SubType>Code</SubType> </Compile> <Compile Include="WatiNSanityTests.cs" /> - <Content Include="html\DataBoundSupport\frame1.html" /> - <Content Include="html\DataBoundSupport\frame2.html" /> - <Content Include="html\DataBoundSupport\Frameset.html" /> - <Content Include="html\DataBoundSupport\MainPage.htm" /> <Content Include="html\BodyNotExistsBug.htm" /> <Content Include="html\ButtonTests.html" /> <Content Include="html\ClassConstraintTests.html" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-04-05 19:18:53
|
Revision: 1210 http://watin.svn.sourceforge.net/watin/?rev=1210&view=rev Author: jvmenen Date: 2012-04-05 19:18:47 +0000 (Thu, 05 Apr 2012) Log Message: ----------- Find.BySelector(...) now works correctly for both Frames and iFrames in IE. Firefox already worked fine. Modified Paths: -------------- trunk/src/Core/Frame.cs trunk/src/Core/Native/InternetExplorer/IEDocument.cs trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs trunk/src/UnitTests/FrameTests.cs Modified: trunk/src/Core/Frame.cs =================================================================== --- trunk/src/Core/Frame.cs 2012-04-04 18:56:11 UTC (rev 1209) +++ trunk/src/Core/Frame.cs 2012-04-05 19:18:47 UTC (rev 1210) @@ -56,29 +56,36 @@ /// <param name="parentDocument"> </param> private void SetFrameHierarchy(Frame parentDocument) { - if (parentDocument == null) return; - var frameElement = parentDocument.FrameElement; - var nameOrId = GetFrameElementNameOrId(frameElement); - var hierarchy = frameElement.GetAttributeValue("data-watinFrameHierarchy") + nameOrId + "."; - + var nameOrId = GetFrameElementNameOrId(FrameElement); + var hierarchy = string.Empty; + + if (parentDocument != null) + { + var frameElement = parentDocument.FrameElement; + hierarchy = frameElement.GetAttributeValue("data-watinFrameHierarchy") + "."; + } + + hierarchy = hierarchy + nameOrId; + FrameElement.SetAttributeValue("data-watinFrameHierarchy", hierarchy); + //frameDocument.RunScript(frameDocument.JavaScriptVariableName + ".___WATINFRAMEHIERARCHY = '" + hierarchy + "'", "javascript"); } private static string GetFrameElementNameOrId(Element frameElement) { - var frameRef = frameElement.Name; - - if (string.IsNullOrEmpty(frameRef)) - frameRef = frameElement.Id; + var idOrName = frameElement.Name; - if (string.IsNullOrEmpty(frameRef)) + if (string.IsNullOrEmpty(idOrName)) + idOrName = frameElement.Id; + + if (string.IsNullOrEmpty(idOrName)) { - frameRef = frameElement.GetJavascriptElementReference(); - frameElement.SetAttributeValue("Id", "frame_" + frameRef); + idOrName = "frame_" + frameElement.GetJavascriptElementReference(); + frameElement.SetAttributeValue("Id", idOrName); } - return frameRef; + return idOrName; } private static Element CreateFrameElement(DomContainer domContainer, INativeDocument frameDocument) Modified: trunk/src/Core/Native/InternetExplorer/IEDocument.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEDocument.cs 2012-04-04 18:56:11 UTC (rev 1209) +++ trunk/src/Core/Native/InternetExplorer/IEDocument.cs 2012-04-05 19:18:47 UTC (rev 1210) @@ -19,9 +19,6 @@ using System; using System.Collections.Generic; using System.Drawing; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Runtime.InteropServices.Expando; using mshtml; using WatiN.Core.Logging; Modified: trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-04-04 18:56:11 UTC (rev 1209) +++ trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-04-05 19:18:47 UTC (rev 1210) @@ -86,13 +86,16 @@ var container = "document"; if (_element != null) { - container = _element.GetJavaScriptElementReference(); var elementTag = new ElementTag(_element.TagName); if (elementTag.Equals(new ElementTag("frame")) || elementTag.Equals(new ElementTag("iframe"))) { var frameHierarchy = _element.GetAttributeValue("data-watinFrameHierarchy"); - container = frameHierarchy + container + ".contentDocument"; + container = frameHierarchy + ".document"; } + else + { + container = _element.GetJavaScriptElementReference(); + } } domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript()); Modified: trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs =================================================================== --- trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2012-04-04 18:56:11 UTC (rev 1209) +++ trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2012-04-05 19:18:47 UTC (rev 1210) @@ -246,30 +246,40 @@ } [Test] - public void Should_find_element_in_frame_within_frame_even_when_no_name_or_id_is_set() + public void Should_find_element_in_iframe() { ExecuteTest(browser => { // GIVEN + browser.GoTo(IFramesMainURI); + var frame = browser.Frame("iframe2"); + + // WHEN + var textFields = frame.TextFields.Filter(Find.BySelector("[name=text2]")); + + // THEN + Assert.That(textFields.Count, Is.EqualTo(1)); + }); + } + + [Test, Ignore("work in progress")] + public void Should_find_element_within_containing_element_in_frame_within_frame() + { + ExecuteTest(browser => + { + // GIVEN browser.GoTo(FramesetWithinFramesetURI); - var firstFrame = browser.Frame("mainid"); + var div = browser.Frame("mainid").Frame("mainid").Div("microsoftDivId"); - firstFrame.FrameElement.SetAttributeValue("id", ""); - firstFrame.FrameElement.SetAttributeValue("name", ""); - - firstFrame = browser.Frames[1]; - // WHEN - var link = firstFrame.Frame("mainid").Link(Find.BySelector("#Microsoft")); + var link = div.Link(Find.BySelector("#Microsoft")); // THEN Assert.That(link.Exists); - Assert.That(firstFrame.Id, Text.StartsWith("frame_watin"), "Pre-condition: Expected no Id for firstFrame"); }); } - public override Uri TestPageUri { get { return MainURI; } Modified: trunk/src/UnitTests/FrameTests.cs =================================================================== --- trunk/src/UnitTests/FrameTests.cs 2012-04-04 18:56:11 UTC (rev 1209) +++ trunk/src/UnitTests/FrameTests.cs 2012-04-05 19:18:47 UTC (rev 1210) @@ -216,38 +216,47 @@ } [Test] - public void Should_not_have_stored_javascript_names_frame_hierarchy_for_first_level_frame() + public void Should_store_javascript_names_frame_hierarchy() { ExecuteTest(browser => { // GIVEN - browser.GoTo(FramesetWithinFramesetURI); - var mainFrame = browser.Frame(Find.ByName("firstlevel")); + browser.GoTo(new Uri(HtmlTestBaseURI, "FramesetWithinFramesetWithinFrameset.html")); + var mainFrame = browser.Frame(Find.ByName("zerolevel")). + Frame(Find.ByName("firstlevel")). + Frame(Find.ByName("main")); // WHEN var result = mainFrame.GetAttributeValue("data-watinFrameHierarchy"); //THEN - Assert.That(result, Is.Null); + Assert.That(result, Is.EqualTo("zerolevel.firstlevel.main")); }); } [Test] - public void Should_store_javascript_names_frame_hierarchy() + public void Should_assign_an_id_to_frame_when_no_name_or_id_is_set() { ExecuteTest(browser => { // GIVEN - browser.GoTo(new Uri(HtmlTestBaseURI, "FramesetWithinFramesetWithinFrameset.html")); - var mainFrame = browser.Frame(Find.ByName("zerolevel")). - Frame(Find.ByName("firstlevel")). - Frame(Find.ByName("main")); + browser.GoTo(FramesetWithinFramesetURI); + var firstFrame = browser.Frame("mainid"); + firstFrame.FrameElement.SetAttributeValue("id", ""); + firstFrame.FrameElement.SetAttributeValue("name", ""); + + firstFrame = browser.Frames[1]; + // WHEN - var result = mainFrame.GetAttributeValue("data-watinFrameHierarchy"); + var link = firstFrame.Frame("mainid").Link(Find.BySelector("#Microsoft")); - //THEN - Assert.That(result, Is.EqualTo("zerolevel.firstlevel.")); + // THEN + Assert.That(link.Exists); + Assert.That(firstFrame.Id, Text.StartsWith("frame_"), "unexpected prefix of set id"); + + var hierarchy = firstFrame.GetAttributeValue("data-watinFrameHierarchy"); + Assert.That(hierarchy, Text.StartsWith(firstFrame.Id)); }); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-04-04 18:56:17
|
Revision: 1209 http://watin.svn.sourceforge.net/watin/?rev=1209&view=rev Author: jvmenen Date: 2012-04-04 18:56:11 +0000 (Wed, 04 Apr 2012) Log Message: ----------- CssSelector now also working for iframes Modified Paths: -------------- trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs Modified: trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-04-04 09:41:18 UTC (rev 1208) +++ trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-04-04 18:56:11 UTC (rev 1209) @@ -87,7 +87,8 @@ if (_element != null) { container = _element.GetJavaScriptElementReference(); - if (new ElementTag(_element.TagName).Equals(new ElementTag("frame"))) + var elementTag = new ElementTag(_element.TagName); + if (elementTag.Equals(new ElementTag("frame")) || elementTag.Equals(new ElementTag("iframe"))) { var frameHierarchy = _element.GetAttributeValue("data-watinFrameHierarchy"); container = frameHierarchy + container + ".contentDocument"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-04-04 09:41:30
|
Revision: 1208 http://watin.svn.sourceforge.net/watin/?rev=1208&view=rev Author: jvmenen Date: 2012-04-04 09:41:18 +0000 (Wed, 04 Apr 2012) Log Message: ----------- Changes to be able to make use of webdriver as a browser driver implementation - Moved ITypeTextAction.cs to Native dir and directory. - Created SelectAction.cs implementing new Native/ISelectAction interface - Both new interfaces are now used by INativeElement - Added INativeBrowser.Close() - Implementation of new BrowserDriver can now be done in a seperate project and injected and used by WatiN test suite by adding it to the UnitTests/App.config file. Modified Paths: -------------- trunk/src/Core/Actions/TypeTextAction.cs trunk/src/Core/Browser.cs trunk/src/Core/Constraints/QuerySelectorConstraint.cs trunk/src/Core/Core.csproj trunk/src/Core/Element.cs trunk/src/Core/FireFox.cs trunk/src/Core/IE.cs trunk/src/Core/IdHinter.cs trunk/src/Core/Native/INativeBrowser.cs trunk/src/Core/Native/INativeElement.cs trunk/src/Core/Native/INativeElementCollection.cs trunk/src/Core/Native/InternetExplorer/IEBrowser.cs trunk/src/Core/Native/InternetExplorer/IEElement.cs trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs trunk/src/Core/Native/JSElement.cs trunk/src/Core/Native/JSElementCollectionBase.cs trunk/src/Core/NativeElementFinder.cs trunk/src/Core/Option.cs trunk/src/Core/RadioCheck.cs trunk/src/Core/TextField.cs trunk/src/UnitTests/App.config trunk/src/UnitTests/BrowserTests.cs trunk/src/UnitTests/ButtonTests.cs trunk/src/UnitTests/ListTests.cs trunk/src/UnitTests/ResearchTests/JavascriptErrorDetection.cs trunk/src/UnitTests/TableRowTests.cs trunk/src/UnitTests/TableTests.cs trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs trunk/src/UnitTests/UnitTests.csproj trunk/src/WatiN.sln Added Paths: ----------- trunk/lib/Net/3.5/Microsoft.mshtml.dll trunk/src/Core/Actions/SelectAction.cs trunk/src/Core/Native/ICssSelector.cs trunk/src/Core/Native/ISelectAction.cs trunk/src/Core/Native/ITypeTextAction.cs Removed Paths: ------------- trunk/src/Core/Actions/ITypeTextAction.cs Property Changed: ---------------- trunk/src/Core/ trunk/src/Core/DialogHandlers/ Added: trunk/lib/Net/3.5/Microsoft.mshtml.dll =================================================================== (Binary files differ) Property changes on: trunk/lib/Net/3.5/Microsoft.mshtml.dll ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Property changes on: trunk/src/Core ___________________________________________________________________ Modified: svn:ignore - .MySCMServerInfo bin obj *.resharperoptions _ReSharper.* *.user *.suo WatiN.Core.xml + .MySCMServerInfo bin obj *.resharperoptions _ReSharper.* *.user *.suo WatiN.Core.xml *.ncrunchproject Deleted: trunk/src/Core/Actions/ITypeTextAction.cs =================================================================== --- trunk/src/Core/Actions/ITypeTextAction.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Actions/ITypeTextAction.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -1,27 +0,0 @@ -#region WatiN Copyright (C) 2006-2011 Jeroen van Menen - -//Copyright 2006-2011 Jeroen van Menen -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#endregion Copyright - -namespace WatiN.Core.Actions -{ - public interface ITypeTextAction - { - void TypeText(string value); - void AppendText(string value); - void Clear(); - } -} \ No newline at end of file Added: trunk/src/Core/Actions/SelectAction.cs =================================================================== --- trunk/src/Core/Actions/SelectAction.cs (rev 0) +++ trunk/src/Core/Actions/SelectAction.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -0,0 +1,53 @@ +#region WatiN Copyright (C) 2006-2011 Jeroen van Menen + +//Copyright 2006-2011 Jeroen van Menen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion Copyright + +using WatiN.Core.Native; + +namespace WatiN.Core.Actions +{ + public class SelectAction : ISelectAction + { + private Option _option; + public SelectAction(Option option) + { + _option = option; + } + + public void Deselect(bool waitForComplete) + { + Select(false, waitForComplete); + } + public void Select(bool waitForComplete) + { + Select(true, waitForComplete); + } + + private void Select(bool value, bool waitForComplete) + { + _option.SetAttributeValue("selected", value.ToString().ToLowerInvariant()); + if (waitForComplete) + { + _option.ParentSelectList.FireEvent("onchange"); + } + else + { + _option.ParentSelectList.FireEventNoWait("onchange"); + } + } + } +} Modified: trunk/src/Core/Actions/TypeTextAction.cs =================================================================== --- trunk/src/Core/Actions/TypeTextAction.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Actions/TypeTextAction.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -19,6 +19,7 @@ using System; using WatiN.Core.Exceptions; using WatiN.Core.UtilityClasses; +using WatiN.Core.Native; namespace WatiN.Core.Actions { Modified: trunk/src/Core/Browser.cs =================================================================== --- trunk/src/Core/Browser.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Browser.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -83,7 +83,8 @@ public virtual void SizeWindow(int width, int height) { - new Window(hWnd).SizeTo(width, height); + RunScript(string.Format("window.resizeTo({0}, {1});", width, height)); + //new Window(hWnd).SizeTo(width, height); } /// <summary> @@ -331,7 +332,10 @@ /// <summary> /// Closes the browser. /// </summary> - public abstract void Close(); + public virtual void Close() + { + NativeBrowser.Close(); + } public override IntPtr hWnd { Modified: trunk/src/Core/Constraints/QuerySelectorConstraint.cs =================================================================== --- trunk/src/Core/Constraints/QuerySelectorConstraint.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Constraints/QuerySelectorConstraint.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -19,10 +19,11 @@ using System; using System.IO; using WatiN.Core.Interfaces; +using WatiN.Core.Native; namespace WatiN.Core.Constraints { - public class QuerySelectorConstraint : Constraint + public class QuerySelectorConstraint : Constraint, ICssSelector { public QuerySelectorConstraint(string selector) { @@ -42,5 +43,10 @@ { return true; } + + string ICssSelector.Selector(bool encoded) + { + return encoded ? EncodedSelector : Selector; + } } } Modified: trunk/src/Core/Core.csproj =================================================================== --- trunk/src/Core/Core.csproj 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Core.csproj 2012-04-04 09:41:18 UTC (rev 1208) @@ -177,7 +177,10 @@ </ItemGroup> <ItemGroup> <Compile Include="Actions\HighlightAction.cs" /> - <Compile Include="Actions\ITypeTextAction.cs" /> + <Compile Include="Actions\SelectAction.cs" /> + <Compile Include="Native\ICssSelector.cs" /> + <Compile Include="Native\ISelectAction.cs" /> + <Compile Include="Native\ITypeTextAction.cs" /> <Compile Include="Actions\TypeTextAction.cs" /> <Compile Include="ComponentDecoratorAttribute.cs" /> <Compile Include="ComponentExtensions.cs" /> Property changes on: trunk/src/Core/DialogHandlers ___________________________________________________________________ Added: svn:ignore + *.bak Modified: trunk/src/Core/Element.cs =================================================================== --- trunk/src/Core/Element.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Element.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -160,7 +160,11 @@ /// <value>The id.</value> public virtual string Id { - get { return GetAttributeValue("id"); } + get + { + var value = GetAttributeValue("id"); + return string.IsNullOrEmpty(value) ? null : value; + } set { SetAttributeValue("id", value); } } @@ -418,8 +422,10 @@ throw new ElementDisabledException(IdOrName, this); } - Logger.LogAction((LogFunction log) => { log("Clicking (no wait) {0} '{1}', {2}", GetType().Name, IdOrName, Description); }); + var nowaitText = waitforComplete? "" : "(nowait) "; + Logger.LogAction((LogFunction log) => { log("Clicking {3}{0} '{1}', {2}", GetType().Name, IdOrName, Description, nowaitText); }); + Highlight(true); if (waitforComplete) Modified: trunk/src/Core/FireFox.cs =================================================================== --- trunk/src/Core/FireFox.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/FireFox.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -234,14 +234,6 @@ WaitForComplete(new JSWaitForComplete(_ffBrowser, waitForCompleteTimeOut)); } - /// <summary> - /// Closes the browser. - /// </summary> - public override void Close() - { - _ffBrowser.Close(); - } - #endregion Public instance methods #region Protected instance methods Modified: trunk/src/Core/IE.cs =================================================================== --- trunk/src/Core/IE.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/IE.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -697,7 +697,7 @@ if (closeIE && IsInternetExplorerStillAvailable()) { // Ask IE to close - _ieBrowser.Quit(); + _ieBrowser.Close(); } _ieBrowser = null; Modified: trunk/src/Core/IdHinter.cs =================================================================== --- trunk/src/Core/IdHinter.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/IdHinter.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -17,6 +17,7 @@ #endregion Copyright using WatiN.Core.Constraints; +using WatiN.Core.Native; namespace WatiN.Core { @@ -126,7 +127,7 @@ _constraint = constraint; } - public string GetSelector() + public ICssSelector GetSelector() { var selector = GetSelector(_constraint); if (selector != null) return selector; @@ -141,10 +142,9 @@ return null; } - private static string GetSelector(Constraint constraint) + private static ICssSelector GetSelector(Constraint constraint) { - var qsConstraint = constraint as QuerySelectorConstraint; - return qsConstraint != null ? qsConstraint.EncodedSelector : null; + return constraint as QuerySelectorConstraint; } } } \ No newline at end of file Added: trunk/src/Core/Native/ICssSelector.cs =================================================================== --- trunk/src/Core/Native/ICssSelector.cs (rev 0) +++ trunk/src/Core/Native/ICssSelector.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WatiN.Core.Native +{ + public interface ICssSelector + { + string Selector(bool encoded); + } +} Modified: trunk/src/Core/Native/INativeBrowser.cs =================================================================== --- trunk/src/Core/Native/INativeBrowser.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Native/INativeBrowser.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -68,5 +68,7 @@ IntPtr hWnd { get; } INativeDocument NativeDocument { get; } + + void Close(); } } \ No newline at end of file Modified: trunk/src/Core/Native/INativeElement.cs =================================================================== --- trunk/src/Core/Native/INativeElement.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Native/INativeElement.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -20,6 +20,7 @@ using System.Collections.Specialized; using System.Drawing; using WatiN.Core.DialogHandlers; +using WatiN.Core.Actions; namespace WatiN.Core.Native { @@ -165,5 +166,9 @@ string GetJavaScriptElementReference(); void Pin(); + + ITypeTextAction CreateTypeTextAction(TextField textField); + + ISelectAction CreateSelectAction(Option option); } } \ No newline at end of file Modified: trunk/src/Core/Native/INativeElementCollection.cs =================================================================== --- trunk/src/Core/Native/INativeElementCollection.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Native/INativeElementCollection.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -54,8 +54,8 @@ IEnumerable<INativeElement> GetElementsById(string id); } - internal interface INativeElementCollection2 : INativeElementCollection + public interface INativeElementCollection2 : INativeElementCollection { - IEnumerable<INativeElement> GetElementsWithQuerySelector(string selector, DomContainer domContainer); + IEnumerable<INativeElement> GetElementsWithQuerySelector(ICssSelector selector, DomContainer domContainer); } } Added: trunk/src/Core/Native/ISelectAction.cs =================================================================== --- trunk/src/Core/Native/ISelectAction.cs (rev 0) +++ trunk/src/Core/Native/ISelectAction.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -0,0 +1,28 @@ +#region WatiN Copyright (C) 2006-2011 Jeroen van Menen + +//Copyright 2006-2011 Jeroen van Menen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion Copyright + +using System; + +namespace WatiN.Core.Native +{ + public interface ISelectAction + { + void Deselect(bool waitForComplete); + void Select(bool waitForComplete); + } +} Added: trunk/src/Core/Native/ITypeTextAction.cs =================================================================== --- trunk/src/Core/Native/ITypeTextAction.cs (rev 0) +++ trunk/src/Core/Native/ITypeTextAction.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -0,0 +1,27 @@ +#region WatiN Copyright (C) 2006-2011 Jeroen van Menen + +//Copyright 2006-2011 Jeroen van Menen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion Copyright + +namespace WatiN.Core.Native +{ + public interface ITypeTextAction + { + void TypeText(string value); + void AppendText(string value); + void Clear(); + } +} \ No newline at end of file Modified: trunk/src/Core/Native/InternetExplorer/IEBrowser.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEBrowser.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Native/InternetExplorer/IEBrowser.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -131,7 +131,7 @@ set { webBrowser.Visible = value; } } - public void Quit() + public void Close() { webBrowser.Quit(); } Modified: trunk/src/Core/Native/InternetExplorer/IEElement.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElement.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Native/InternetExplorer/IEElement.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -25,6 +25,7 @@ using WatiN.Core.Exceptions; using WatiN.Core.Logging; using WatiN.Core.UtilityClasses; +using WatiN.Core.Actions; namespace WatiN.Core.Native.InternetExplorer { @@ -549,5 +550,14 @@ return AsDispHTMLBaseElement.uniqueNumber; } + public ITypeTextAction CreateTypeTextAction(TextField textField) + { + return new TypeTextAction(textField); + } + + public ISelectAction CreateSelectAction(Option option) + { + return new SelectAction(option); + } } } Modified: trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -81,7 +81,7 @@ } } - public IEnumerable<INativeElement> GetElementsWithQuerySelector(string selector, DomContainer domContainer) + public IEnumerable<INativeElement> GetElementsWithQuerySelector(ICssSelector selector, DomContainer domContainer) { var container = "document"; if (_element != null) @@ -96,7 +96,7 @@ domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript()); - var code = string.Format("document.___WATINRESULT = Sizzle('{0}', {1});", selector, container); + var code = string.Format("document.___WATINRESULT = Sizzle('{0}', {1});", selector.Selector(true), container); domContainer.RunScript(code); return new JScriptElementArrayEnumerator((IEDocument) domContainer.NativeDocument, "___WATINRESULT"); Modified: trunk/src/Core/Native/JSElement.cs =================================================================== --- trunk/src/Core/Native/JSElement.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Native/JSElement.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -28,6 +28,7 @@ namespace WatiN.Core.Native { using Mozilla; + using WatiN.Core.Actions; public class JSElement : INativeElement { @@ -604,6 +605,17 @@ ElementReference = elementVariableName; } + + public ITypeTextAction CreateTypeTextAction(TextField textField) + { + return new TypeTextAction(textField); + } + + public ISelectAction CreateSelectAction(Option option) + { + return new SelectAction(option); + } + } public class JSEventCreator @@ -758,6 +770,5 @@ return defaultValue; } - } } \ No newline at end of file Modified: trunk/src/Core/Native/JSElementCollectionBase.cs =================================================================== --- trunk/src/Core/Native/JSElementCollectionBase.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Native/JSElementCollectionBase.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -143,11 +143,11 @@ return GetElementsByIdImpl(id); } - public IEnumerable<INativeElement> GetElementsWithQuerySelector(string selector, DomContainer domContainer) + public IEnumerable<INativeElement> GetElementsWithQuerySelector(ICssSelector selector, DomContainer domContainer) { domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript()); - var command = string.Format("window.Sizzle('{0}', {1})", selector, containerReference); + var command = string.Format("window.Sizzle('{0}', {1})", selector.Selector(true), containerReference); var ffElements = GetElementArrayEnumerator(command); foreach (var ffElement in ffElements) Modified: trunk/src/Core/NativeElementFinder.cs =================================================================== --- trunk/src/Core/NativeElementFinder.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/NativeElementFinder.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -76,7 +76,7 @@ return FindElementByTags(); } - private IEnumerable<Element> FindElementsUsingQuerySelector(string selector) + private IEnumerable<Element> FindElementsUsingQuerySelector(ICssSelector selector) { var nativeElementCollection2 = (INativeElementCollection2)GetNativeElementCollection(); return WrapMatchingElements(nativeElementCollection2.GetElementsWithQuerySelector(selector, domContainer)); @@ -165,7 +165,7 @@ return IdHinter.GetIdHint(constraint); } - protected virtual string GetSelector(Constraint constraint) + protected virtual ICssSelector GetSelector(Constraint constraint) { return new QuerySelectorHinter(constraint).GetSelector(); } Modified: trunk/src/Core/Option.cs =================================================================== --- trunk/src/Core/Option.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/Option.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -17,6 +17,7 @@ #endregion Copyright using WatiN.Core.Native; +using WatiN.Core.Actions; namespace WatiN.Core { @@ -131,19 +132,15 @@ get { return Ancestor<SelectList>(); } } - private void setSelected(bool value, bool WaitForComplete) + private void setSelected(bool value, bool waitForComplete) { - if (bool.Parse(GetAttributeValue("selected")) == value) return; + if (Selected == value) return; - SetAttributeValue("selected", value.ToString().ToLowerInvariant()); - if (WaitForComplete) - { - ParentSelectList.FireEvent("onchange"); - } - else - { - ParentSelectList.FireEventNoWait("onchange"); - } + var action = NativeElement.CreateSelectAction(this); + if (value) + action.Select(waitForComplete); + else + action.Deselect(waitForComplete); } } } Modified: trunk/src/Core/RadioCheck.cs =================================================================== --- trunk/src/Core/RadioCheck.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/RadioCheck.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -33,7 +33,11 @@ public virtual bool Checked { - get { return bool.Parse(GetAttributeValue("checked")); } + get + { + var value = GetAttributeValue("checked"); + return value == null ? false : bool.Parse(value); + } set { if (Checked == value) return; Modified: trunk/src/Core/TextField.cs =================================================================== --- trunk/src/Core/TextField.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/Core/TextField.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -99,7 +99,7 @@ protected virtual ITypeTextAction CreateTypeTextAction() { - return new TypeTextAction(this); + return NativeElement.CreateTypeTextAction(this); } public virtual string Value Modified: trunk/src/UnitTests/App.config =================================================================== --- trunk/src/UnitTests/App.config 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/UnitTests/App.config 2012-04-04 09:41:18 UTC (rev 1208) @@ -4,11 +4,24 @@ <sectionGroup name="NUnit"> <section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/> </sectionGroup> - </configSections> + <sectionGroup name="Browsers"> + <section name="Managers" type="System.Configuration.NameValueSectionHandler"/> + </sectionGroup> + </configSections> <NUnit> <TestRunner> <!-- Valid values are STA,MTA. Others ignored. --> <add key="ApartmentState" value="STA"/> </TestRunner> </NUnit> - <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> + <Browsers> + <Managers> + <add key="WatiN.Core.UnitTests.IETests.IEBrowserTestManager" value="WatiN.Core.UnitTests.dll" /> + <add key="WatiN.Core.UnitTests.FireFoxTests.FFBrowserTestManager" value="WatiN.Core.UnitTests.dll" /> + <!--add key="WatinWebDriverBrowser.WDBrowserTestManager" value ="C:\Development\WatiNWebDriverBrowser\WatinWebDriverBrowser\WatinWebDriverBrowser\bin\Debug\WatinWebDriverBrowser.dll" />--> + </Managers> + </Browsers> + <startup> + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> + </startup> +</configuration> Modified: trunk/src/UnitTests/BrowserTests.cs =================================================================== --- trunk/src/UnitTests/BrowserTests.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/UnitTests/BrowserTests.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -73,6 +73,7 @@ { // THEN cursor should still be on 50,50 Assert.That(Cursor.Position, Is.EqualTo(notTopLeftPoint)); + manager.CloseBrowser(); } // WHEN we set to the mousepointer to top left @@ -82,6 +83,7 @@ { // THEN cursor should be on 0,0 Assert.That(Cursor.Position, Is.EqualTo(new Point(0, 0))); + manager.CloseBrowser(); } }); } Modified: trunk/src/UnitTests/ButtonTests.cs =================================================================== --- trunk/src/UnitTests/ButtonTests.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/UnitTests/ButtonTests.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -77,7 +77,7 @@ browser.Button("button1").Click(); // THEN - var value = browser.TextField("report").Value; + var value = browser.TextField("report").Text; Assert.That(value, Is.EqualTo("clicked")); }); } @@ -252,6 +252,7 @@ Assert.AreEqual(value, browser.Button("buttonelementid").ToString()); Assert.AreEqual(value, browser.Button(Find.ByName("buttonelementname")).Value); + Console.WriteLine("innertext: '" + browser.Button("buttonelementid").GetAttributeValue("innerText") + "'"); Assert.AreEqual(value, browser.Button(Find.ByText("Button Element")).Value); Assert.IsTrue(browser.Button(new Regex("buttonelementid")).Exists); @@ -346,6 +347,12 @@ private static bool IsBrowserFirefoxOrAtleastIE8(Document browser) { + // Only do this check for WatiN.Core.IE all other + // Browser drivers are assummed to support latest W3C standards + + var browserType = browser.GetType(); + if (!browserType.Equals(typeof(IE))) return true; + var browserVersion = 7; var ieUserAgent = browser.Eval("window.navigator.userAgent"); if (!string.IsNullOrEmpty(ieUserAgent) && new Regex(@"MSIE [8-9](\.\d+);").IsMatch(ieUserAgent)) @@ -353,9 +360,7 @@ browserVersion = 8; } - var browserType = browser.GetType(); - return browserType.Equals(typeof(FireFox)) || - (browserType.Equals(typeof(IE)) && browserVersion > 7); + return (browserType.Equals(typeof(IE)) && browserVersion > 7); } } } Modified: trunk/src/UnitTests/ListTests.cs =================================================================== --- trunk/src/UnitTests/ListTests.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/UnitTests/ListTests.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -16,7 +16,6 @@ #endregion Copyright - using System; using NUnit.Framework; using NUnit.Framework.SyntaxHelpers; Modified: trunk/src/UnitTests/ResearchTests/JavascriptErrorDetection.cs =================================================================== --- trunk/src/UnitTests/ResearchTests/JavascriptErrorDetection.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/UnitTests/ResearchTests/JavascriptErrorDetection.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -20,11 +20,12 @@ using mshtml; using NUnit.Framework; using SHDocVw; +using WatiN.Core.UnitTests.TestUtils; namespace WatiN.Core.UnitTests.ResearchTests { [TestFixture] - public class JavascriptErrorDetection + public class JavascriptErrorDetection : BaseWatiNTest { [Test, Ignore("Example code")] public void Should_detect_error() @@ -38,8 +39,20 @@ ie.GoTo(@"D:\Projects\WatiN\Support\ErrorInJavascript\Test.html"); ie.GoTo("google.com"); ie.GoTo(@"D:\Projects\WatiN\Support\ErrorInJavascript\Test.html"); - } } + + //public void Test() + //{ + // using (var ie = new IE(MainURI)) + // { + // ie.Link(Find.ByText("WatiN")).Click(); + + // Browser.AttachTo<IE>(Find.) + + // // 'opener' in javascript? should refer to window/doc that opened new window...? + + // } + //} } } Modified: trunk/src/UnitTests/TableRowTests.cs =================================================================== --- trunk/src/UnitTests/TableRowTests.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/UnitTests/TableRowTests.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -140,6 +140,7 @@ browser.GoTo(TablesUri); var tableRows = browser.Table("thead_tbody_tfoot").OwnTableRows; + Assert.That(tableRows.Count, Is.GreaterThan(0)); // WHEN var noHeaderRows = tableRows.Filter(TableRow.IsFooterRow()); Modified: trunk/src/UnitTests/TableTests.cs =================================================================== --- trunk/src/UnitTests/TableTests.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/UnitTests/TableTests.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -99,7 +99,7 @@ ExecuteTest(browser => { var table = browser.Table(tableId); - Assert.AreEqual("TH", table.TableRows[0].Elements[0].TagName.ToUpper(), "First tablerow should contain a TH element"); + Assert.AreEqual("TH", table.TableRows[0].Elements[0].TagName.ToUpper(), "First tablerow should contain a TH element"); var row = table.FindRow(new Regex("a"), 0); Assert.IsNotNull(row, "row expected"); Modified: trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs =================================================================== --- trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs 2012-04-04 09:41:18 UTC (rev 1208) @@ -23,6 +23,9 @@ using WatiN.Core.Logging; using WatiN.Core.UnitTests.FireFoxTests; using WatiN.Core.UnitTests.IETests; +using System.Reflection; +using System.Collections.Specialized; +using System.Configuration; # if INCLUDE_CHROME using WatiN.Core.UnitTests.Native.ChromeTests; #endif @@ -68,12 +71,19 @@ public override void FixtureSetup() { base.FixtureSetup(); -#if !IncludeChromeInUnitTesting - BrowsersToTestWith.Add(ieManager); - //BrowsersToTestWith.Add(ffManager); -#else - BrowsersToTestWith.Add(chromeManager); -#endif + + var section = ConfigurationManager.GetSection("Browsers/Managers") as NameValueCollection; + for(int i = 0; i < section.Count; i++) + { + var dll = section.GetValues(i)[0]; + var managerClass = section.GetKey(i); + + var assembly = Assembly.LoadFrom(dll); + var manager = (IBrowserTestManager)assembly.CreateInstance(managerClass); + + BrowsersToTestWith.Add(manager as IBrowserTestManager); + } + Logger.LogWriter = new ConsoleLogWriter {HandlesLogDebug = true}; } Modified: trunk/src/UnitTests/UnitTests.csproj =================================================================== --- trunk/src/UnitTests/UnitTests.csproj 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/UnitTests/UnitTests.csproj 2012-04-04 09:41:18 UTC (rev 1208) @@ -162,6 +162,7 @@ <Reference Include="System"> <Name>System</Name> </Reference> + <Reference Include="System.configuration" /> <Reference Include="System.Core"> <RequiredTargetFramework>3.5</RequiredTargetFramework> </Reference> @@ -194,6 +195,7 @@ <Compile Include="ControlCollectionTests.cs" /> <Compile Include="ControlTests.cs" /> <Compile Include="ComponentExtensionsTests.cs" /> + <Compile Include="html\DataBoundSupport\Class1.cs" /> <Compile Include="ElementFactoryTests.cs" /> <Compile Include="ElementOfTypeTests.cs" /> <Compile Include="HtmlColorTests.cs" /> @@ -252,6 +254,7 @@ <Compile Include="ResearchTests\JavascriptErrorDetection.cs" /> <Compile Include="ResearchTests\PositionMousePointerOnElementTest.cs" /> <Compile Include="ResearchTests\ScriptLoaderTests.cs" /> + <Compile Include="SteveTests.cs" /> <Compile Include="TestUtils\BaseWatiNTest.cs"> <SubType>Code</SubType> </Compile> @@ -432,6 +435,10 @@ <SubType>Code</SubType> </Compile> <Compile Include="WatiNSanityTests.cs" /> + <Content Include="html\DataBoundSupport\frame1.html" /> + <Content Include="html\DataBoundSupport\frame2.html" /> + <Content Include="html\DataBoundSupport\Frameset.html" /> + <Content Include="html\DataBoundSupport\MainPage.htm" /> <Content Include="html\BodyNotExistsBug.htm" /> <Content Include="html\ButtonTests.html" /> <Content Include="html\ClassConstraintTests.html" /> Modified: trunk/src/WatiN.sln =================================================================== --- trunk/src/WatiN.sln 2012-03-25 21:58:53 UTC (rev 1207) +++ trunk/src/WatiN.sln 2012-04-04 09:41:18 UTC (rev 1208) @@ -17,8 +17,10 @@ ChromeTesting|Any CPU = ChromeTesting|Any CPU Debug (.Net 3.5)|Any CPU = Debug (.Net 3.5)|Any CPU Debug (.Net 4.0)|Any CPU = Debug (.Net 4.0)|Any CPU + Debug|Any CPU = Debug|Any CPU Release (.Net 3.5)|Any CPU = Release (.Net 3.5)|Any CPU Release (.Net 4.0)|Any CPU = Release (.Net 4.0)|Any CPU + Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {217E2D34-F6DF-431B-AC5A-B368F481A530}.AutomatedDebug|Any CPU.ActiveCfg = AutomatedDebug|Any CPU @@ -29,10 +31,14 @@ {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug (.Net 3.5)|Any CPU.Build.0 = Debug (.Net 4.0)|Any CPU {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug (.Net 4.0)|Any CPU.ActiveCfg = Debug (.Net 4.0)|Any CPU {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug (.Net 4.0)|Any CPU.Build.0 = Debug (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug|Any CPU.ActiveCfg = AutomatedDebug|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Debug|Any CPU.Build.0 = AutomatedDebug|Any CPU {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release (.Net 3.5)|Any CPU.ActiveCfg = Release (.Net 4.0)|Any CPU {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release (.Net 3.5)|Any CPU.Build.0 = Release (.Net 4.0)|Any CPU {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release (.Net 4.0)|Any CPU.ActiveCfg = Release (.Net 4.0)|Any CPU {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release (.Net 4.0)|Any CPU.Build.0 = Release (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release|Any CPU.ActiveCfg = Release (.Net 4.0)|Any CPU + {217E2D34-F6DF-431B-AC5A-B368F481A530}.Release|Any CPU.Build.0 = Release (.Net 4.0)|Any CPU {D6E231B3-28D9-4F73-9586-738FB528B4DB}.AutomatedDebug|Any CPU.ActiveCfg = Release (.Net 3.5)|Any CPU {D6E231B3-28D9-4F73-9586-738FB528B4DB}.AutomatedDebug|Any CPU.Build.0 = Release (.Net 3.5)|Any CPU {D6E231B3-28D9-4F73-9586-738FB528B4DB}.ChromeTesting|Any CPU.ActiveCfg = ChromeTesting|Any CPU @@ -41,10 +47,14 @@ {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug (.Net 3.5)|Any CPU.Build.0 = Debug (.Net 3.5)|Any CPU {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug (.Net 4.0)|Any CPU.ActiveCfg = Debug (.Net 4.0)|Any CPU {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug (.Net 4.0)|Any CPU.Build.0 = Debug (.Net 4.0)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug|Any CPU.ActiveCfg = Debug (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Debug|Any CPU.Build.0 = Debug (.Net 3.5)|Any CPU {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release (.Net 3.5)|Any CPU.ActiveCfg = Release (.Net 3.5)|Any CPU {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release (.Net 3.5)|Any CPU.Build.0 = Release (.Net 3.5)|Any CPU {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release (.Net 4.0)|Any CPU.ActiveCfg = Release (.Net 4.0)|Any CPU {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release (.Net 4.0)|Any CPU.Build.0 = Release (.Net 4.0)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release|Any CPU.ActiveCfg = Release (.Net 3.5)|Any CPU + {D6E231B3-28D9-4F73-9586-738FB528B4DB}.Release|Any CPU.Build.0 = Release (.Net 3.5)|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-03-25 21:58:59
|
Revision: 1207 http://watin.svn.sourceforge.net/watin/?rev=1207&view=rev Author: jvmenen Date: 2012-03-25 21:58:53 +0000 (Sun, 25 Mar 2012) Log Message: ----------- - Fixed bug in building frame hierarchy in Frame.SetFrameHierarchy causing issues when frames are nested more then 2 framesets deep. - Fixed issue with Frame.SetFrameHierarchy when frame had no name. Now Id is used or if id also empty, an id is assigned to frameelement and used in the hierarchy. Modified Paths: -------------- trunk/src/Core/Frame.cs trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs trunk/src/UnitTests/ElementTagTests.cs trunk/src/UnitTests/FrameTests.cs trunk/src/UnitTests/UnitTests.csproj Added Paths: ----------- trunk/src/UnitTests/html/FramesetWithinFramesetWithinFrameset.html Modified: trunk/src/Core/Frame.cs =================================================================== --- trunk/src/Core/Frame.cs 2012-03-16 22:17:54 UTC (rev 1206) +++ trunk/src/Core/Frame.cs 2012-03-25 21:58:53 UTC (rev 1207) @@ -58,10 +58,29 @@ { if (parentDocument == null) return; - var hierarchy = GetAttributeValue("data-watinFrameHierarchy") + parentDocument.Name + "."; - SetAttributeValue("data-watinFrameHierarchy", hierarchy); + var frameElement = parentDocument.FrameElement; + var nameOrId = GetFrameElementNameOrId(frameElement); + var hierarchy = frameElement.GetAttributeValue("data-watinFrameHierarchy") + nameOrId + "."; + + FrameElement.SetAttributeValue("data-watinFrameHierarchy", hierarchy); } + private static string GetFrameElementNameOrId(Element frameElement) + { + var frameRef = frameElement.Name; + + if (string.IsNullOrEmpty(frameRef)) + frameRef = frameElement.Id; + + if (string.IsNullOrEmpty(frameRef)) + { + frameRef = frameElement.GetJavascriptElementReference(); + frameElement.SetAttributeValue("Id", "frame_" + frameRef); + } + + return frameRef; + } + private static Element CreateFrameElement(DomContainer domContainer, INativeDocument frameDocument) { return new Element(domContainer, frameDocument.ContainingFrameElement); Modified: trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs =================================================================== --- trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2012-03-16 22:17:54 UTC (rev 1206) +++ trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2012-03-25 21:58:53 UTC (rev 1207) @@ -226,7 +226,50 @@ }); } + [Test] + public void Should_find_element_in_frame_within_frame_within_frame() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(new Uri(HtmlTestBaseURI, "FramesetWithinFramesetWithinFrameset.html")); + var frame = browser.Frame(Find.ByName("zerolevel")). + Frame(Find.ByName("firstlevel")). + Frame(Find.ByName("main")); + // WHEN + var link = frame.Link(Find.BySelector("#Microsoft")); + + // THEN + Assert.That(link.Exists); + }); + } + + [Test] + public void Should_find_element_in_frame_within_frame_even_when_no_name_or_id_is_set() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(FramesetWithinFramesetURI); + var firstFrame = browser.Frame("mainid"); + + firstFrame.FrameElement.SetAttributeValue("id", ""); + firstFrame.FrameElement.SetAttributeValue("name", ""); + + firstFrame = browser.Frames[1]; + + // WHEN + var link = firstFrame.Frame("mainid").Link(Find.BySelector("#Microsoft")); + + // THEN + Assert.That(link.Exists); + Assert.That(firstFrame.Id, Text.StartsWith("frame_watin"), "Pre-condition: Expected no Id for firstFrame"); + }); + } + + + public override Uri TestPageUri { get { return MainURI; } Modified: trunk/src/UnitTests/ElementTagTests.cs =================================================================== --- trunk/src/UnitTests/ElementTagTests.cs 2012-03-16 22:17:54 UTC (rev 1206) +++ trunk/src/UnitTests/ElementTagTests.cs 2012-03-25 21:58:53 UTC (rev 1207) @@ -71,6 +71,21 @@ } } + [Test] + public void Should_be_equal_when_comparing_lower_with_uppercase_tagname() + { + // GIVEN + var tagLowerCase = new ElementTag("frame"); + var tagUpperCase = new ElementTag("FRAME"); + + // WHEN + var isEqual = tagLowerCase.Equals(tagUpperCase); + + // THEN + Assert.IsTrue(isEqual, "Casing should not be relavent"); + + } + private static void AssertLowerCaseUpperCase(Mock<INativeElement> elementMock) { // LowerCase Modified: trunk/src/UnitTests/FrameTests.cs =================================================================== --- trunk/src/UnitTests/FrameTests.cs 2012-03-16 22:17:54 UTC (rev 1206) +++ trunk/src/UnitTests/FrameTests.cs 2012-03-25 21:58:53 UTC (rev 1207) @@ -238,14 +238,16 @@ ExecuteTest(browser => { // GIVEN - browser.GoTo(FramesetWithinFramesetURI); - var mainFrame = browser.Frame(Find.ByName("firstlevel")).Frame(Find.ByName("main")); + browser.GoTo(new Uri(HtmlTestBaseURI, "FramesetWithinFramesetWithinFrameset.html")); + var mainFrame = browser.Frame(Find.ByName("zerolevel")). + Frame(Find.ByName("firstlevel")). + Frame(Find.ByName("main")); // WHEN var result = mainFrame.GetAttributeValue("data-watinFrameHierarchy"); //THEN - Assert.That(result, Is.EqualTo("firstlevel.")); + Assert.That(result, Is.EqualTo("zerolevel.firstlevel.")); }); } Modified: trunk/src/UnitTests/UnitTests.csproj =================================================================== --- trunk/src/UnitTests/UnitTests.csproj 2012-03-16 22:17:54 UTC (rev 1206) +++ trunk/src/UnitTests/UnitTests.csproj 2012-03-25 21:58:53 UTC (rev 1207) @@ -435,6 +435,7 @@ <Content Include="html\BodyNotExistsBug.htm" /> <Content Include="html\ButtonTests.html" /> <Content Include="html\ClassConstraintTests.html" /> + <Content Include="html\FramesetWithinFramesetWithinFrameset.html" /> <Content Include="html\iframes\FramesetWithinIFrame.html" /> <Content Include="html\iframes\iFramesWithinFrameset.html" /> <Content Include="html\Frameset2.html" /> Added: trunk/src/UnitTests/html/FramesetWithinFramesetWithinFrameset.html =================================================================== --- trunk/src/UnitTests/html/FramesetWithinFramesetWithinFrameset.html (rev 0) +++ trunk/src/UnitTests/html/FramesetWithinFramesetWithinFrameset.html 2012-03-25 21:58:53 UTC (rev 1207) @@ -0,0 +1,12 @@ +<!-- saved from url=(0029)http://watin.sourceforge.net/ --> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> +<html> + <head> + <TITLE>Contents Frameset</TITLE> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + </head> + <frameset cols="150,*"> + <frame name="contents" src="Index.html"> + <frame name="zerolevel" id="mainid" src="FramesetWithinFrameset.html"> + </frameset> +</html> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-03-16 22:18:00
|
Revision: 1206 http://watin.svn.sourceforge.net/watin/?rev=1206&view=rev Author: jvmenen Date: 2012-03-16 22:17:54 +0000 (Fri, 16 Mar 2012) Log Message: ----------- Removed Frame.ParentFrame Modified Paths: -------------- trunk/src/Core/Frame.cs Modified: trunk/src/Core/Frame.cs =================================================================== --- trunk/src/Core/Frame.cs 2012-03-16 22:12:09 UTC (rev 1205) +++ trunk/src/Core/Frame.cs 2012-03-16 22:17:54 UTC (rev 1206) @@ -28,7 +28,6 @@ [ElementTag("iframe", Index = 1)] public class Frame : Document { - private Frame ParentFrame { get; set; } public Element FrameElement { get; private set; } private readonly INativeDocument _frameDocument; @@ -46,20 +45,20 @@ throw new ArgumentNullException("frameDocument"); _frameDocument = frameDocument; - ParentFrame = parentDocument; FrameElement = CreateFrameElement(domContainer, frameDocument); - SetFrameHierarchy(); + SetFrameHierarchy(parentDocument); } - /// <summary> - /// This is done to facilitate CSS selector look up in IEElementCollection - /// </summary> - private void SetFrameHierarchy() + /// <summary> + /// This is done to facilitate CSS selector look up in IEElementCollection + /// </summary> + /// <param name="parentDocument"> </param> + private void SetFrameHierarchy(Frame parentDocument) { - if (ParentFrame == null) return; + if (parentDocument == null) return; - var hierarchy = GetAttributeValue("data-watinFrameHierarchy") + ParentFrame.Name + "."; + var hierarchy = GetAttributeValue("data-watinFrameHierarchy") + parentDocument.Name + "."; SetAttributeValue("data-watinFrameHierarchy", hierarchy); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-03-16 22:12:15
|
Revision: 1205 http://watin.svn.sourceforge.net/watin/?rev=1205&view=rev Author: jvmenen Date: 2012-03-16 22:12:09 +0000 (Fri, 16 Mar 2012) Log Message: ----------- simplified SetFrameHierarchy in Frame and made Frame.ParentFrame private Modified Paths: -------------- trunk/src/Core/Frame.cs trunk/src/UnitTests/FrameTests.cs trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs Modified: trunk/src/Core/Frame.cs =================================================================== --- trunk/src/Core/Frame.cs 2012-03-16 20:32:23 UTC (rev 1204) +++ trunk/src/Core/Frame.cs 2012-03-16 22:12:09 UTC (rev 1205) @@ -28,7 +28,7 @@ [ElementTag("iframe", Index = 1)] public class Frame : Document { - public Frame ParentFrame { get; private set; } + private Frame ParentFrame { get; set; } public Element FrameElement { get; private set; } private readonly INativeDocument _frameDocument; @@ -49,9 +49,20 @@ ParentFrame = parentDocument; FrameElement = CreateFrameElement(domContainer, frameDocument); - SetAttributeValue("data-watinFrameHierarchy", JavaScriptFrameHierarchy); + SetFrameHierarchy(); } + /// <summary> + /// This is done to facilitate CSS selector look up in IEElementCollection + /// </summary> + private void SetFrameHierarchy() + { + if (ParentFrame == null) return; + + var hierarchy = GetAttributeValue("data-watinFrameHierarchy") + ParentFrame.Name + "."; + SetAttributeValue("data-watinFrameHierarchy", hierarchy); + } + private static Element CreateFrameElement(DomContainer domContainer, INativeDocument frameDocument) { return new Element(domContainer, frameDocument.ContainingFrameElement); @@ -73,24 +84,6 @@ get { return GetAttributeValue("id"); } } - public string JavaScriptFrameHierarchy - { - get - { - var namesHierarchy = string.Empty; - - var parentFrame = ParentFrame; - while (parentFrame != null) - { - var parentFrameElementName = parentFrame.Name; - namesHierarchy = parentFrameElementName + "." + namesHierarchy; - parentFrame = parentFrame.ParentFrame; - } - - return namesHierarchy; - } - } - /// <inheritdoc /> protected override string GetAttributeValueImpl(string attributeName) { Modified: trunk/src/UnitTests/FrameTests.cs =================================================================== --- trunk/src/UnitTests/FrameTests.cs 2012-03-16 20:32:23 UTC (rev 1204) +++ trunk/src/UnitTests/FrameTests.cs 2012-03-16 22:12:09 UTC (rev 1205) @@ -216,36 +216,19 @@ } [Test] - public void Should_return_javascript_name_frame_hierarchy() + public void Should_not_have_stored_javascript_names_frame_hierarchy_for_first_level_frame() { ExecuteTest(browser => { // GIVEN - var mainFrame = browser.Frame("mainid"); - - // WHEN - var result = mainFrame.JavaScriptFrameHierarchy; - - //THEN - Assert.That(result, Is.Empty); - } - ); - } - - [Test] - public void Should_return_javascript_names_frame_hierarchy() - { - ExecuteTest(browser => - { - // GIVEN browser.GoTo(FramesetWithinFramesetURI); - var mainFrame = browser.Frame(Find.ByName("firstlevel")).Frame(Find.ByName("main")); + var mainFrame = browser.Frame(Find.ByName("firstlevel")); // WHEN - var result = mainFrame.JavaScriptFrameHierarchy; + var result = mainFrame.GetAttributeValue("data-watinFrameHierarchy"); //THEN - Assert.That(result, Is.EqualTo("firstlevel.")); + Assert.That(result, Is.Null); }); } Modified: trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs =================================================================== --- trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs 2012-03-16 20:32:23 UTC (rev 1204) +++ trunk/src/UnitTests/TestUtils/BaseWithBrowserTests.cs 2012-03-16 22:12:09 UTC (rev 1205) @@ -70,7 +70,7 @@ base.FixtureSetup(); #if !IncludeChromeInUnitTesting BrowsersToTestWith.Add(ieManager); - BrowsersToTestWith.Add(ffManager); + //BrowsersToTestWith.Add(ffManager); #else BrowsersToTestWith.Add(chromeManager); #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2012-03-16 20:32:30
|
Revision: 1204 http://watin.svn.sourceforge.net/watin/?rev=1204&view=rev Author: jvmenen Date: 2012-03-16 20:32:23 +0000 (Fri, 16 Mar 2012) Log Message: ----------- Made it possible to use FindBySelector(cssSelector) inside nested frames Modified Paths: -------------- trunk/src/Core/Document.cs trunk/src/Core/Frame.cs trunk/src/Core/FrameCollection.cs trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs trunk/src/UnitTests/FrameTests.cs trunk/src/UnitTests/html/FramesetWithinFrameset.html Modified: trunk/src/Core/Document.cs =================================================================== --- trunk/src/Core/Document.cs 2011-10-26 14:31:57 UTC (rev 1203) +++ trunk/src/Core/Document.cs 2012-03-16 20:32:23 UTC (rev 1204) @@ -368,7 +368,7 @@ /// </summary> public virtual FrameCollection Frames { - get { return new FrameCollection(DomContainer, NativeDocument); } + get { return new FrameCollection(DomContainer, NativeDocument, this); } } /// <summary> Modified: trunk/src/Core/Frame.cs =================================================================== --- trunk/src/Core/Frame.cs 2011-10-26 14:31:57 UTC (rev 1203) +++ trunk/src/Core/Frame.cs 2012-03-16 20:32:23 UTC (rev 1204) @@ -28,26 +28,36 @@ [ElementTag("iframe", Index = 1)] public class Frame : Document { + public Frame ParentFrame { get; private set; } public Element FrameElement { get; private set; } private readonly INativeDocument _frameDocument; - /// <summary> - /// This constructor will mainly be used by the constructor of FrameCollection - /// to create an instance of a Frame. - /// </summary> - /// <param name="domContainer">The domContainer</param> - /// <param name="frameDocument">The document within the frame</param> - public Frame(DomContainer domContainer, INativeDocument frameDocument) + /// <summary> + /// This constructor will mainly be used by the constructor of FrameCollection + /// to create an instance of a Frame. + /// </summary> + /// <param name="domContainer">The domContainer</param> + /// <param name="frameDocument">The document within the frame</param> + /// <param name="parentDocument"> </param> + public Frame(DomContainer domContainer, INativeDocument frameDocument, Frame parentDocument) : base(domContainer) { - if (frameDocument == null) + if (frameDocument == null) throw new ArgumentNullException("frameDocument"); _frameDocument = frameDocument; - FrameElement = new Element(domContainer, frameDocument.ContainingFrameElement); + ParentFrame = parentDocument; + FrameElement = CreateFrameElement(domContainer, frameDocument); + + SetAttributeValue("data-watinFrameHierarchy", JavaScriptFrameHierarchy); } - /// <inheritdoc /> + private static Element CreateFrameElement(DomContainer domContainer, INativeDocument frameDocument) + { + return new Element(domContainer, frameDocument.ContainingFrameElement); + } + + /// <inheritdoc /> public override INativeDocument NativeDocument { get { return _frameDocument; } @@ -63,7 +73,25 @@ get { return GetAttributeValue("id"); } } - /// <inheritdoc /> + public string JavaScriptFrameHierarchy + { + get + { + var namesHierarchy = string.Empty; + + var parentFrame = ParentFrame; + while (parentFrame != null) + { + var parentFrameElementName = parentFrame.Name; + namesHierarchy = parentFrameElementName + "." + namesHierarchy; + parentFrame = parentFrame.ParentFrame; + } + + return namesHierarchy; + } + } + + /// <inheritdoc /> protected override string GetAttributeValueImpl(string attributeName) { switch (attributeName.ToLowerInvariant()) Modified: trunk/src/Core/FrameCollection.cs =================================================================== --- trunk/src/Core/FrameCollection.cs 2011-10-26 14:31:57 UTC (rev 1203) +++ trunk/src/Core/FrameCollection.cs 2012-03-16 20:32:23 UTC (rev 1204) @@ -22,23 +22,23 @@ namespace WatiN.Core { - /// <summary> - /// A typed collection of <see cref="Frame" /> instances within a <see cref="Document"/>. - /// </summary> - public class FrameCollection : BaseComponentCollection<Frame, FrameCollection> - { + /// <summary> + /// A typed collection of <see cref="Frame" /> instances within a <see cref="Document"/>. + /// </summary> + public class FrameCollection : BaseComponentCollection<Frame, FrameCollection> + { private readonly Constraint findBy; private readonly List<Frame> frames; - public FrameCollection(DomContainer domContainer, INativeDocument htmlDocument) - { + public FrameCollection(DomContainer domContainer, INativeDocument htmlDocument, Document document) + { findBy = Find.Any; frames = new List<Frame>(); foreach (INativeDocument frameDocument in htmlDocument.Frames) - frames.Add(new Frame(domContainer, frameDocument)); - } + frames.Add(new Frame(domContainer, frameDocument, document as Frame)); + } private FrameCollection(Constraint findBy, List<Frame> frames) { Modified: trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2011-10-26 14:31:57 UTC (rev 1203) +++ trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2012-03-16 20:32:23 UTC (rev 1204) @@ -83,15 +83,19 @@ public IEnumerable<INativeElement> GetElementsWithQuerySelector(string selector, DomContainer domContainer) { - domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript()); var container = "document"; if (_element != null) { container = _element.GetJavaScriptElementReference(); if (new ElementTag(_element.TagName).Equals(new ElementTag("frame"))) - container = container + ".contentDocument"; + { + var frameHierarchy = _element.GetAttributeValue("data-watinFrameHierarchy"); + container = frameHierarchy + container + ".contentDocument"; + } } + domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript()); + var code = string.Format("document.___WATINRESULT = Sizzle('{0}', {1});", selector, container); domContainer.RunScript(code); Modified: trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs =================================================================== --- trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2011-10-26 14:31:57 UTC (rev 1203) +++ trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2012-03-16 20:32:23 UTC (rev 1204) @@ -191,7 +191,7 @@ }); } - [Test, Ignore("Bug: Queryselector can't be used to find Frames in IE")] + [Test] public void Should_find_element_in_frame() { ExecuteTest(browser => @@ -209,22 +209,17 @@ }); } - [Test, Ignore("Bug: Queryselector not working with Frames in IE")] + [Test] public void Should_find_element_in_frame_within_frame() { ExecuteTest(browser => { // GIVEN browser.GoTo(FramesetWithinFramesetURI); - var frame1 = browser.Frame("mainid"); - Console.WriteLine(frame1.FrameElement.GetJavascriptElementReference()); - var frame2 = frame1.Frame("mainid"); - var javascriptElementReference = frame2.FrameElement.GetJavascriptElementReference(); - Console.WriteLine(javascriptElementReference); - + var frame = browser.Frame("mainid").Frame("mainid"); // WHEN - var link = frame2.Link(Find.BySelector("#Microsoft")); + var link = frame.Link(Find.BySelector("#Microsoft")); // THEN Assert.That(link.Exists); Modified: trunk/src/UnitTests/FrameTests.cs =================================================================== --- trunk/src/UnitTests/FrameTests.cs 2011-10-26 14:31:57 UTC (rev 1203) +++ trunk/src/UnitTests/FrameTests.cs 2012-03-16 20:32:23 UTC (rev 1204) @@ -26,183 +26,183 @@ namespace WatiN.Core.UnitTests { - [TestFixture] - public class FramesetTests : BaseWithBrowserTests - { - private const string frameNameContents = "contents"; - private const string frameNameMain = "main"; + [TestFixture] + public class FramesetTests : BaseWithBrowserTests + { + private const string frameNameContents = "contents"; + private const string frameNameMain = "main"; - public override Uri TestPageUri - { - get { return FramesetURI; } - } + public override Uri TestPageUri + { + get { return FramesetURI; } + } - [Test] - public void IEFrameIsAFrame() - { - Assert.IsInstanceOfType(typeof (Frame), Ie.Frame("mainid")); - } + [Test] + public void IEFrameIsAFrame() + { + Assert.IsInstanceOfType(typeof (Frame), Ie.Frame("mainid")); + } - [Test] - public void FrameIsADocument() - { - Assert.IsInstanceOfType(typeof (Document), Ie.Frame("mainid")); - } + [Test] + public void FrameIsADocument() + { + Assert.IsInstanceOfType(typeof (Document), Ie.Frame("mainid")); + } - [Test] - public void ExpectFrameNotFoundException() - { - ExecuteTest(browser => - { - try - { - browser.Frame(Find.ById("NonExistingFrameID")); + [Test] + public void ExpectFrameNotFoundException() + { + ExecuteTest(browser => + { + try + { + browser.Frame(Find.ById("NonExistingFrameID")); Assert.Fail("Expected " + typeof(FrameNotFoundException)); - } - catch (Exception e) - { - Assert.That(e, Is.InstanceOfType(typeof(FrameNotFoundException)), "Unexpected exception"); + } + catch (Exception e) + { + Assert.That(e, Is.InstanceOfType(typeof(FrameNotFoundException)), "Unexpected exception"); Assert.That(e.Message, Is.EqualTo("Could not find a Frame or IFrame matching constraint: Attribute 'id' equals 'NonExistingFrameID'"), "Unexpected message"); - } - }); - } + } + }); + } - [Test] - public void FramesCollectionExists() - { - ExecuteTest(browser => - { + [Test] + public void FramesCollectionExists() + { + ExecuteTest(browser => + { Assert.IsTrue(browser.Frames.Exists(Find.ByName("contents"))); Assert.IsFalse(browser.Frames.Exists(Find.ByName("nonexisting"))); - }); - } + }); + } - [Test] - public void ContentsFrame() - { - ExecuteTest(browser => - { + [Test] + public void ContentsFrame() + { + ExecuteTest(browser => + { var contentsFrame = browser.Frame(Find.ByName("contents")); - Assert.IsNotNull(contentsFrame, "Frame expected"); - Assert.AreEqual("contents", contentsFrame.Name); - Assert.AreEqual(null, contentsFrame.Id); + Assert.IsNotNull(contentsFrame, "Frame expected"); + Assert.AreEqual("contents", contentsFrame.Name); + Assert.AreEqual(null, contentsFrame.Id); AssertFindFrame(browser, Find.ByUrl(IndexURI), frameNameContents); - }); - } + }); + } - [Test] - public void MainFrame() - { - ExecuteTest(browser => - { - var mainFrame = browser.Frame(Find.ById("mainid")); - Assert.IsNotNull(mainFrame, "Frame expected"); - Assert.AreEqual("main", mainFrame.Name); - Assert.AreEqual("mainid", mainFrame.Id); + [Test] + public void MainFrame() + { + ExecuteTest(browser => + { + var mainFrame = browser.Frame(Find.ById("mainid")); + Assert.IsNotNull(mainFrame, "Frame expected"); + Assert.AreEqual("main", mainFrame.Name); + Assert.AreEqual("mainid", mainFrame.Id); - AssertFindFrame(browser, Find.ByName(frameNameMain), frameNameMain); - }); - } + AssertFindFrame(browser, Find.ByName(frameNameMain), frameNameMain); + }); + } - [Test] - public void FrameHTMLShouldNotReturnParentHTML() - { - ExecuteTest(browser => - { + [Test] + public void FrameHTMLShouldNotReturnParentHTML() + { + ExecuteTest(browser => + { var contentsFrame = browser.Frame(Find.ByName("contents")); Assert.AreNotEqual(browser.Html, contentsFrame.Html, "Html should be from the frame page."); - }); - } + }); + } // TODO: Make multi browser test as soon as WatiN can handle multiple instances of FireFox - [Test] - public void DoesFrameCodeWorkIfTwoBrowsersWithFramesAreOpen() - { - using (var ie2 = new IE(FramesetURI)) - { - var contentsFrame = ie2.Frame(Find.ByName("contents")); - Assert.IsFalse(contentsFrame.Html.StartsWith("<FRAMESET"), "inner html of frame is expected"); - } - } + [Test] + public void DoesFrameCodeWorkIfTwoBrowsersWithFramesAreOpen() + { + using (var ie2 = new IE(FramesetURI)) + { + var contentsFrame = ie2.Frame(Find.ByName("contents")); + Assert.IsFalse(contentsFrame.Html.StartsWith("<FRAMESET"), "inner html of frame is expected"); + } + } - [Test] - public void Frames() - { - ExecuteTest(browser => - { - const int expectedFramesCount = 2; + [Test] + public void Frames() + { + ExecuteTest(browser => + { + const int expectedFramesCount = 2; var frames = browser.Frames; Assert.AreEqual(expectedFramesCount, frames.Count, "Unexpected number of frames"); - // Collection items by index - Assert.AreEqual(frameNameContents, frames[0].Name); - Assert.AreEqual(frameNameMain, frames[1].Name); + // Collection items by index + Assert.AreEqual(frameNameContents, frames[0].Name); + Assert.AreEqual(frameNameMain, frames[1].Name); - IEnumerable frameEnumerable = frames; - var frameEnumerator = frameEnumerable.GetEnumerator(); + IEnumerable frameEnumerable = frames; + var frameEnumerator = frameEnumerable.GetEnumerator(); - // Collection iteration and comparing the result with Enumerator - var count = 0; - foreach (Frame frame in frames) - { - frameEnumerator.MoveNext(); - var enumFrame = frameEnumerator.Current; + // Collection iteration and comparing the result with Enumerator + var count = 0; + foreach (Frame frame in frames) + { + frameEnumerator.MoveNext(); + var enumFrame = frameEnumerator.Current; - Assert.IsInstanceOfType(frame.GetType(), enumFrame, "Types are not the same"); - Assert.AreEqual(frame.Html, ((Frame) enumFrame).Html, "foreach and IEnumator don't act the same."); - ++count; - } + Assert.IsInstanceOfType(frame.GetType(), enumFrame, "Types are not the same"); + Assert.AreEqual(frame.Html, ((Frame) enumFrame).Html, "foreach and IEnumator don't act the same."); + ++count; + } - Assert.IsFalse(frameEnumerator.MoveNext(), "Expected last item"); - Assert.AreEqual(expectedFramesCount, count); - }); - } + Assert.IsFalse(frameEnumerator.MoveNext(), "Expected last item"); + Assert.AreEqual(expectedFramesCount, count); + }); + } - [Test] - public void ShouldBeAbleToAccessCustomAttributeInFrameSetElement() - { - ExecuteTest(browser => - { - var value = browser.Frame("mainid").GetAttributeValue("mycustomattribute"); - Assert.That(value, Is.EqualTo("WatiN")); - }); - } + [Test] + public void ShouldBeAbleToAccessCustomAttributeInFrameSetElement() + { + ExecuteTest(browser => + { + var value = browser.Frame("mainid").GetAttributeValue("mycustomattribute"); + Assert.That(value, Is.EqualTo("WatiN")); + }); + } - [Test] - public void ShouldBeAbleToFindFrameUsingCustomAttributeInFrameSetElement() - { - ExecuteTest(browser => - { - var frame = browser.Frame(Find.By("mycustomattribute","WatiN")); - Assert.That(frame.Id, Is.EqualTo("mainid")); - }); - } + [Test] + public void ShouldBeAbleToFindFrameUsingCustomAttributeInFrameSetElement() + { + ExecuteTest(browser => + { + var frame = browser.Frame(Find.By("mycustomattribute","WatiN")); + Assert.That(frame.Id, Is.EqualTo("mainid")); + }); + } - [Test] - public void ShouldThrowFrameNotFoundExceptionWhenFindingFrameWithNonExistingAttribute() - { - ExecuteTest(browser => - { - try - { - browser.Frame(Find.By("nonexisting","something")); + [Test] + public void ShouldThrowFrameNotFoundExceptionWhenFindingFrameWithNonExistingAttribute() + { + ExecuteTest(browser => + { + try + { + browser.Frame(Find.By("nonexisting","something")); Assert.Fail("Expected " + typeof(FrameNotFoundException)); - } - catch (Exception e) - { - Assert.That(e, Is.TypeOf(typeof(FrameNotFoundException)), "Unexpected exception"); - } - }); - } + } + catch (Exception e) + { + Assert.That(e, Is.TypeOf(typeof(FrameNotFoundException)), "Unexpected exception"); + } + }); + } - [Test] - public void ShouldBeAbleToSetFrameAttribute() - { + [Test] + public void ShouldBeAbleToSetFrameAttribute() + { ExecuteTest(browser => { - // GIVEN + // GIVEN var mainFrame = browser.Frame("mainid"); Assert.That(mainFrame.GetAttributeValue("myAttrib"), Is.Null, "pre-condition failed"); @@ -213,19 +213,69 @@ Assert.That(mainFrame.GetAttributeValue("myAttrib"), Is.EqualTo("myValue")); } ); - } + } + [Test] + public void Should_return_javascript_name_frame_hierarchy() + { + ExecuteTest(browser => + { + // GIVEN + var mainFrame = browser.Frame("mainid"); - private static void AssertFindFrame(Document document, AttributeConstraint findBy, string expectedFrameName) - { - Frame frame = null; - var attributeName = findBy.AttributeName.ToLower(); - if (attributeName == "href" || attributeName == "name") - { - frame = document.Frame(findBy); - } + // WHEN + var result = mainFrame.JavaScriptFrameHierarchy; + + //THEN + Assert.That(result, Is.Empty); + } + ); + } + + [Test] + public void Should_return_javascript_names_frame_hierarchy() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(FramesetWithinFramesetURI); + var mainFrame = browser.Frame(Find.ByName("firstlevel")).Frame(Find.ByName("main")); + + // WHEN + var result = mainFrame.JavaScriptFrameHierarchy; + + //THEN + Assert.That(result, Is.EqualTo("firstlevel.")); + }); + } + + [Test] + public void Should_store_javascript_names_frame_hierarchy() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(FramesetWithinFramesetURI); + var mainFrame = browser.Frame(Find.ByName("firstlevel")).Frame(Find.ByName("main")); + + // WHEN + var result = mainFrame.GetAttributeValue("data-watinFrameHierarchy"); + + //THEN + Assert.That(result, Is.EqualTo("firstlevel.")); + }); + } + + private static void AssertFindFrame(Document document, AttributeConstraint findBy, string expectedFrameName) + { + Frame frame = null; + var attributeName = findBy.AttributeName.ToLower(); + if (attributeName == "href" || attributeName == "name") + { + frame = document.Frame(findBy); + } Assert.IsNotNull(frame, "Frame '" + findBy.Comparer + "' not found"); Assert.AreEqual(expectedFrameName, frame.Name, "Incorrect frame for " + findBy + ", " + findBy.Comparer); - } - } + } + } } \ No newline at end of file Modified: trunk/src/UnitTests/html/FramesetWithinFrameset.html =================================================================== --- trunk/src/UnitTests/html/FramesetWithinFrameset.html 2011-10-26 14:31:57 UTC (rev 1203) +++ trunk/src/UnitTests/html/FramesetWithinFrameset.html 2012-03-16 20:32:23 UTC (rev 1204) @@ -7,6 +7,6 @@ </head> <frameset cols="150,*"> <frame name="contents" src="Index.html"> - <frame name="main" id="mainid" src="Frameset.html"> + <frame name="firstlevel" id="mainid" src="Frameset.html"> </frameset> </html> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2011-10-26 14:32:07
|
Revision: 1203 http://watin.svn.sourceforge.net/watin/?rev=1203&view=rev Author: jvmenen Date: 2011-10-26 14:31:57 +0000 (Wed, 26 Oct 2011) Log Message: ----------- IE.HtmlDialogs and IE.HtmlDialog(...) will only return HtmlDialogs popped up by that IE instance. Verified on Win7 with IE9, code is in place to make this work with other versions of IE. Modified Paths: -------------- trunk/src/Core/Core.csproj trunk/src/Core/DialogHandlers/BaseDialogHandler.cs trunk/src/Core/HTMLDialogCollection.cs trunk/src/Core/Interfaces/IDialogHandler.cs trunk/src/UnitTests/HTMLDialogTests.cs Added Paths: ----------- trunk/src/Core/Native/InternetExplorer/IESWindowHelper.cs Modified: trunk/src/Core/Core.csproj =================================================================== --- trunk/src/Core/Core.csproj 2011-10-26 12:35:10 UTC (rev 1202) +++ trunk/src/Core/Core.csproj 2011-10-26 14:31:57 UTC (rev 1203) @@ -245,6 +245,7 @@ <Compile Include="Native\ClientPortBase.cs" /> <Compile Include="Native\InternetExplorer\Expando.cs" /> <Compile Include="Native\InternetExplorer\IEFireEventHandler.cs" /> + <Compile Include="Native\InternetExplorer\IESWindowHelper.cs" /> <Compile Include="Native\InternetExplorer\JScriptElementArrayEnumerator.cs" /> <Compile Include="Native\JavaScriptEngineType.cs" /> <Compile Include="Native\JSElementCollectionBase.cs" /> Modified: trunk/src/Core/DialogHandlers/BaseDialogHandler.cs =================================================================== --- trunk/src/Core/DialogHandlers/BaseDialogHandler.cs 2011-10-26 12:35:10 UTC (rev 1202) +++ trunk/src/Core/DialogHandlers/BaseDialogHandler.cs 2011-10-26 14:31:57 UTC (rev 1203) @@ -18,7 +18,6 @@ using System; using WatiN.Core.Interfaces; -using WatiN.Core.Logging; using WatiN.Core.Native.InternetExplorer; using WatiN.Core.Native.Windows; @@ -41,39 +40,17 @@ #region IDialogHandler Members /// <inheritdoc /> - public abstract bool HandleDialog(Window window); + public abstract bool HandleDialog(Window dialog); /// <inheritdoc /> - public virtual bool CanHandleDialog(Window window, IntPtr mainWindowHwnd) + public virtual bool CanHandleDialog(Window dialog, IntPtr mainWindowHwnd) { - var ieVersion = IE.GetMajorIEVersion(); - var dialogBelongsToIeWindow = ieVersion < 8 ? - DialogBelongsToIEWindowForIe7AndLower(window, mainWindowHwnd) : - DialogBelongsToIEWindowForIe8AndHigher(window, mainWindowHwnd); + var iesWindowHelper = new IESWindowHelper(mainWindowHwnd); + return iesWindowHelper.IsChildWindow(dialog) && CanHandleDialog(dialog); + } - return dialogBelongsToIeWindow && CanHandleDialog(window); - } + public abstract bool CanHandleDialog(Window window); - private static bool DialogBelongsToIEWindowForIe7AndLower(Window window, IntPtr mainWindowHwnd) - { - var mainWindow = new Window(mainWindowHwnd); - return window.ToplevelWindow.Equals(mainWindow); - } - - private static bool DialogBelongsToIEWindowForIe8AndHigher(Window window, IntPtr mainWindowHwnd) - { - var mainWindow = new Window(mainWindowHwnd); - Logger.LogDebug("Main: " + mainWindow.Hwnd + ", " + mainWindow.Title + ", " + mainWindow.ProcessID); - - var hWnd = IEUtils.GetInteretExplorerServerHwnd(mainWindowHwnd); - var window1 = new Window(hWnd); - Logger.LogDebug("IES: " + window1.Hwnd + ", " + window1.Title + ", " + window1.ProcessID); - - return window1.ProcessID == window.ProcessID; - } - - public abstract bool CanHandleDialog(Window window); - #endregion } } Modified: trunk/src/Core/HTMLDialogCollection.cs =================================================================== --- trunk/src/Core/HTMLDialogCollection.cs 2011-10-26 12:35:10 UTC (rev 1202) +++ trunk/src/Core/HTMLDialogCollection.cs 2011-10-26 14:31:57 UTC (rev 1203) @@ -38,14 +38,16 @@ { findBy = Find.Any; this.waitForComplete = waitForComplete; - htmlDialogs = new List<HtmlDialog>(); + var iesWindowHelper = new IESWindowHelper(hWnd); + + htmlDialogs = new List<HtmlDialog>(); - var toplevelWindow = new Window(hWnd).ToplevelWindow; - var windows = new WindowsEnumerator(); var popups = windows.GetWindows(window => NativeMethods.CompareClassNames(window.Hwnd, "Internet Explorer_TridentDlgFrame")); foreach (var window in popups) { + if (!iesWindowHelper.IsChildWindow(window)) continue; + var htmlDialog = new HtmlDialog(window.Hwnd); htmlDialogs.Add(htmlDialog); } Modified: trunk/src/Core/Interfaces/IDialogHandler.cs =================================================================== --- trunk/src/Core/Interfaces/IDialogHandler.cs 2011-10-26 12:35:10 UTC (rev 1202) +++ trunk/src/Core/Interfaces/IDialogHandler.cs 2011-10-26 14:31:57 UTC (rev 1203) @@ -26,16 +26,16 @@ /// <summary> /// Handles the dialog and returns true when handled with succes /// </summary> - /// <param name="window"></param> + /// <param name="dialog"></param> /// <returns></returns> - bool HandleDialog(Window window); + bool HandleDialog(Window dialog); /// <summary> /// Indicates wheter the dialoghandler can handle the given dialog window /// </summary> - /// <param name="window"></param> + /// <param name="dialog"></param> /// <param name="mainWindowHwnd"></param> /// <returns></returns> - bool CanHandleDialog(Window window, IntPtr mainWindowHwnd); + bool CanHandleDialog(Window dialog, IntPtr mainWindowHwnd); } } \ No newline at end of file Added: trunk/src/Core/Native/InternetExplorer/IESWindowHelper.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IESWindowHelper.cs (rev 0) +++ trunk/src/Core/Native/InternetExplorer/IESWindowHelper.cs 2011-10-26 14:31:57 UTC (rev 1203) @@ -0,0 +1,42 @@ +using System; +using WatiN.Core.Logging; +using WatiN.Core.Native.Windows; + +namespace WatiN.Core.Native.InternetExplorer +{ + public class IESWindowHelper + { + private readonly IntPtr _mainIeHwnd; + private int _ieVersion; + + public IESWindowHelper(IntPtr mainIeHwnd) + { + _mainIeHwnd = mainIeHwnd; + _ieVersion = IE.GetMajorIEVersion(); + } + + public bool IsChildWindow(Window window) + { + var mainWindow = new Window(_mainIeHwnd); + return _ieVersion < 8 ? + DialogBelongsToIEWindowForIe7AndLower(window, mainWindow) : + DialogBelongsToIEWindowForIe8AndHigher(window, mainWindow); + } + + private static bool DialogBelongsToIEWindowForIe7AndLower(Window dialog, Window mainWindow) + { + return dialog.ToplevelWindow.Equals(mainWindow); + } + + private static bool DialogBelongsToIEWindowForIe8AndHigher(Window dialog, Window mainWindow) + { + Logger.LogDebug("Main: " + mainWindow.Hwnd + ", " + mainWindow.Title + ", " + mainWindow.ProcessID); + + var hWnd = IEUtils.GetInteretExplorerServerHwnd(mainWindow.Hwnd); + var window1 = new Window(hWnd); + Logger.LogDebug("IES: " + window1.Hwnd + ", " + window1.Title + ", " + window1.ProcessID); + + return window1.ProcessID == dialog.ProcessID; + } + } +} \ No newline at end of file Modified: trunk/src/UnitTests/HTMLDialogTests.cs =================================================================== --- trunk/src/UnitTests/HTMLDialogTests.cs 2011-10-26 12:35:10 UTC (rev 1202) +++ trunk/src/UnitTests/HTMLDialogTests.cs 2011-10-26 14:31:57 UTC (rev 1203) @@ -212,6 +212,20 @@ } } + [Test] + public void HtmlDialogCollectionShouldReturnOnlyItsOwnChildHtmlDialogs() + { + Ie.Button("popupid").Click(); + + using (var ie2 = new IE(MainURI)) + { + ie2.Button("popupid").Click(); + + Assert.That(Ie.HtmlDialogs.Count, Is.EqualTo(1)); + Assert.That(ie2.HtmlDialogs.Count, Is.EqualTo(1)); + } + } + public override Uri TestPageUri { get { return MainURI; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2011-10-26 12:35:16
|
Revision: 1202 http://watin.svn.sourceforge.net/watin/?rev=1202&view=rev Author: jvmenen Date: 2011-10-26 12:35:10 +0000 (Wed, 26 Oct 2011) Log Message: ----------- Small cleanup Modified Paths: -------------- trunk/src/UnitTests/DialogHandlerTests/ConfirmDialogHandlerTests.cs Modified: trunk/src/UnitTests/DialogHandlerTests/ConfirmDialogHandlerTests.cs =================================================================== --- trunk/src/UnitTests/DialogHandlerTests/ConfirmDialogHandlerTests.cs 2011-10-26 09:45:37 UTC (rev 1201) +++ trunk/src/UnitTests/DialogHandlerTests/ConfirmDialogHandlerTests.cs 2011-10-26 12:35:10 UTC (rev 1202) @@ -133,7 +133,6 @@ var handler = new ConfirmDialogHandler(); using (new UseDialogOnce(ie.DialogWatcher, handler)) { - ie.AddDialogHandler(handler); ie.Button(Find.ByValue("Show confirm dialog")).ClickNoWait(); handler.WaitUntilExists(5); @@ -142,7 +141,6 @@ var handler2 = new ConfirmDialogHandler(); using (new UseDialogOnce(ie2.DialogWatcher, handler2)) { - ie2.AddDialogHandler(handler2); ie2.Button(Find.ByValue("Show confirm dialog")).ClickNoWait(); handler2.WaitUntilExists(5); handler2.OKButton.Click(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2011-10-26 09:45:43
|
Revision: 1201 http://watin.svn.sourceforge.net/watin/?rev=1201&view=rev Author: jvmenen Date: 2011-10-26 09:45:37 +0000 (Wed, 26 Oct 2011) Log Message: ----------- Re-implemented closing of popup dialogs (like alert, confirm etc) for specific IE instances. Works for all IE versions. Modified Paths: -------------- trunk/src/Core/DialogHandlers/BaseDialogHandler.cs trunk/src/Core/DialogHandlers/DialogWatcher.cs trunk/src/Core/Native/InternetExplorer/IEUtils.cs trunk/src/UnitTests/DialogHandlerTests/AlertDialogHandlerTests.cs trunk/src/UnitTests/DialogHandlerTests/ConfirmDialogHandlerTests.cs trunk/src/UnitTests/FramesetWithinFrameSetTests.cs Modified: trunk/src/Core/DialogHandlers/BaseDialogHandler.cs =================================================================== --- trunk/src/Core/DialogHandlers/BaseDialogHandler.cs 2011-06-29 23:11:53 UTC (rev 1200) +++ trunk/src/Core/DialogHandlers/BaseDialogHandler.cs 2011-10-26 09:45:37 UTC (rev 1201) @@ -19,6 +19,7 @@ using System; using WatiN.Core.Interfaces; using WatiN.Core.Logging; +using WatiN.Core.Native.InternetExplorer; using WatiN.Core.Native.Windows; namespace WatiN.Core.DialogHandlers @@ -45,15 +46,32 @@ /// <inheritdoc /> public virtual bool CanHandleDialog(Window window, IntPtr mainWindowHwnd) { -// var mainWindow = new Window(mainWindowHwnd); -// Logger.LogDebug("Main: " + mainWindow.Hwnd + ", " + mainWindow.Title); -// Logger.LogDebug("window.TopLevelWindow: " + window.ToplevelWindow.Hwnd + ", " + window.ToplevelWindow.Title); -// -// if (!window.ToplevelWindow.Equals(mainWindow)) return false; + var ieVersion = IE.GetMajorIEVersion(); + var dialogBelongsToIeWindow = ieVersion < 8 ? + DialogBelongsToIEWindowForIe7AndLower(window, mainWindowHwnd) : + DialogBelongsToIEWindowForIe8AndHigher(window, mainWindowHwnd); + + return dialogBelongsToIeWindow && CanHandleDialog(window); + } + + private static bool DialogBelongsToIEWindowForIe7AndLower(Window window, IntPtr mainWindowHwnd) + { + var mainWindow = new Window(mainWindowHwnd); + return window.ToplevelWindow.Equals(mainWindow); + } + + private static bool DialogBelongsToIEWindowForIe8AndHigher(Window window, IntPtr mainWindowHwnd) + { + var mainWindow = new Window(mainWindowHwnd); + Logger.LogDebug("Main: " + mainWindow.Hwnd + ", " + mainWindow.Title + ", " + mainWindow.ProcessID); - return CanHandleDialog(window); - } + var hWnd = IEUtils.GetInteretExplorerServerHwnd(mainWindowHwnd); + var window1 = new Window(hWnd); + Logger.LogDebug("IES: " + window1.Hwnd + ", " + window1.Title + ", " + window1.ProcessID); + return window1.ProcessID == window.ProcessID; + } + public abstract bool CanHandleDialog(Window window); #endregion Modified: trunk/src/Core/DialogHandlers/DialogWatcher.cs =================================================================== --- trunk/src/Core/DialogHandlers/DialogWatcher.cs 2011-06-29 23:11:53 UTC (rev 1200) +++ trunk/src/Core/DialogHandlers/DialogWatcher.cs 2011-10-26 09:45:37 UTC (rev 1201) @@ -63,7 +63,7 @@ var dialogWatcher = GetDialogWatcherFromCache(toplevelWindow); - // If no dialogwatcher exists for the ieprocessid then + // If no dialogwatcher exists then // create a new one, store it and return it. if (dialogWatcher == null) { Modified: trunk/src/Core/Native/InternetExplorer/IEUtils.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEUtils.cs 2011-06-29 23:11:53 UTC (rev 1200) +++ trunk/src/Core/Native/InternetExplorer/IEUtils.cs 2011-10-26 09:45:37 UTC (rev 1201) @@ -82,11 +82,7 @@ var lRes = 0; - if (!IsIEServerWindow(hWnd)) - { - // Get 1st child IE server window - hWnd = NativeMethods.GetChildWindowHwnd(hWnd, "Internet Explorer_Server"); - } + hWnd = GetInteretExplorerServerHwnd(hWnd); if (IsIEServerWindow(hWnd)) { @@ -109,6 +105,16 @@ return null; } + public static IntPtr GetInteretExplorerServerHwnd(IntPtr hWnd) + { + if (!IsIEServerWindow(hWnd)) + { + // Get 1st child IE server window + hWnd = NativeMethods.GetChildWindowHwnd(hWnd, "Internet Explorer_Server"); + } + return hWnd; + } + public static bool IsIEServerWindow(IntPtr hWnd) { return NativeMethods.CompareClassNames(hWnd, "Internet Explorer_Server"); Modified: trunk/src/UnitTests/DialogHandlerTests/AlertDialogHandlerTests.cs =================================================================== --- trunk/src/UnitTests/DialogHandlerTests/AlertDialogHandlerTests.cs 2011-06-29 23:11:53 UTC (rev 1200) +++ trunk/src/UnitTests/DialogHandlerTests/AlertDialogHandlerTests.cs 2011-10-26 09:45:37 UTC (rev 1201) @@ -50,8 +50,8 @@ } } - [Test, Ignore("This feature can't be supported on IE8 because there is no way to detect the parent ie/window for a dialog.")] - public void CloseSpecificBrowserAlert() + [Test] + public void CloseSpecificBrowserAlert() { Assert.AreEqual(0, Ie.DialogWatcher.Count, "DialogWatcher count should be zero"); Modified: trunk/src/UnitTests/DialogHandlerTests/ConfirmDialogHandlerTests.cs =================================================================== --- trunk/src/UnitTests/DialogHandlerTests/ConfirmDialogHandlerTests.cs 2011-06-29 23:11:53 UTC (rev 1200) +++ trunk/src/UnitTests/DialogHandlerTests/ConfirmDialogHandlerTests.cs 2011-10-26 09:45:37 UTC (rev 1201) @@ -125,6 +125,35 @@ } } + [Test] + public void TestMultipleIEInstancesOpeningAlertDialogs() + { + using (var ie = new IE(TestEventsURI)) + { + var handler = new ConfirmDialogHandler(); + using (new UseDialogOnce(ie.DialogWatcher, handler)) + { + ie.AddDialogHandler(handler); + ie.Button(Find.ByValue("Show confirm dialog")).ClickNoWait(); + handler.WaitUntilExists(5); + + using (var ie2 = new IE(TestEventsURI)) + { + var handler2 = new ConfirmDialogHandler(); + using (new UseDialogOnce(ie2.DialogWatcher, handler2)) + { + ie2.AddDialogHandler(handler2); + ie2.Button(Find.ByValue("Show confirm dialog")).ClickNoWait(); + handler2.WaitUntilExists(5); + handler2.OKButton.Click(); + } + } + handler.OKButton.Click(); + } + + } + } + public override Uri TestPageUri { get { return TestEventsURI; } Modified: trunk/src/UnitTests/FramesetWithinFrameSetTests.cs =================================================================== --- trunk/src/UnitTests/FramesetWithinFrameSetTests.cs 2011-06-29 23:11:53 UTC (rev 1200) +++ trunk/src/UnitTests/FramesetWithinFrameSetTests.cs 2011-10-26 09:45:37 UTC (rev 1201) @@ -47,8 +47,8 @@ var nestedFrame = frame.Frame("mainid"); var javascriptElementReference = nestedFrame.FrameElement.GetJavascriptElementReference(); - Console.WriteLine(javascriptElementReference); - Console.WriteLine("not null: " + browser.Eval(javascriptElementReference + " != null")); + //Console.WriteLine(javascriptElementReference); + //Console.WriteLine("not null: " + browser.Eval(javascriptElementReference + " != null")); // WHEN nestedFrame.Link("googlelink").MouseUp(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dd...@us...> - 2011-06-29 23:12:00
|
Revision: 1200 http://watin.svn.sourceforge.net/watin/?rev=1200&view=rev Author: ddwyer Date: 2011-06-29 23:11:53 +0000 (Wed, 29 Jun 2011) Log Message: ----------- fix for "COM object that has been separated from its underlying RCW cannot be used" Modified Paths: -------------- trunk/src/Core/Native/InternetExplorer/AllFramesProcessor.cs Modified: trunk/src/Core/Native/InternetExplorer/AllFramesProcessor.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/AllFramesProcessor.cs 2011-04-18 11:45:15 UTC (rev 1199) +++ trunk/src/Core/Native/InternetExplorer/AllFramesProcessor.cs 2011-06-29 23:11:53 UTC (rev 1200) @@ -36,7 +36,18 @@ Elements = new List<INativeDocument>(); _htmlDocument = htmlDocument; - _iFrameElements = (IHTMLElementCollection)htmlDocument.all.tags("iframe"); + // Bug fix, trying to revert back to previous version + // http://stackoverflow.com/questions/5882415/error-when-accessing-the-frames-in-watin-new-version-2-1 + //_iFrameElements = (IHTMLElementCollection)htmlDocument.all.tags("iframe"); + + _iFrameElements = (IHTMLElementCollection)_htmlDocument.all.tags("frame"); + + // If the current document doesn't contain FRAME elements, it then + // might contain IFRAME elements. + if (_iFrameElements.length == 0) + { + _iFrameElements = (IHTMLElementCollection)_htmlDocument.all.tags("iframe"); + } } public HTMLDocument HTMLDocument() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2011-04-18 11:45:25
|
Revision: 1199 http://watin.svn.sourceforge.net/watin/?rev=1199&view=rev Author: jvmenen Date: 2011-04-18 11:45:15 +0000 (Mon, 18 Apr 2011) Log Message: ----------- Added re-try to casting frame document to HTMLDocument (http://stackoverflow.com/questions/5664880/watin-unable-to-cast-com-object-exception) Modified Paths: -------------- trunk/src/Core/Native/InternetExplorer/IEElement.cs trunk/src/Core/Native/InternetExplorer/IEWaitForComplete.cs trunk/src/Core/UtilityClasses/Utils.cs Modified: trunk/src/Core/Native/InternetExplorer/IEElement.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElement.cs 2011-04-12 12:44:10 UTC (rev 1198) +++ trunk/src/Core/Native/InternetExplorer/IEElement.cs 2011-04-18 11:45:15 UTC (rev 1199) @@ -225,7 +225,7 @@ private static T GetWithFailOver<T>(DoFunc<T> func) { - return UtilityClass.TryFuncFailOver(func, 5, 50); + return UtilityClass.GetWithFailOver(func); } private object RetrieveNodeValue(string attributeName) Modified: trunk/src/Core/Native/InternetExplorer/IEWaitForComplete.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEWaitForComplete.cs 2011-04-12 12:44:10 UTC (rev 1198) +++ trunk/src/Core/Native/InternetExplorer/IEWaitForComplete.cs 2011-04-18 11:45:15 UTC (rev 1199) @@ -78,7 +78,7 @@ protected virtual void WaitForFramesToComplete(IHTMLDocument2 maindocument) { - var mainHtmlDocument = (HTMLDocument)maindocument; + var mainHtmlDocument = UtilityClass.GetWithFailOver(() => (HTMLDocument)maindocument); var framesCount = FrameCountProcessor.GetFrameCountFromHTMLDocument(mainHtmlDocument); Modified: trunk/src/Core/UtilityClasses/Utils.cs =================================================================== --- trunk/src/Core/UtilityClasses/Utils.cs 2011-04-12 12:44:10 UTC (rev 1198) +++ trunk/src/Core/UtilityClasses/Utils.cs 2011-04-18 11:45:15 UTC (rev 1199) @@ -145,6 +145,11 @@ } + public static T GetWithFailOver<T>(DoFunc<T> func) + { + return TryFuncFailOver(func, 5, 50); + } + public static T TryFuncFailOver<T>(DoFunc<T> func, int numberOfRetries, int sleepTime) { Exception lastException; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2011-04-12 12:44:16
|
Revision: 1198 http://watin.svn.sourceforge.net/watin/?rev=1198&view=rev Author: jvmenen Date: 2011-04-12 12:44:10 +0000 (Tue, 12 Apr 2011) Log Message: ----------- Updated Readme.txt and ReleaseHistory.txt Modified Paths: -------------- trunk/src/Readme.txt trunk/src/ReleaseHistory.txt Modified: trunk/src/Readme.txt =================================================================== --- trunk/src/Readme.txt 2011-04-12 09:54:32 UTC (rev 1197) +++ trunk/src/Readme.txt 2011-04-12 12:44:10 UTC (rev 1198) @@ -3,7 +3,7 @@ in dotNet. Inspired by Watir, WatiN enables web application testing, through Internet Explorer on a Windows platform, expressed in any .Net language. -Visit http://watin.sourcefoge.net for more information and to download the latest version. +Visit http://watin.org for more information and to download the latest version. * License WatiN is Apache License 2.0 licensed so before using WatiN please read the license.txt so you know @@ -11,7 +11,7 @@ * Pre requisits - WatiN can only be run on a Windows operating system -- Make sure you have a working IE6, IE7, IE8, Firefox 2 or Firefox 3.x installed on your machine. +- Make sure you have a working IE6, IE7, IE8, IE9, Firefox 2 or Firefox 3.x installed on your machine. - The .Net 2.0 or later framework needs to be installed. * Installing WatiN @@ -21,23 +21,20 @@ * Using WatiN Following are the basic steps: -- Create a new project in Visual Studio 2005/2008 (or another dev tool like SharpDevelop). +- Create a new project in Visual Studio 2005/2008/2010 (or another dev tool like SharpDevelop). - Add a reference to WatiN.Core.dll in the installation directory. - Start coding and exploring the object model (See the code files in the UnitTests directory for code examples). -For a more complete example visit http://watin.sourceforge.net/gettingstarted.html. -For more documentation about (using) WatiN visit http://watin.sourceforge.net/documentatie.html. +For a more complete example visit http://watin.org/documentation/getting-started/. +For more documentation about (using) WatiN visit http://watin.org/documentation/. Or read my blogposts at http://watinandmore.blogspot.com * Support Subscribe to the mailinglist(s) and/or use the bug and feature tracker on http://sourceforge.net/projects/watin for the intended purposes. -* RSS -Stay informed about new releases by subscribing to the project news RSS feed on -http://watin.sourcefoge.net Enjoy testing with WatiN! -Copyright Jeroen van Menen 2009 \ No newline at end of file +Copyright Jeroen van Menen 2011 \ No newline at end of file Modified: trunk/src/ReleaseHistory.txt =================================================================== --- trunk/src/ReleaseHistory.txt 2011-04-12 09:54:32 UTC (rev 1197) +++ trunk/src/ReleaseHistory.txt 2011-04-12 12:44:10 UTC (rev 1198) @@ -1,3 +1,31 @@ +WatiN 2.1.0.1196 (12 April 2011) + +This is WatiN 2.1 final, offering support for both Internet Explorer and FireFox. + +This releases fully supports IE9 and does fix issues with Find.BySelector, fire-ing events in FireFox and more + +For the full release notes visit http://watin.org/documentation + +--------------------------------- +WatiN 2.0.50.1179 (8 Februari 2011) + +This is WatiN 2.0 final, offering support for both Internet Explorer and FireFox. + +This release adds support for finding elements using a css selector, creating screenshots with FireFox, auto closing of dialogs on FireFox and has many stability fixes for running tests with FireFox and Win7/IE8. + +For the full release notes visit http://watin.org/documentation + +--------------------------------- +WatiN 2.0.20.1089 (20 December 2009) + +This is the first release candidate of WatiN 2.0, offering support for both Internet Explorer and FireFox + +Many new features have been added and bugs have been fixed since the release of WatiN 2.0 beta 1 + +For the full release notes visit http://watin.org/documentation + +--------------------------------- + WatiN 2.0.10.928 (20 March 2009) This is the first beta release of WatiN 2.0, offering support for both Internet Explorer, FireFox and Chrome (expirimental) @@ -4,7 +32,7 @@ Many new features have been added and much of the functionality offered in WatiN 1.3 for IE is now also available for FireFox. -For the full release notes visit http://watin.sourceforge.net/releasenotes-2-0-10-x.html +For the full release notes visit http://watin.org/documentation --------------------------------- @@ -60,19 +88,19 @@ In this release support for lamdba's and Linq is added (for the .Net 2.0 version and higher). New helper methods are added to the Find class, two new DailogHandlers have been added and many smaller changes. This is the last 1.X release and also the last release supporting .Net 1.1. Many thanks to all who contributed to this release! -For the full release notes visit http://watin.sourceforge.net/releasenotes-1-3-0-4000.html +For the full release notes visit http://watin.org/documentation ------------------------------- WatiN 1.2.1.4000 (23 October 2007) -This is a hotfix release and fixes an issue regarding the Find.ByText(string) method. Until version 1.2 it compared values using StringComparer but in 1.2.0 it accidentally was changed into StringContainsAndCaseInsensitiveComparer. This could case different behaviour in your tests. The issue has been fixed. +This is a hotfix release and fixes an issue regarding the Find.ByText(string) method. Until version 1.2 it compared values using StringComparer but in 1.2.0 it accidentally was changed into StringContainsAndCaseInsensitiveComparer. This could cause different behaviour in your tests. The issue has been fixed. ------------------------------- WatiN 1.2.0.4000 (4 October 2007) This release includes mainly new features (some only for .Net 2.0). You can now start a new IE instance in its own process, set event properties when firing events on an element, get a specific Ancestor of an element, use your own attribute comparers, implement specific wait logic, evaluatie javascript code, automate the Area element, clean up all IE caches, take snapshots of webpages and much more. Many thanks to all who contributed to this release! -For the full release notes visit http://watin.sourceforge.net/releasenotes-1-2-0-4000.html +For the full release notes visit http://watin.org/documentation ------------------------------- WatiN 1.1.2.4000 (16 May 2007) @@ -91,21 +119,21 @@ This release adds some new features and many bugfixes. You can now use the not operator when searching for an element, automate the SaveAs dialog, and WaitUntil some attribute of an element has some value. Most of the development time has been put into fixing bugs reported by users. Thanks to all who contributed to this release! -For the full release notes visit http://watin.sourceforge.net/releasenotes-1-1-0-4000.html +For the full release notes visit http://watin.org/documentation ------------------------------- WatiN 1.0.0.4000 (1 March, 2007) This release adds may new features like using multiple attributes to search for an element, full support for the Style attribute, casting an Element instance to a more specialized element type, support for changing the default settings used by WatiN, added support for tbody elements and improvements to SelectList and Table. -For the full release notes visit http://watin.sourceforge.net/releasenotes-1-0-0-4000.html +For the full release notes visit http://watin.org/documentation ------------------------------- WatiN 0.9.5.4000 (31 December, 2006) This release adds new features to support testing of websites which make use of AJAX technology. Many other feature requests and bug fixes are included as well. -For the full release notes visit http://watin.sourceforge.net/releasenotes-0-9-5-4000.html +For the full release notes visit http://watin.org/documentation ------------------------------- WatiN 0.9.0.4000 (31 October, 2006) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2011-04-12 09:54:38
|
Revision: 1197 http://watin.svn.sourceforge.net/watin/?rev=1197&view=rev Author: jvmenen Date: 2011-04-12 09:54:32 +0000 (Tue, 12 Apr 2011) Log Message: ----------- Updated version to 2.1.0.1196 Modified Paths: -------------- trunk/src/Core/Properties/AssemblyInfo.cs trunk/src/UnitTests/Properties/AssemblyInfo.cs Modified: trunk/src/Core/Properties/AssemblyInfo.cs =================================================================== --- trunk/src/Core/Properties/AssemblyInfo.cs 2011-04-12 09:31:31 UTC (rev 1196) +++ trunk/src/Core/Properties/AssemblyInfo.cs 2011-04-12 09:54:32 UTC (rev 1197) @@ -44,7 +44,7 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.50.1179")] -[assembly: AssemblyFileVersion("2.0.50.1179")] +[assembly: AssemblyVersion("2.1.0.1196")] +[assembly: AssemblyFileVersion("2.1.0.1196")] [assembly: InternalsVisibleTo("WatiN.Core.UnitTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001006372f903104d40cc57cd3a5e9f4834ea462b48833f5da033f7869906191afd8bd9b11b477fb3d473861659dee2f5a8dcf8b019393b0a90b5563fb414f335565020da99801a9b24708af8846b390fbc21b16fc8bd40c68a260cfec718c171eb5123bd6c8b27f1b7cfa8658310f21d297a41cf85e9f41d7a8b6611d7c90575fcd8")] Modified: trunk/src/UnitTests/Properties/AssemblyInfo.cs =================================================================== --- trunk/src/UnitTests/Properties/AssemblyInfo.cs 2011-04-12 09:31:31 UTC (rev 1196) +++ trunk/src/UnitTests/Properties/AssemblyInfo.cs 2011-04-12 09:54:32 UTC (rev 1197) @@ -42,5 +42,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.50.1179")] -[assembly: AssemblyFileVersion("2.0.50.1179")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.0.1196")] +[assembly: AssemblyFileVersion("2.1.0.1196")] \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2011-04-12 09:31:37
|
Revision: 1196 http://watin.svn.sourceforge.net/watin/?rev=1196&view=rev Author: jvmenen Date: 2011-04-12 09:31:31 +0000 (Tue, 12 Apr 2011) Log Message: ----------- - Added new files to C*.vs2008.csproj files - Fixed vs2008/.net 2.0 syntax compatibility issues - Fixed some test issues Modified Paths: -------------- trunk/src/Core/Core.vs2008.csproj trunk/src/Core/DialogHandlers/ReturnDialogHandler.cs trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs trunk/src/UnitTests/DialogHandlerTests/DialogHandlerHelperTests.cs trunk/src/UnitTests/UnitTests.vs2008.csproj Modified: trunk/src/Core/Core.vs2008.csproj =================================================================== --- trunk/src/Core/Core.vs2008.csproj 2011-04-12 08:59:53 UTC (rev 1195) +++ trunk/src/Core/Core.vs2008.csproj 2011-04-12 09:31:31 UTC (rev 1196) @@ -238,6 +238,7 @@ <Compile Include="Native\Chrome\ChromeException.cs" /> <Compile Include="Native\IClientPort.cs" /> <Compile Include="Native\ClientPortBase.cs" /> + <Compile Include="Native\InternetExplorer\Expando.cs" /> <Compile Include="Native\InternetExplorer\IEFireEventHandler.cs" /> <Compile Include="Native\InternetExplorer\JScriptElementArrayEnumerator.cs" /> <Compile Include="Native\JavaScriptEngineType.cs" /> Modified: trunk/src/Core/DialogHandlers/ReturnDialogHandler.cs =================================================================== --- trunk/src/Core/DialogHandlers/ReturnDialogHandler.cs 2011-04-12 08:59:53 UTC (rev 1195) +++ trunk/src/Core/DialogHandlers/ReturnDialogHandler.cs 2011-04-12 09:31:31 UTC (rev 1196) @@ -102,7 +102,7 @@ public void WaitUntilExists(int waitDurationInSeconds) { var tryActionUntilTimeOut = new TryFuncUntilTimeOut(TimeSpan.FromSeconds(waitDurationInSeconds)); - tryActionUntilTimeOut.Try(Exists); + tryActionUntilTimeOut.Try<bool>(Exists); if (!Exists()) { Modified: trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs =================================================================== --- trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2011-04-12 08:59:53 UTC (rev 1195) +++ trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2011-04-12 09:31:31 UTC (rev 1196) @@ -191,7 +191,7 @@ }); } - [Test] + [Test, Ignore("Bug: Queryselector can't be used to find Frames in IE")] public void Should_find_element_in_frame() { ExecuteTest(browser => Modified: trunk/src/UnitTests/DialogHandlerTests/DialogHandlerHelperTests.cs =================================================================== --- trunk/src/UnitTests/DialogHandlerTests/DialogHandlerHelperTests.cs 2011-04-12 08:59:53 UTC (rev 1195) +++ trunk/src/UnitTests/DialogHandlerTests/DialogHandlerHelperTests.cs 2011-04-12 09:31:31 UTC (rev 1196) @@ -76,7 +76,7 @@ var count = dialogHandlersList.Count; // THEN - Assert.That(count, Is.EqualTo(15), "Unexpected number of concreet dialog handlers"); + Assert.That(count, Is.EqualTo(16), "Unexpected number of public dialog handlers"); } [Test] Modified: trunk/src/UnitTests/UnitTests.vs2008.csproj =================================================================== --- trunk/src/UnitTests/UnitTests.vs2008.csproj 2011-04-12 08:59:53 UTC (rev 1195) +++ trunk/src/UnitTests/UnitTests.vs2008.csproj 2011-04-12 09:31:31 UTC (rev 1196) @@ -428,6 +428,9 @@ <Content Include="html\BodyNotExistsBug.htm" /> <Content Include="html\ButtonTests.html" /> <Content Include="html\ClassConstraintTests.html" /> + <Content Include="html\Frameset2.html" /> + <Content Include="html\iframes\FramesetWithinIFrame.html" /> + <Content Include="html\iframes\iFramesWithinFrameset.html" /> <Content Include="html\ListTests.html" /> <Content Include="html\CrossDomainFrameset.html" /> <Content Include="html\formsubmit.html" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2011-04-12 09:00:01
|
Revision: 1195 http://watin.svn.sourceforge.net/watin/?rev=1195&view=rev Author: jvmenen Date: 2011-04-12 08:59:53 +0000 (Tue, 12 Apr 2011) Log Message: ----------- * Added ReturnDialogHandler.CreateInstance() which will return the correct version for your version of IE. * Added Frame.FrameElement which will return the frame element in which a frame or iframe is contained. * Fixed issue with "NoMerge". Now will work for IE8 and IE9. * Refactored AllFramesProcessor to work (better) with IE9. Fixes issues with iterating over Frames in FrameCollection sometimes resulting in unpredictable crashes. * Fixed issue were Find.BySelectore was not working for elements in a Frame. Partially fixed. Doesn't work yet for nested frames pages. * fixed issue with selecting item in selectlist or selecting a checkbox when using IE9. Now using the new Expando class to get the value of a property from a DOM element. * AlertDialogHandlerTests contains some spikes to handle alert dialog browser agnostic * Added test to make sure every html file has the meta tag http-equiv="X-UA-Compatible" * http-equiv="X-UA-Compatible" content is set to "edge". This will always run the tests with latest IE mode (with IE9 in IE9 mode, with IE8 in IE8mode etc...). Modified Paths: -------------- trunk/src/Core/Core.csproj trunk/src/Core/DialogHandlers/ReturnDialogHandler.cs trunk/src/Core/Frame.cs trunk/src/Core/IE.cs trunk/src/Core/Native/InternetExplorer/AllFramesProcessor.cs trunk/src/Core/Native/InternetExplorer/IEDocument.cs trunk/src/Core/Native/InternetExplorer/IEElement.cs trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs trunk/src/Core/Native/InternetExplorer/IEUtils.cs trunk/src/Core/Native/InternetExplorer/JScriptElementArrayEnumerator.cs trunk/src/Core/Native/Windows/Window.cs trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs trunk/src/UnitTests/AttributeConstraintTests/ProximityTests.cs trunk/src/UnitTests/ButtonTests.cs trunk/src/UnitTests/CheckBoxTests.cs trunk/src/UnitTests/DialogHandlerTests/AlertDialogHandlerTests.cs trunk/src/UnitTests/DialogHandlerTests/ReturnJavaDialogHandlerTest.cs trunk/src/UnitTests/DocumentTests.cs trunk/src/UnitTests/ElementTests.cs trunk/src/UnitTests/FrameCrossDomainTests.cs trunk/src/UnitTests/FramesetWithinFrameSetTests.cs trunk/src/UnitTests/IFramesTests.cs trunk/src/UnitTests/Native/FireFoxTests/FireEventTests.cs trunk/src/UnitTests/SelectListTests.cs trunk/src/UnitTests/TestUtils/BaseWatiNTest.cs trunk/src/UnitTests/TextFieldTests.cs trunk/src/UnitTests/UnitTests.csproj trunk/src/UnitTests/WatiNSanityTests.cs trunk/src/UnitTests/html/BodyNotExistsBug.htm trunk/src/UnitTests/html/ButtonTests.html trunk/src/UnitTests/html/ClassConstraintTests.html trunk/src/UnitTests/html/CrossDomainFrameset.html trunk/src/UnitTests/html/Frameset.html trunk/src/UnitTests/html/FramesetWithinFrameset.html trunk/src/UnitTests/html/Index.html trunk/src/UnitTests/html/ListTests.html trunk/src/UnitTests/html/OnBeforeUnloadJavaDialog.html trunk/src/UnitTests/html/ProximityTests.html trunk/src/UnitTests/html/Tables.html trunk/src/UnitTests/html/TestEvents.html trunk/src/UnitTests/html/formsubmit.html trunk/src/UnitTests/html/html_with_object_tag.html trunk/src/UnitTests/html/iframes/leftpage.html trunk/src/UnitTests/html/iframes/main.html trunk/src/UnitTests/html/iframes/middlepage.html trunk/src/UnitTests/html/iframes/rightpage.html trunk/src/UnitTests/html/images.html trunk/src/UnitTests/html/intro.html trunk/src/UnitTests/html/main.html trunk/src/UnitTests/html/openNewWindow.html trunk/src/UnitTests/html/openNewWindowTarget.html trunk/src/UnitTests/html/popup.html trunk/src/UnitTests/html/styletests/Style.html trunk/src/UnitTests/html/theApp.html Added Paths: ----------- trunk/src/Core/Native/InternetExplorer/Expando.cs trunk/src/UnitTests/html/Frameset2.html trunk/src/UnitTests/html/iframes/FramesetWithinIFrame.html trunk/src/UnitTests/html/iframes/iFramesWithinFrameset.html Property Changed: ---------------- trunk/ Property changes on: trunk ___________________________________________________________________ Modified: svn:ignore - .MySCMServerInfo bin obj *.resharperoptions _ReSharper.* *.user *.suo build + .MySCMServerInfo bin obj *.resharperoptions _ReSharper.* *.user *.suo build nuget Modified: trunk/src/Core/Core.csproj =================================================================== --- trunk/src/Core/Core.csproj 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/Core.csproj 2011-04-12 08:59:53 UTC (rev 1195) @@ -160,7 +160,7 @@ <Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.mshtml"> <HintPath>..\..\lib\Net\3.5\Microsoft.mshtml.dll</HintPath> - <EmbedInteropTypes>True</EmbedInteropTypes> + <EmbedInteropTypes>False</EmbedInteropTypes> </Reference> <Reference Include="System"> <Name>System</Name> @@ -243,6 +243,7 @@ <Compile Include="Native\Chrome\ChromeException.cs" /> <Compile Include="Native\IClientPort.cs" /> <Compile Include="Native\ClientPortBase.cs" /> + <Compile Include="Native\InternetExplorer\Expando.cs" /> <Compile Include="Native\InternetExplorer\IEFireEventHandler.cs" /> <Compile Include="Native\InternetExplorer\JScriptElementArrayEnumerator.cs" /> <Compile Include="Native\JavaScriptEngineType.cs" /> Modified: trunk/src/Core/DialogHandlers/ReturnDialogHandler.cs =================================================================== --- trunk/src/Core/DialogHandlers/ReturnDialogHandler.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/DialogHandlers/ReturnDialogHandler.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -16,11 +16,16 @@ #endregion Copyright +using System; +using System.Threading; +using WatiN.Core.Exceptions; +using WatiN.Core.Interfaces; using WatiN.Core.Native.Windows; +using WatiN.Core.UtilityClasses; namespace WatiN.Core.DialogHandlers { - public class ReturnDialogHandler : ConfirmDialogHandler + public class ReturnDialogHandler : ConfirmDialogHandler, IReturnDialogHandler { /// <summary> /// Determines whether this instance can handle the specified window by checking <see cref="Window.StyleInHex"/>. @@ -34,5 +39,106 @@ { return (window.StyleInHex == "94C803C5" && ButtonWithId1Exists(window.Hwnd)); } + + public static IReturnDialogHandler CreateInstance() + { + var ieVersion = IE.GetMajorIEVersion(); + + return ieVersion < 9 ? (IReturnDialogHandler) new ReturnDialogHandler() : new ReturnDialogHandlerIe9(); + } } + + public interface IReturnDialogHandler : IDialogHandler + { + WinButton CancelButton { get; } + WinButton OKButton { get; } + void WaitUntilExists(int waitDurationInSeconds); + bool Exists(); + void WaitUntilExists(); + } + + public class ReturnDialogHandlerIe9 : BaseDialogHandler, IReturnDialogHandler + { + private Window _window; + + public WinButton CancelButton + { + get + { + var hwnd = GetChildWindowHwnd(_window.Hwnd, "5000200E"); + return hwnd != IntPtr.Zero ? new WinButton(hwnd) : null; + } + } + + public WinButton OKButton + { + get + { + var hwnd = GetChildWindowHwnd(_window.Hwnd, "5000200F"); + return hwnd != IntPtr.Zero ? new WinButton(hwnd) : null; + } + } + + public override bool HandleDialog(Window window) + { + if (CanHandleDialog(window)) + { + _window = window; + + while (window.Exists()) + { + Thread.Sleep(200); + } + return true; + } + return false; + } + + public override bool CanHandleDialog(Window window) + { + return (window.StyleInHex == "96C00284"); + } + + public void WaitUntilExists(int waitDurationInSeconds) + { + var tryActionUntilTimeOut = new TryFuncUntilTimeOut(TimeSpan.FromSeconds(waitDurationInSeconds)); + tryActionUntilTimeOut.Try(Exists); + + if (!Exists()) + { + throw new WatiNException(string.Format("Dialog not available within {0} seconds.", waitDurationInSeconds)); + } + } + + public bool Exists() + { + return _window != null && _window.Exists(); + } + + private IntPtr GetChildWindowHwnd(IntPtr parentHwnd, string styleInHex) + { + var hWnd = IntPtr.Zero; + NativeMethods.EnumChildWindows(parentHwnd, (childHwnd, lParam) => + { + var window = new Window(childHwnd); +// Console.WriteLine("childhwnd: " + childHwnd); +// Console.WriteLine("childhwnd.styleinhex: " + window.StyleInHex); + if (window.StyleInHex == styleInHex) + { + hWnd = childHwnd; + return false; + } + + return true; + }, IntPtr.Zero); + + return hWnd; + } + + public void WaitUntilExists() + { + WaitUntilExists(30); + } + } + } \ No newline at end of file Modified: trunk/src/Core/Frame.cs =================================================================== --- trunk/src/Core/Frame.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/Frame.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -28,8 +28,8 @@ [ElementTag("iframe", Index = 1)] public class Frame : Document { - private readonly Element _frameElement; - private readonly INativeDocument _frameDocument; + public Element FrameElement { get; private set; } + private readonly INativeDocument _frameDocument; /// <summary> /// This constructor will mainly be used by the constructor of FrameCollection @@ -44,7 +44,7 @@ throw new ArgumentNullException("frameDocument"); _frameDocument = frameDocument; - _frameElement = new Element(domContainer, frameDocument.ContainingFrameElement); + FrameElement = new Element(domContainer, frameDocument.ContainingFrameElement); } /// <inheritdoc /> @@ -75,13 +75,13 @@ return Url; default: - return _frameElement.GetAttributeValue(attributeName); + return FrameElement.GetAttributeValue(attributeName); } } public virtual void SetAttributeValue(string attributeName, string value) { - _frameElement.SetAttributeValue(attributeName, value); + FrameElement.SetAttributeValue(attributeName, value); } } Modified: trunk/src/Core/IE.cs =================================================================== --- trunk/src/Core/IE.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/IE.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -543,7 +543,7 @@ { var arguments = "about:blank"; - if (GetMajorIEVersion() == 8 && Settings.MakeNewIe8InstanceNoMerge) + if (GetMajorIEVersion() >= 8 && Settings.MakeNewIe8InstanceNoMerge) arguments = "-nomerge " + arguments; var m_Proc = Process.Start("IExplore.exe", arguments); Modified: trunk/src/Core/Native/InternetExplorer/AllFramesProcessor.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/AllFramesProcessor.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/Native/InternetExplorer/AllFramesProcessor.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -27,54 +27,53 @@ { public List<INativeDocument> Elements { get; private set; } - private readonly HTMLDocument htmlDocument; - private readonly IHTMLElementCollection frameElements; - private int index; + private readonly HTMLDocument _htmlDocument; + private readonly IHTMLElementCollection _iFrameElements; + private int _index; public AllFramesProcessor(HTMLDocument htmlDocument) { Elements = new List<INativeDocument>(); + _htmlDocument = htmlDocument; - frameElements = (IHTMLElementCollection) htmlDocument.all.tags("frame"); - - // If the current document doesn't contain FRAME elements, it then - // might contain IFRAME elements. - if (frameElements.length == 0) - { - frameElements = (IHTMLElementCollection)htmlDocument.all.tags("iframe"); - } - - this.htmlDocument = htmlDocument; + _iFrameElements = (IHTMLElementCollection)htmlDocument.all.tags("iframe"); } public HTMLDocument HTMLDocument() { - return htmlDocument; + return _htmlDocument; } public void Process(IWebBrowser2 webBrowser2) { - // Get the frame element from the parent document - var uniqueId = RetrieveUniqueIdOfFrameElement(); + var htmlDocument2 = (IHTMLDocument2)webBrowser2.Document; + var containingFrameElement = GetContainingFrameElement(); + Elements.Add(new IEDocument(htmlDocument2, containingFrameElement)); - var frameElement = RetrieveSameFrameFromHtmlDocument(uniqueId); - var nativeFrameElement = new IEElement(frameElement); - Elements.Add(new IEDocument((IHTMLDocument2) webBrowser2.Document, nativeFrameElement)); + _index++; + } - index++; + public IEElement GetContainingFrameElement() + { + var uniqueId = RetrieveUniqueIdOfFrameElement(); + var frameElement = RetrieveSameFrameFromHtmlDocument(uniqueId); + return new IEElement(frameElement); } private string RetrieveUniqueIdOfFrameElement() { - var element = (IHTMLElement) frameElements.item(index, null); - return ((DispHTMLBaseElement)element).uniqueID; + var frame = _iFrameElements.length == 0 ? + FrameByIndexProcessor.GetFrameFromHTMLDocument(_index, _htmlDocument) : + _iFrameElements.item(_index, null); + + return new Expando(frame).GetValue<string>("uniqueID"); } // This is lookup in htmldocument is needed to bridge between // two different "memory" representations of document and its frame elements. private IHTMLElement2 RetrieveSameFrameFromHtmlDocument(string frameElementUniqueId) { - var frame = htmlDocument.getElementById(frameElementUniqueId) as IHTMLElement2; + var frame = _htmlDocument.getElementById(frameElementUniqueId) as IHTMLElement2; if (frame == null) { throw new WatiNException("Couldn't find Frame or IFrame."); Added: trunk/src/Core/Native/InternetExplorer/Expando.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/Expando.cs (rev 0) +++ trunk/src/Core/Native/InternetExplorer/Expando.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -0,0 +1,59 @@ +#region WatiN Copyright (C) 2006-2011 Jeroen van Menen + +//Copyright 2006-2011 Jeroen van Menen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion Copyright + +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Expando; + +namespace WatiN.Core.Native.InternetExplorer +{ + public class Expando + { + public object Object { get; private set; } + public IExpando AsExpando { get; private set; } + + public Expando(object expando) + { + Object = expando; + AsExpando = (IExpando) expando; + } + + public T GetValue<T>(string propertyName) + { + return (T)GetValue(propertyName); + } + + public object GetValue(string propertyName) + { + var property = AsExpando.GetProperty(propertyName, BindingFlags.Default); + if (property != null) + { + try + { + return property.GetValue(Object, null); + } + catch (COMException) + { + return null; + } + } + + return null; + } + } +} \ No newline at end of file Modified: trunk/src/Core/Native/InternetExplorer/IEDocument.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEDocument.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/Native/InternetExplorer/IEDocument.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -57,13 +57,16 @@ /// <inheritdoc /> public INativeElementCollection AllElements { - get { return new IEElementCollection(htmlDocument.all, null); } + get { return new IEElementCollection(htmlDocument.all, (IEElement) ContainingFrameElement); } } /// <inheritdoc /> public INativeElement ContainingFrameElement { - get { return containingFrameElement; } + get + { + return containingFrameElement; + } } public INativeElement Body @@ -112,22 +115,7 @@ public string GetPropertyValue(string propertyName) { - var domDocumentExpando = (IExpando)htmlDocument; - - var property = domDocumentExpando.GetProperty(propertyName, BindingFlags.Default); - if (property != null) - { - try - { - return (string)property.GetValue(domDocumentExpando, null); - } - catch (COMException) - { - return null; - } - } - - return null; + return new Expando(htmlDocument).GetValue<string>(propertyName); } /// <inheritdoc /> Modified: trunk/src/Core/Native/InternetExplorer/IEElement.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElement.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/Native/InternetExplorer/IEElement.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -194,7 +194,10 @@ object attributeValue; try { - attributeValue = GetWithFailOver(() => AsHtmlElement.getAttribute(attributeName, 0)); + if (JSElement.UsePropertyInsteadOfAttribute.Contains(attributeName)) + attributeValue = GetWithFailOver(() => new Expando(AsHtmlElement).GetValue(attributeName)); + else + attributeValue = GetWithFailOver(() => AsHtmlElement.getAttribute(attributeName, 0)); } catch { @@ -211,7 +214,13 @@ return null; } - return attributeValue.ToString(); + var value = attributeValue.ToString(); + + if (attributeName.ToLowerInvariant() == "selected") + if (value.ToLowerInvariant() == "selected") + value = "True"; + + return value; } private static T GetWithFailOver<T>(DoFunc<T> func) @@ -409,7 +418,7 @@ if (AsHtmlElement.sourceIndex < 0) return false; // Note: We exclude elements that might appear as root elements from this check since we cannot verify them. - const string excludedTags = "! HTML HEAD BODY TITLE BASE LINK META SCRIPT STYLE"; + const string excludedTags = "! HTML HEAD BODY TITLE BASE LINK META SCRIPT STYLE FRAMESET"; if (excludedTags.Contains(TagName)) return true; return AsHtmlElement.offsetParent != null; Modified: trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/Native/InternetExplorer/IEElementCollection.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -84,10 +84,13 @@ public IEnumerable<INativeElement> GetElementsWithQuerySelector(string selector, DomContainer domContainer) { domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript()); - var container = "document"; if (_element != null) + { container = _element.GetJavaScriptElementReference(); + if (new ElementTag(_element.TagName).Equals(new ElementTag("frame"))) + container = container + ".contentDocument"; + } var code = string.Format("document.___WATINRESULT = Sizzle('{0}', {1});", selector, container); domContainer.RunScript(code); Modified: trunk/src/Core/Native/InternetExplorer/IEUtils.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/IEUtils.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/Native/InternetExplorer/IEUtils.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -22,6 +22,7 @@ using mshtml; using SHDocVw; using WatiN.Core.Exceptions; +using WatiN.Core.Logging; using WatiN.Core.Native.Windows; using WatiN.Core.UtilityClasses; using IEnumUnknown=WatiN.Core.Native.Windows.IEnumUnknown; @@ -65,6 +66,7 @@ { try { + Logger.LogDebug("[script] {0}", scriptCode); window.execScript(scriptCode, language); } catch (Exception ex) Modified: trunk/src/Core/Native/InternetExplorer/JScriptElementArrayEnumerator.cs =================================================================== --- trunk/src/Core/Native/InternetExplorer/JScriptElementArrayEnumerator.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/Native/InternetExplorer/JScriptElementArrayEnumerator.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -18,9 +18,6 @@ using System.Collections; using System.Collections.Generic; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Runtime.InteropServices.Expando; using mshtml; namespace WatiN.Core.Native.InternetExplorer @@ -38,14 +35,15 @@ public IEnumerator<INativeElement> GetEnumerator() { - var result = GetPropertyValue(_fieldName, _ieDocument.HtmlDocument); + var result = new Expando(_ieDocument.HtmlDocument).GetValue(_fieldName); if (result == null) yield break; - var length = (int) GetPropertyValue("length", result); + var resultAsExpando = new Expando(result); + var length = resultAsExpando.GetValue<int>("length"); for (var i = 0; i < length; i++) { - var element1 = GetPropertyValue(i.ToString(), result) as IHTMLElement; + var element1 = resultAsExpando.GetValue(i.ToString()) as IHTMLElement; if (element1 != null) yield return new IEElement(element1); } } @@ -54,25 +52,5 @@ { return GetEnumerator(); } - - public object GetPropertyValue(string propertyName, object hasExpandoInterface) - { - var expando = (IExpando)hasExpandoInterface; - - var property = expando.GetProperty(propertyName, BindingFlags.Default); - if (property != null) - { - try - { - return property.GetValue(hasExpandoInterface, null); - } - catch (COMException) - { - return null; - } - } - - return null; - } } } \ No newline at end of file Modified: trunk/src/Core/Native/Windows/Window.cs =================================================================== --- trunk/src/Core/Native/Windows/Window.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/Core/Native/Windows/Window.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -137,7 +137,17 @@ public virtual string ProcessName { - get { return Process.GetProcessById(ProcessID).ProcessName; } + get + { + try + { + return Process.GetProcessById(ProcessID).ProcessName; + } + catch + { + return null; + } + } } public string Message Modified: trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs =================================================================== --- trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/AttributeConstraintTests/FindBySelectorTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -175,7 +175,63 @@ Assert.That(sb.ToString(), Is.EqualTo("Selector = '.Return >this'")); } + [Test, Ignore("Bug: Queryselector can't be used to find Frames in IE")] + public void Should_find_frame() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(FramesetURI); + // WHEN + var frame = browser.Frame(Find.BySelector("")); + + // THEN + Assert.That(frame == null); + }); + } + + [Test] + public void Should_find_element_in_frame() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(FramesetURI); + var frame = browser.Frame("mainid"); + + // WHEN + var link = frame.Link(Find.BySelector("#Microsoft")); + + // THEN + Assert.That(link.Exists); + Assert.That(link.Id, Is.EqualTo("Microsoft")); + }); + } + + [Test, Ignore("Bug: Queryselector not working with Frames in IE")] + public void Should_find_element_in_frame_within_frame() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(FramesetWithinFramesetURI); + var frame1 = browser.Frame("mainid"); + Console.WriteLine(frame1.FrameElement.GetJavascriptElementReference()); + var frame2 = frame1.Frame("mainid"); + var javascriptElementReference = frame2.FrameElement.GetJavascriptElementReference(); + Console.WriteLine(javascriptElementReference); + + + // WHEN + var link = frame2.Link(Find.BySelector("#Microsoft")); + + // THEN + Assert.That(link.Exists); + }); + } + + public override Uri TestPageUri { get { return MainURI; } Modified: trunk/src/UnitTests/AttributeConstraintTests/ProximityTests.cs =================================================================== --- trunk/src/UnitTests/AttributeConstraintTests/ProximityTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/AttributeConstraintTests/ProximityTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -66,7 +66,11 @@ string endingHtml = Ie.Html; // If these don't match, reset the browser so further tests are not affected by this one - if (endingHtml != _startingHtml) Ie.Reopen(); + if (endingHtml != _startingHtml) + { + Ie.Reopen(); + Ie.GoTo(TestPageUri); + } // Now record the test result Assert.That( endingHtml, Is.EqualTo( _startingHtml ), "HTML in the page changed while the test executed." ); Modified: trunk/src/UnitTests/ButtonTests.cs =================================================================== --- trunk/src/UnitTests/ButtonTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/ButtonTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -348,7 +348,7 @@ { var browserVersion = 7; var ieUserAgent = browser.Eval("window.navigator.userAgent"); - if (!string.IsNullOrEmpty(ieUserAgent) && new Regex(@"MSIE 8(\.\d+);").IsMatch(ieUserAgent)) + if (!string.IsNullOrEmpty(ieUserAgent) && new Regex(@"MSIE [8-9](\.\d+);").IsMatch(ieUserAgent)) { browserVersion = 8; } Modified: trunk/src/UnitTests/CheckBoxTests.cs =================================================================== --- trunk/src/UnitTests/CheckBoxTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/CheckBoxTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -124,6 +124,7 @@ // The new way to do this var checkBox21b = browser.CheckBox(new LabelTextConstraint("label for Checkbox21")); + Assert.That(checkBox21b.Exists, "Checkbox21 not found using LabelTextConstraint."); Assert.AreEqual(checkBox21a.Id, checkBox21b.Id, "Checkbox attached to Label for Checkbox21 did not match CheckBox21."); // The old way to do this Modified: trunk/src/UnitTests/DialogHandlerTests/AlertDialogHandlerTests.cs =================================================================== --- trunk/src/UnitTests/DialogHandlerTests/AlertDialogHandlerTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/DialogHandlerTests/AlertDialogHandlerTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -18,6 +18,7 @@ using System; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; using WatiN.Core.DialogHandlers; using WatiN.Core.UnitTests.TestUtils; using WatiN.Core.UtilityClasses; @@ -49,26 +50,6 @@ } } - [Test] - public void Should_handle_alert_dialog_browser_agnostic() - { - ExecuteTest(browser => - { - // GIVEN - var dialogHandler = new JSAlertDialogHandler(browser); - dialogHandler.InjectStub(); - - // WHEN - browser.Button(Find.ByValue("Show alert dialog")).Click(); - - dialogHandler.RevertStub(); - - // THEN - Assert.That(true); - }); - } - - [Test, Ignore("This feature can't be supported on IE8 because there is no way to detect the parent ie/window for a dialog.")] public void CloseSpecificBrowserAlert() { @@ -142,12 +123,78 @@ } } + [Test] + public void Should_handle_alert_dialog_browser_agnostic() + { + ExecuteTest(browser => + { + // GIVEN + browser.DialogWatcher.CloseUnhandledDialogs = false; + + var dialogHandler = new JSAlertDialogHandler(browser); + dialogHandler.InjectStub(); + + // WHEN + browser.Button(Find.ByValue("Show alert dialog")).Click(); + var message = dialogHandler.Message; + + dialogHandler.RevertStub(); + + // THEN + Assert.That(message, Is.EqualTo("This is an alert!")); + }); + } + + [Test] + public void Should_handle_alert_dialog_browser_agnostic2() + { + ExecuteTest(browser => + { + // GIVEN + browser.DialogWatcher.CloseUnhandledDialogs = false; + + var dialogHandler = new JSAlertDialogHandler2(browser, () => browser.Button(Find.ByValue("Show alert dialog")).Click()); + + // WHEN + dialogHandler.DoAction(); + + // THEN + Assert.That(dialogHandler.Message, Is.EqualTo("This is an alert!")); + }); + } + + public override Uri TestPageUri { get { return TestEventsURI; } } } + + + public class JSAlertDialogHandler2:JSAlertDialogHandler + { + private readonly Action _actionToInvokeShowAlertDialog; + private string _message; + + public JSAlertDialogHandler2(Document document, Action actionToInvokeShowAlertDialog) : base(document) + { + _actionToInvokeShowAlertDialog = actionToInvokeShowAlertDialog; + } + + public void DoAction() + { + InjectStub(); + _actionToInvokeShowAlertDialog.Invoke(); + _message = base.Message; + RevertStub(); + } + + public override string Message + { + get { return _message; } + } + } public class JSAlertDialogHandler { private static VariableNameHelper VariableNameHelper= new VariableNameHelper("watinalertdialog"); @@ -161,9 +208,14 @@ _orgAlertFunction = VariableNameHelper.CreateVariableName(); } + public virtual string Message + { + get { return _document.Eval("window._watinalertmessage"); } + } + public void InjectStub() { - var code = _orgAlertFunction + " = window.alert; window.alert = function(){ return true; }"; + var code = _orgAlertFunction + " = window.alert; window.alert = function(message){ window._watinalertmessage = message; return true; }"; _document.RunScript(code); } Modified: trunk/src/UnitTests/DialogHandlerTests/ReturnJavaDialogHandlerTest.cs =================================================================== --- trunk/src/UnitTests/DialogHandlerTests/ReturnJavaDialogHandlerTest.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/DialogHandlerTests/ReturnJavaDialogHandlerTest.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -16,17 +16,13 @@ #endregion Copyright -using System; using System.Threading; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; using SHDocVw; using WatiN.Core.Constraints; using WatiN.Core.DialogHandlers; -using WatiN.Core.Exceptions; -using WatiN.Core.Interfaces; -using WatiN.Core.Native.Windows; using WatiN.Core.UnitTests.TestUtils; -using WatiN.Core.UtilityClasses; namespace WatiN.Core.UnitTests.DialogHandlerTests { @@ -34,61 +30,49 @@ public class ReturnJavaDialogHandlerTest : BaseWatiNTest { [Test] - public void WhenOnBeforeUnloadReturnJavaDialogIsShown_ClickingOnOkShouldCloseIE() + public void Should_return_browser_specific_version_of_handler() { - using (var ie = new IE(OnBeforeUnloadJavaDialogURI)) - { - var returnDialogHandler = new ReturnDialogHandler(); - ie.AddDialogHandler(returnDialogHandler); + // GIVEN + var ie_version = IE.GetMajorIEVersion(); - var hWnd = ie.hWnd; - // can't use ie.Close() here cause this will cleanup the registered - // returnDialogHandler which leads to a timeout on the WaitUntilExists - var internetExplorer = (IWebBrowser2)ie.InternetExplorer; - internetExplorer.Quit(); + // WHEN + var handler = ReturnDialogHandler.CreateInstance(); - returnDialogHandler.WaitUntilExists(); - returnDialogHandler.OKButton.Click(); - - Thread.Sleep(2000); - Assert.IsFalse(Browser.Exists<IE>(new AttributeConstraint("hwnd", hWnd.ToString()))); - } + // THEN + if (ie_version < 9) + Assert.That(handler, Is.InstanceOfType(typeof(ReturnDialogHandler))); + else + Assert.That(handler, Is.InstanceOfType(typeof(ReturnDialogHandlerIe9))); } [Test] - public void WhenOnBeforeUnloadReturnJavaDialogIsShown_ClickingOnCancelShouldKeepIEOpen() + public void WhenOnBeforeUnloadReturnJavaDialogIsShown_ClickingOnOkShouldCloseIE() { using (var ie = new IE(OnBeforeUnloadJavaDialogURI)) { - var returnDialogHandler = new ReturnDialogHandler(); + var returnDialogHandler = ReturnDialogHandler.CreateInstance(); ie.AddDialogHandler(returnDialogHandler); var hWnd = ie.hWnd; - // can't use ie.Close() here cause this will cleanup the registered // returnDialogHandler which leads to a timeout on the WaitUntilExists var internetExplorer = (IWebBrowser2)ie.InternetExplorer; internetExplorer.Quit(); returnDialogHandler.WaitUntilExists(); - returnDialogHandler.CancelButton.Click(); + returnDialogHandler.OKButton.Click(); Thread.Sleep(2000); - Assert.IsTrue(Browser.Exists<IE>(new AttributeConstraint("hwnd", hWnd.ToString()))); - - // finally close the ie instance - internetExplorer.Quit(); - returnDialogHandler.WaitUntilExists(); - returnDialogHandler.OKButton.Click(); + Assert.IsFalse(Browser.Exists<IE>(new AttributeConstraint("hwnd", hWnd.ToString()))); } } [Test] - public void WhenOnBeforeUnloadReturnJavaDialogIsShown_ClickingOnCancelShouldKeepIE9Open() + public void WhenOnBeforeUnloadReturnJavaDialogIsShown_ClickingOnCancelShouldKeepIEOpen() { using (var ie = new IE(OnBeforeUnloadJavaDialogURI)) { - var returnDialogHandler = new ReturnDialogHandlerIE9(); + var returnDialogHandler = ReturnDialogHandler.CreateInstance(); ie.AddDialogHandler(returnDialogHandler); var hWnd = ie.hWnd; @@ -108,91 +92,10 @@ internetExplorer.Quit(); returnDialogHandler.WaitUntilExists(); returnDialogHandler.OKButton.Click(); - } - } - } - public class ReturnDialogHandlerIE9 : BaseDialogHandler - { - private Window _window; - - public WinButton CancelButton - { - get - { - var hwnd = GetChildWindowHwnd(_window.Hwnd, "5000200E"); - return hwnd != IntPtr.Zero? new WinButton(hwnd) : null; + Thread.Sleep(2000); + Assert.IsFalse(Browser.Exists<IE>(new AttributeConstraint("hwnd", hWnd.ToString()))); } } - - public WinButton OKButton - { - get - { - var hwnd = GetChildWindowHwnd(_window.Hwnd, "5000200F"); - return hwnd != IntPtr.Zero ? new WinButton(hwnd) : null; - } - } - - public override bool HandleDialog(Window window) - { - if (CanHandleDialog(window)) - { - _window = window; - - while (window.Exists()) - { - Thread.Sleep(200); - } - return true; - } - return false; - } - - public override bool CanHandleDialog(Window window) - { - return (window.StyleInHex == "96C00284"); - } - - public void WaitUntilExists(int waitDurationInSeconds) - { - var tryActionUntilTimeOut = new TryFuncUntilTimeOut(TimeSpan.FromSeconds(waitDurationInSeconds)); - tryActionUntilTimeOut.Try(() => Exists()); - - if (!Exists()) - { - throw new WatiNException(string.Format("Dialog not available within {0} seconds.", waitDurationInSeconds)); - } - } - - public bool Exists() - { - return _window != null && _window.Exists(); - } - - private IntPtr GetChildWindowHwnd(IntPtr parentHwnd, string styleInHex) - { - var hWnd = IntPtr.Zero; - NativeMethods.EnumChildWindows(parentHwnd, (childHwnd, lParam) => - { - var window = new Window(childHwnd); - Console.WriteLine("childhwnd: " + childHwnd); - Console.WriteLine("childhwnd.styleinhex: " + window.StyleInHex); - if (window.StyleInHex == styleInHex) - { - hWnd = childHwnd; - return false; - } - - return true; - }, IntPtr.Zero); - - return hWnd; - } - - public void WaitUntilExists() - { - WaitUntilExists(30); - } } } \ No newline at end of file Modified: trunk/src/UnitTests/DocumentTests.cs =================================================================== --- trunk/src/UnitTests/DocumentTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/DocumentTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -532,8 +532,10 @@ // WHEN var outerHtml = browser.Html.ToLowerInvariant(); + outerHtml = outerHtml.Replace("\r\n", ""); + // THEN - Assert.That(outerHtml, NUnit.Framework.SyntaxHelpers.Text.StartsWith("\r\n<body style=")); + Assert.That(outerHtml, NUnit.Framework.SyntaxHelpers.Text.StartsWith("<body style=")); }); } } Modified: trunk/src/UnitTests/ElementTests.cs =================================================================== --- trunk/src/UnitTests/ElementTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/ElementTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -538,7 +538,37 @@ Assert.IsTrue(injectedDivTextField.Exists); }); } + [Test] + public void WaitUntilElementExistsElementInjectionAfter3SecondsShouldWorkForFramesAsWell() + { + ExecuteTest(browser => + { + Assert.IsTrue(Settings.WaitUntilExistsTimeOut > 3, "Settings.WaitUntilExistsTimeOut must be more than 3 seconds"); + + browser.GoTo(new Uri(HtmlTestBaseURI, "Frameset2.html")); + var frame = browser.Frame("mainid"); + var injectedTextField = frame.TextField("injectedTextField"); + var injectedDivTextField = frame.Div("seconddiv").TextField("injectedTextField"); + + Assert.IsFalse(injectedTextField.Exists); + Assert.IsFalse(injectedDivTextField.Exists); + + frame.Button("injectElement").ClickNoWait(); + + Assert.IsFalse(injectedTextField.Exists); + Assert.IsFalse(injectedDivTextField.Exists); + + // WatiN should wait until the element exists before + // getting the text. + var text = injectedTextField.Text; + + Assert.IsTrue(injectedTextField.Exists); + Assert.AreEqual("Injection Succeeded", text); + Assert.IsTrue(injectedDivTextField.Exists); + }); + } + [Test] public void WaitUntilElementRemovedAfter3Seconds() { Modified: trunk/src/UnitTests/FrameCrossDomainTests.cs =================================================================== --- trunk/src/UnitTests/FrameCrossDomainTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/FrameCrossDomainTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -18,6 +18,7 @@ using System; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; using WatiN.Core.UnitTests.TestUtils; namespace WatiN.Core.UnitTests @@ -45,7 +46,7 @@ } catch(Exception e) { - Assert.Fail("Unexpected exception: " + e.GetType()); + Assert.Fail("Unexpected exception: " + e.Message); } Assert.AreEqual("mainid", browser.Frames[1].Id, "Unexpected id"); @@ -85,7 +86,8 @@ { try { - Assert.That(browser.Frame("contentsid").Link("googlelink").Exists, "Should find link"); + var frame = browser.Frame("contentsid"); + Assert.That(frame.Link("googlelink").Exists, "Should find link"); } catch (UnauthorizedAccessException) { @@ -93,7 +95,7 @@ } catch (Exception e) { - Assert.Fail("Unexpected exception: " + e.GetType()); + Assert.Fail("Unexpected exception: " + e.StackTrace); } Assert.AreEqual("contentsid", browser.Frame("contentsid").Id, "Unexpected Id"); Modified: trunk/src/UnitTests/FramesetWithinFrameSetTests.cs =================================================================== --- trunk/src/UnitTests/FramesetWithinFrameSetTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/FramesetWithinFrameSetTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -18,6 +18,7 @@ using System; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; using WatiN.Core.UnitTests.TestUtils; namespace WatiN.Core.UnitTests @@ -35,6 +36,28 @@ }); } + [Test, Ignore("Bug: Events not fired in nested Frames in IE")] + public void Should_navigate_to_google() + { + ExecuteTest(browser => + { + // GIVEN + var frame = browser.Frame("mainid"); + Console.WriteLine(frame.FrameElement.GetJavascriptElementReference()); + + var nestedFrame = frame.Frame("mainid"); + var javascriptElementReference = nestedFrame.FrameElement.GetJavascriptElementReference(); + Console.WriteLine(javascriptElementReference); + Console.WriteLine("not null: " + browser.Eval(javascriptElementReference + " != null")); + + // WHEN + nestedFrame.Link("googlelink").MouseUp(); + + // THEN + Assert.That(nestedFrame.Url, Text.Contains("google")); + }); + } + public override Uri TestPageUri { get { return FramesetWithinFramesetURI; } Modified: trunk/src/UnitTests/IFramesTests.cs =================================================================== --- trunk/src/UnitTests/IFramesTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/IFramesTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -162,5 +162,43 @@ // create a better test. using (new IE(EbayUrl)) {} } + + [Test] + public void Should_find_element_inside_iframe_contained_in_frame() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(iFramesWithinFramesetURI); + var mainFrame = browser.Frame("mainid"); + + // When + var frame = mainFrame.Frame(Find.ByName("middle")); + var select = frame.SelectList(Find.ByName("select1")); + + // Then + Assert.That(frame.Name, Is.EqualTo("middle"), "Unexpected frame name"); + Assert.That(select.Exists, "Expected 'select1' to exist"); + }); + } + + [Test] + public void Should_find_element_inside_frame_contained_in_iframe() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(FramesWithinIFrameURI); + var mainFrame = browser.Frame(Find.ByName("middle")); + + // When + var frame = mainFrame.Frame(Find.ByName("contents")); + var link = frame.Link("Microsoft"); + + // Then + Assert.That(frame.Name, Is.EqualTo("contents"), "Unexpected frame name"); + Assert.That(link.Exists, "Expected 'Microsoft' link to exist"); + }); + } } } \ No newline at end of file Modified: trunk/src/UnitTests/Native/FireFoxTests/FireEventTests.cs =================================================================== --- trunk/src/UnitTests/Native/FireFoxTests/FireEventTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/Native/FireFoxTests/FireEventTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -1,4 +1,22 @@ -using System; +#region WatiN Copyright (C) 2006-2011 Jeroen van Menen + +//Copyright 2006-2011 Jeroen van Menen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion Copyright + +using System; using System.Collections.Specialized; using NUnit.Framework; using NUnit.Framework.SyntaxHelpers; Modified: trunk/src/UnitTests/SelectListTests.cs =================================================================== --- trunk/src/UnitTests/SelectListTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/SelectListTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -22,6 +22,7 @@ using NUnit.Framework; using WatiN.Core.DialogHandlers; using WatiN.Core.Exceptions; +using WatiN.Core.Native.InternetExplorer; using WatiN.Core.UnitTests.TestUtils; namespace WatiN.Core.UnitTests @@ -255,20 +256,38 @@ [Test] public void OptionsInSingelSelectList() { - ExecuteTest(browser => + ExecuteTestWithAnyBrowser(browser => { - var selectList = browser.SelectList("Select1"); + var selectList = browser.SelectList("Select1"); + WriteSelected(selectList); Assert.IsFalse(selectList.Option("Third text").Selected); - selectList.Option("Third text").Select(); - Assert.IsTrue(selectList.Option("Third text").Selected); - selectList.Option("First text").SelectNoWait(); + + selectList.Option("Third text").Select(); + WriteSelected(selectList); + Assert.IsTrue(selectList.Option("Third text").Selected); + + selectList.Option("First text").SelectNoWait(); browser.WaitForComplete(); - Assert.IsFalse(selectList.Option("Third text").Selected); + WriteSelected(selectList); + Assert.IsFalse(selectList.Option("Third text").Selected); }); } - [Test] + private void WriteSelected(SelectList selectList) + { + foreach (var option in selectList.Options) + { + Console.Write(option.Selected + ", "); + var nativeElement = (IEElement)option.NativeElement; + + var htmlOptionElement = (mshtml.IHTMLOptionElement)nativeElement.AsHtmlElement; + Console.WriteLine(htmlOptionElement.selected); + } + Console.WriteLine("----"); + } + + [Test] public void OptionsInMultiSelectList() { ExecuteTest(browser => Modified: trunk/src/UnitTests/TestUtils/BaseWatiNTest.cs =================================================================== --- trunk/src/UnitTests/TestUtils/BaseWatiNTest.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/TestUtils/BaseWatiNTest.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -33,6 +33,8 @@ public static Uri PopUpURI = new Uri(HtmlTestBaseURI, "popup.html"); public static Uri FramesetURI = new Uri(HtmlTestBaseURI, "Frameset.html"); public static Uri FramesetWithinFramesetURI = new Uri(HtmlTestBaseURI, "FramesetWithinFrameset.html"); + public static Uri iFramesWithinFramesetURI = new Uri(HtmlTestBaseURI, "iframes\\iFramesWithinFrameset.html"); + public static Uri FramesWithinIFrameURI = new Uri(HtmlTestBaseURI, "iframes\\FramesetWithinIFrame.html"); public static Uri CrossDomainFramesetURI = new Uri(HtmlTestBaseURI, "CrossDomainFrameset.html"); public static Uri TestEventsURI = new Uri(HtmlTestBaseURI, "TestEvents.html"); public static Uri FormSubmitURI = new Uri(HtmlTestBaseURI, "formsubmit.html"); Modified: trunk/src/UnitTests/TextFieldTests.cs =================================================================== --- trunk/src/UnitTests/TextFieldTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/TextFieldTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -61,11 +61,15 @@ { ExecuteTest(browser => { + // GIVEN var textfieldName = browser.TextField("Textarea1"); var textWithNewLine = "Line1" + Environment.NewLine + "Line2"; + // WHEN textfieldName.TypeText(textWithNewLine); - Assert.AreEqual(textWithNewLine, textfieldName.Value); + + // THEN + Assert.AreEqual(textWithNewLine, textfieldName.Value); }); } Modified: trunk/src/UnitTests/UnitTests.csproj =================================================================== --- trunk/src/UnitTests/UnitTests.csproj 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/UnitTests.csproj 2011-04-12 08:59:53 UTC (rev 1195) @@ -149,7 +149,7 @@ <Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.mshtml"> <HintPath>..\..\lib\Net\3.5\Microsoft.mshtml.dll</HintPath> - <EmbedInteropTypes>True</EmbedInteropTypes> + <EmbedInteropTypes>False</EmbedInteropTypes> </Reference> <Reference Include="Moq, Version=2.6.1014.1, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> @@ -435,6 +435,9 @@ <Content Include="html\BodyNotExistsBug.htm" /> <Content Include="html\ButtonTests.html" /> <Content Include="html\ClassConstraintTests.html" /> + <Content Include="html\iframes\FramesetWithinIFrame.html" /> + <Content Include="html\iframes\iFramesWithinFrameset.html" /> + <Content Include="html\Frameset2.html" /> <Content Include="html\ListTests.html" /> <Content Include="html\CrossDomainFrameset.html" /> <Content Include="html\formsubmit.html" /> Modified: trunk/src/UnitTests/WatiNSanityTests.cs =================================================================== --- trunk/src/UnitTests/WatiNSanityTests.cs 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/WatiNSanityTests.cs 2011-04-12 08:59:53 UTC (rev 1195) @@ -20,6 +20,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Linq; using System.Reflection; using NUnit.Framework; using NUnit.Framework.SyntaxHelpers; @@ -34,6 +35,27 @@ public class WatiNSanityTests : BaseWatiNTest { [Test] + public void ShouldEnsureThatEachHtmlFileHasA_X_UA_Compatible_metaTag() + { + var htmlFiles = Directory.GetFiles(HtmlTestBaseURI.AbsolutePath, "*.htm*", SearchOption.AllDirectories); + var fail = false; + foreach (var htmlFile in + htmlFiles.Where(htmlFile => htmlFile.EndsWith("html", true, CultureInfo.InvariantCulture) || (htmlFile.EndsWith("htm", true, CultureInfo.InvariantCulture)))) + { + Console.WriteLine(); + + var fileText = File.ReadAllText(htmlFile); + + if (fileText.Contains("<meta http-equiv=\"X-UA-Compatible\" content=\"IE")) continue; + + fail = true; + Console.WriteLine(htmlFile); + Console.WriteLine("Does not contian: <meta http-equiv=\"X-UA-Compatible\" content=\"IE"); + } + + Assert.That(fail, Is.False, "Not all test html files are correctly Marked Of The Web. Make sure the files are ANSI encoded."); + } + [Test] public void ShouldEnsureThatEachHtmlFileHasAProperMarkOfTheWebComment() { var htmlFiles = Directory.GetFiles(HtmlTestBaseURI.AbsolutePath, "*.htm*", SearchOption.AllDirectories); @@ -154,7 +176,9 @@ "Page.get_Metadata", "Page.get_Document", "IE.get_Visible", - "IE.set_Visible" + "IE.set_Visible", + "Frame.get_FrameElement" + }; string missedProperties = null; @@ -215,7 +239,8 @@ "Page.get_Metadata", "Page.get_Document", "IE.get_Visible", - "IE.set_Visible" + "IE.set_Visible", + "Frame.get_FrameElement" }; string missedMethods = null; Modified: trunk/src/UnitTests/html/BodyNotExistsBug.htm =================================================================== --- trunk/src/UnitTests/html/BodyNotExistsBug.htm 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/html/BodyNotExistsBug.htm 2011-04-12 08:59:53 UTC (rev 1195) @@ -2,6 +2,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>WatiN Test</title> </head> <body> Modified: trunk/src/UnitTests/html/ButtonTests.html =================================================================== --- trunk/src/UnitTests/html/ButtonTests.html 2011-03-29 13:57:47 UTC (rev 1194) +++ trunk/src/UnitTests/html/ButtonTests.html 2011-04-12 08:59:53 UTC (rev 1195) @@ -2,7 +2,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> - <meta http-equiv="X-UA-Compatible" content="IE=8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>ButtonTests</title> <script type="text/javascript"> Modified: trunk/src/UnitTests/html/ClassConstraintTests.html ========... [truncated message content] |
From: <jv...@us...> - 2011-03-29 13:57:53
|
Revision: 1194 http://watin.svn.sourceforge.net/watin/?rev=1194&view=rev Author: jvmenen Date: 2011-03-29 13:57:47 +0000 (Tue, 29 Mar 2011) Log Message: ----------- Added spike code for ReturnDialogHandlerIE9 (works on win2008 with IE9) Modified Paths: -------------- trunk/src/UnitTests/DialogHandlerTests/ReturnJavaDialogHandlerTest.cs Modified: trunk/src/UnitTests/DialogHandlerTests/ReturnJavaDialogHandlerTest.cs =================================================================== --- trunk/src/UnitTests/DialogHandlerTests/ReturnJavaDialogHandlerTest.cs 2011-03-23 23:00:44 UTC (rev 1193) +++ trunk/src/UnitTests/DialogHandlerTests/ReturnJavaDialogHandlerTest.cs 2011-03-29 13:57:47 UTC (rev 1194) @@ -16,12 +16,17 @@ #endregion Copyright +using System; using System.Threading; using NUnit.Framework; using SHDocVw; using WatiN.Core.Constraints; using WatiN.Core.DialogHandlers; +using WatiN.Core.Exceptions; +using WatiN.Core.Interfaces; +using WatiN.Core.Native.Windows; using WatiN.Core.UnitTests.TestUtils; +using WatiN.Core.UtilityClasses; namespace WatiN.Core.UnitTests.DialogHandlerTests { @@ -77,5 +82,117 @@ returnDialogHandler.OKButton.Click(); } } + + [Test] + public void WhenOnBeforeUnloadReturnJavaDialogIsShown_ClickingOnCancelShouldKeepIE9Open() + { + using (var ie = new IE(OnBeforeUnloadJavaDialogURI)) + { + var returnDialogHandler = new ReturnDialogHandlerIE9(); + ie.AddDialogHandler(returnDialogHandler); + + var hWnd = ie.hWnd; + + // can't use ie.Close() here cause this will cleanup the registered + // returnDialogHandler which leads to a timeout on the WaitUntilExists + var internetExplorer = (IWebBrowser2)ie.InternetExplorer; + internetExplorer.Quit(); + + returnDialogHandler.WaitUntilExists(); + returnDialogHandler.CancelButton.Click(); + + Thread.Sleep(2000); + Assert.IsTrue(Browser.Exists<IE>(new AttributeConstraint("hwnd", hWnd.ToString()))); + + // finally close the ie instance + internetExplorer.Quit(); + returnDialogHandler.WaitUntilExists(); + returnDialogHandler.OKButton.Click(); + } + } } + + public class ReturnDialogHandlerIE9 : BaseDialogHandler + { + private Window _window; + + public WinButton CancelButton + { + get + { + var hwnd = GetChildWindowHwnd(_window.Hwnd, "5000200E"); + return hwnd != IntPtr.Zero? new WinButton(hwnd) : null; + } + } + + public WinButton OKButton + { + get + { + var hwnd = GetChildWindowHwnd(_window.Hwnd, "5000200F"); + return hwnd != IntPtr.Zero ? new WinButton(hwnd) : null; + } + } + + public override bool HandleDialog(Window window) + { + if (CanHandleDialog(window)) + { + _window = window; + + while (window.Exists()) + { + Thread.Sleep(200); + } + return true; + } + return false; + } + + public override bool CanHandleDialog(Window window) + { + return (window.StyleInHex == "96C00284"); + } + + public void WaitUntilExists(int waitDurationInSeconds) + { + var tryActionUntilTimeOut = new TryFuncUntilTimeOut(TimeSpan.FromSeconds(waitDurationInSeconds)); + tryActionUntilTimeOut.Try(() => Exists()); + + if (!Exists()) + { + throw new WatiNException(string.Format("Dialog not available within {0} seconds.", waitDurationInSeconds)); + } + } + + public bool Exists() + { + return _window != null && _window.Exists(); + } + + private IntPtr GetChildWindowHwnd(IntPtr parentHwnd, string styleInHex) + { + var hWnd = IntPtr.Zero; + NativeMethods.EnumChildWindows(parentHwnd, (childHwnd, lParam) => + { + var window = new Window(childHwnd); + Console.WriteLine("childhwnd: " + childHwnd); + Console.WriteLine("childhwnd.styleinhex: " + window.StyleInHex); + if (window.StyleInHex == styleInHex) + { + hWnd = childHwnd; + return false; + } + + return true; + }, IntPtr.Zero); + + return hWnd; + } + + public void WaitUntilExists() + { + WaitUntilExists(30); + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jv...@us...> - 2011-03-23 23:00:50
|
Revision: 1193 http://watin.svn.sourceforge.net/watin/?rev=1193&view=rev Author: jvmenen Date: 2011-03-23 23:00:44 +0000 (Wed, 23 Mar 2011) Log Message: ----------- Fixed issue where Element.CheckBox(Find.ByLabelText("A test checkbox")) was not found with this html: <label><input type="checkbox" name="testCB1" id="1">A test checkbox</label> Also added 2 new overloads: Find.ByLabelText(regex) Find.ByLabelText(predicate<string>) Modified Paths: -------------- trunk/src/Core/Constraints/LabelTextConstraint.cs trunk/src/Core/Find.cs trunk/src/UnitTests/FindTests.cs Modified: trunk/src/Core/Constraints/LabelTextConstraint.cs =================================================================== --- trunk/src/Core/Constraints/LabelTextConstraint.cs 2011-03-05 10:48:21 UTC (rev 1192) +++ trunk/src/Core/Constraints/LabelTextConstraint.cs 2011-03-23 23:00:44 UTC (rev 1193) @@ -18,11 +18,14 @@ // This constraint class is kindly donated by Seven Simple Machines +using System; using System.Collections.Generic; using System.IO; +using System.Text.RegularExpressions; using WatiN.Core.Comparers; using WatiN.Core.Exceptions; using WatiN.Core.Interfaces; +using StringComparer = WatiN.Core.Comparers.StringComparer; namespace WatiN.Core.Constraints { @@ -38,18 +41,27 @@ /// </example> public class LabelTextConstraint : AttributeConstraint { - private readonly string labelText; - /// <summary> /// Initializes a new instance of the <see cref="LabelTextConstraint" /> class; /// </summary> /// <param name="labelText">The text that represents the label for the form element.</param> public LabelTextConstraint(string labelText) - : base(Find.innerTextAttribute, new StringEqualsAndCaseInsensitiveComparer(labelText)) - { - this.labelText = labelText.Trim(); - } + : base(Find.innerTextAttribute, new StringComparer(labelText)) {} + /// <summary> + /// Initializes a new instance of the <see cref="LabelTextConstraint" /> class; + /// </summary> + /// <param name="labelText">The text that represents the label for the form element.</param> + public LabelTextConstraint(Regex labelText) + : base(Find.innerTextAttribute, new RegexComparer(labelText)) {} + + /// <summary> + /// Initializes a new instance of the <see cref="LabelTextConstraint" /> class; + /// </summary> + /// <param name="comparer">The text that represents the label for the form element.</param> + public LabelTextConstraint(Predicate<string> comparer) + : base(Find.innerTextAttribute, new PredicateComparer<string, string>(comparer)) { } + /// <inheritdoc /> protected override bool MatchesImpl(IAttributeBag attributeBag, ConstraintContext context) { @@ -60,7 +72,7 @@ var cache = (LabelCache)context.GetData(this); if (cache == null) { - cache = new LabelCache(labelText); + cache = new LabelCache(Comparer); context.SetData(this, cache); } @@ -70,42 +82,43 @@ /// <inheritdoc /> public override void WriteDescriptionTo(TextWriter writer) { - writer.Write("With Label Text '{0}'", labelText); + writer.Write("With Label Text '{0}'", Comparer); } private sealed class LabelCache { - private readonly string labelText; - private Dictionary<string, bool> labelIdsWithMatchingText; + private readonly Comparers.Comparer<string> _comparer; + private Dictionary<string, bool> _labelIdsWithMatchingText; - public LabelCache(string labelText) + public LabelCache(Comparers.Comparer<string> comparer) { - this.labelText = labelText; + _comparer = comparer; } public bool IsMatch(Element element) { - if (labelIdsWithMatchingText == null) InitLabelIdsWithMatchingText(element); + if (_labelIdsWithMatchingText == null) InitLabelIdsWithMatchingText(element.DomContainer); - return labelIdsWithMatchingText.ContainsKey(element.Id ?? @""); + if (_labelIdsWithMatchingText.ContainsKey(element.Id ?? @"")) + { + return true; + } + + var parent = element.Parent as Label; + return parent != null && _comparer.Compare(parent.Text); } - private void InitLabelIdsWithMatchingText(Element element) + private void InitLabelIdsWithMatchingText(IElementContainer domContainer) { - labelIdsWithMatchingText = new Dictionary<string, bool>(); + _labelIdsWithMatchingText = new Dictionary<string, bool>(); - var domContainer = element.DomContainer; + var labels = domContainer.Labels.Filter(e => _comparer.Compare(e.Text)); - var labels = domContainer.Labels.Filter(e => - { - var text = e.Text; - return !string.IsNullOrEmpty(text) && StringComparer.AreEqual(text.Trim(), labelText); - }); - foreach (var label in labels) { var forElementWithId = label.For; - labelIdsWithMatchingText.Add(forElementWithId, true); + if (string.IsNullOrEmpty(forElementWithId)) continue; + _labelIdsWithMatchingText.Add(forElementWithId, true); } } } Modified: trunk/src/Core/Find.cs =================================================================== --- trunk/src/Core/Find.cs 2011-03-05 10:48:21 UTC (rev 1192) +++ trunk/src/Core/Find.cs 2011-03-23 23:00:44 UTC (rev 1193) @@ -897,14 +897,42 @@ /// <param name="labelText">The text of the label element</param> /// <returns><see cref="LabelTextConstraint"/></returns> /// <example> - /// This will look for a tet field that has a label element with the innerText "User Name:" - /// <code>TextField = ie.TextField(Find.ByLabelText("User Name:"));</code> + /// This will look for a checkbox that has a label element with the innerText "User enabled" + /// <code>var checkbox = ie.CheckBox(Find.ByLabelText("User Name:"));</code> /// </example> public static LabelTextConstraint ByLabelText(string labelText) { return new LabelTextConstraint(labelText); } + /// <summary> + /// Finds a form element by looking for the <label> associated with it by searching the label text. + /// </summary> + /// <param name="labelText">The regular expression that should match the text of the label element</param> + /// <returns><see cref="LabelTextConstraint"/></returns> + /// <example> + /// This will look for a checkbox that has a label element with innerText starting with "User" + /// <code>var checkbox = ie.CheckBox(Find.ByLabelText(new Regex("^User")));</code> + /// </example> + public static Constraint ByLabelText(Regex labelText) + { + return new LabelTextConstraint(labelText); + } + + /// <summary> + /// Finds a form element by looking for the <label> associated with it by searching the label text. + /// </summary> + /// <param name="predicate">The predicate method to call to make the comparison.</param> + /// <returns><see cref="LabelTextConstraint"/></returns> + /// <example> + /// This will look for a checkbox that has a label element with innerText starting with "User" + /// <code>var checkbox = ie.CheckBox(Find.ByLabelText(text => text !=null && text.StartsWith("User")));</code> + /// </example> + public static AttributeConstraint ByLabelText(Predicate<string> predicate) + { + return new LabelTextConstraint(predicate); + } + /// <summary> /// Finds an element by its default characteristics as defined by <see cref="Settings.FindByDefaultFactory" />. /// </summary> Modified: trunk/src/UnitTests/FindTests.cs =================================================================== --- trunk/src/UnitTests/FindTests.cs 2011-03-05 10:48:21 UTC (rev 1192) +++ trunk/src/UnitTests/FindTests.cs 2011-03-23 23:00:44 UTC (rev 1193) @@ -812,8 +812,102 @@ }); } - + [Test] + public void Should_find_checkbox_contained_in_label_element_by_label_text() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(MainURI); + + var labelText = browser.CheckBox("Checkbox21").Parent.Text; + + // WHEN + var checkbox = browser.CheckBox(Find.ByLabelText(labelText)); + + // THEN + Assert.That(checkbox.Exists, Is.True); + }); + } + + [Test] + public void Should_find_checkbox_contained_in_label_element_by_label_text_case_sensitive() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(MainURI); + + var labelText = browser.CheckBox("Checkbox21").Parent.Text; + labelText = labelText.ToLower(); + + // WHEN + var checkbox = browser.CheckBox(Find.ByLabelText(labelText)); + + // THEN + Assert.That(checkbox.Exists, Is.False); + }); + } + + [Test] + public void Should_find_checkbox_contained_in_label_element_by_label_text_should_match_exactly() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(MainURI); + + var labelText = browser.CheckBox("Checkbox21").Parent.Text; + labelText = labelText.Substring(0, 5); + + // WHEN + var checkbox = browser.CheckBox(Find.ByLabelText(labelText)); + + // THEN + Assert.That(checkbox.Exists, Is.False); + }); + } + + [Test] + public void Should_find_checkbox_contained_in_label_element_by_regex_label_text() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(MainURI); + + var labelText = browser.CheckBox("Checkbox21").Parent.Text; + labelText = labelText.Substring(0, 5); + + // WHEN + var checkbox = browser.CheckBox(Find.ByLabelText(new Regex(labelText))); + + // THEN + Assert.That(checkbox.Exists, Is.True); + }); + } + + [Test] + public void Should_find_checkbox_contained_in_label_element_using_lambda_expression() + { + ExecuteTest(browser => + { + // GIVEN + browser.GoTo(MainURI); + + var labelText = browser.CheckBox("Checkbox21").Parent.Text; + labelText = labelText.Substring(0, 5); + + // WHEN + var checkbox = browser.CheckBox(Find.ByLabelText(text => text !=null && text.StartsWith(labelText))); + + // THEN + Assert.That(checkbox.Exists, Is.True); + }); + } + + [Test] public void FindByDefaultStringShouldReturnDefaultFromTheSetDefaultFindFactory() { // GIVEN This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |