diff --git a/.gitignore b/.gitignore
index 4e4028e..753bef1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,12 @@
+.vs
References
+packages
bin
obj
Xlbin
+Sandcastle/Help
+Sandcastle/COMs.xml
+*.msi
*.exe
*.log
*.bak
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 4d1b6d7..2a177f2 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,6 +1,10 @@
Author : Florent BREHERET
Website : https://github.com/florentbr/SeleniumBasic
+V3+ modifications : zc2
+Website : https://github.com/zc2com/SeleniumBasic
+
+
Third party softwares:
Selenium - Software Freedom Conservancy
@@ -16,6 +20,12 @@ Third party softwares:
http://phantomjs.org/
+v3.0.0.1 (2022/11/11)
+===============================================================================
+ * Added support of Gecko webdriver and modern API endpoints
+ * Added partial support of the ShadowRoot
+ * Built in 64 bit assembly
+
v2.0.9.0 (2016/03/02)
===============================================================================
* Updated examples
diff --git a/Sandcastle/COMdescrToXML.awk b/Sandcastle/COMdescrToXML.awk
new file mode 100644
index 0000000..dd81311
--- /dev/null
+++ b/Sandcastle/COMdescrToXML.awk
@@ -0,0 +1,66 @@
+BEGIN {
+ print ""
+ print ""
+ print " "
+ print " Selenium"
+ print " "
+ print " "
+}
+
+function TranslateType( par ) {
+#print par
+ gsub(/^\s+/,"",par)
+ gsub(/\s.+$/,"",par)
+ gsub(/^\[MarshalAs\(UnmanagedType.Struct\)(, In)?\]/,"",par)
+ gsub(/^By/, "Selenium.By", par)
+ gsub(/^Strategy/,"Selenium.Strategy",par)
+ gsub(/^WebEleme/,"Selenium.WebEleme",par)
+ gsub(/^string/, "System.String", par)
+ gsub(/^object/, "System.Object", par)
+ gsub(/^bool/, "System.Boolean", par)
+ gsub(/^double/, "System.Double", par)
+ gsub(/^float/, "System.Single", par)
+ gsub(/^int/, "System.Int32", par)
+ gsub(/^short/, "System.Int16", par)
+ return par
+}
+
+{
+ if( match($0,/Description\("(.+?)"\)/,d) ) {
+ descr = d[1]
+ gsub("<","\\<",descr)
+ gsub(">","\\>",descr)
+ match(FILENAME,/(_[A-Z][A-z]+)\.cs/,f)
+ mn = ""
+ getline NL
+ if( match(NL,/\s([A-Z][A-z]+)\((.*)\);$/,m) ) {
+ method = m[1]
+ split(m[2],pars,",")
+ ps = ""
+ for( pi in pars ) {
+ par = TranslateType( pars[pi] )
+ ps = ps ? ps "," par : par
+ }
+ if( ps ) ps = "(" ps ")"
+ mn = "M:Selenium.ComInterfaces." f[1] "." method ps
+ } else
+ if( match(NL,/\s([A-Z][A-z]+)\s*{\s*[gs]et/,m) ) {
+ mn = "P:Selenium.ComInterfaces." f[1] "." m[1]
+ } else
+ if( match(NL,/this\[([a-z]+) [A-z]+\]/,m) ) {
+ mn = "P:Selenium.ComInterfaces." f[1] ".Item(" TranslateType( m[1] ) ")"
+ }
+ if( mn ) {
+ print " "
+ print " "
+ print " " descr
+ print " "
+ print " "
+ }
+ }
+}
+
+END {
+ print " "
+ print ""
+}
diff --git a/Sandcastle/SeleniumBasic.shfbproj b/Sandcastle/SeleniumBasic.shfbproj
new file mode 100644
index 0000000..64061be
--- /dev/null
+++ b/Sandcastle/SeleniumBasic.shfbproj
@@ -0,0 +1,99 @@
+
+
+
+
+
+ Debug
+ AnyCPU
+ 2.0
+ {f5d9ebff-8b71-4ca9-8357-36c7acef4147}
+ 2017.9.26.0
+
+ Documentation
+ Documentation
+ Documentation
+
+ .NET Framework 4.0
+ Help\
+ SeleniumBasic
+ en-US
+ HtmlHelp1
+ Visual Basic, Visual Basic Usage
+ VS2013
+ True
+ True
+ False
+ False
+ OnlyWarningsAndErrors
+ 100
+
+
+
+
+
+
+ None
+ SeleniumBasic
+ 1.0.0.0
+ MemberName
+ AboveNamespaces
+ False
+ False
+ 2
+ False
+ Blank
+ ExplicitInterfaceImplementations, InheritedMembers, PublicCompilerGenerated, NonBrowsable
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\Selenium\
+ False
+ SeleniumBasic - A Selenium based browser automation framework for VB.Net, Visual Basic Applications and VBScript
+
+ All public methods and properties. Some of them available only from a .NET (i.e. not via COM). To know which are available via COM refer to a corresponding COM interface name. If a method listed as a class member but not a member of a corresponding interface, the method won't be available via COM. Methods with an "S" icon are static and surely not available via COM. However, look for a similar method in the "Explicit Interface Implementations" section.
+ Only methods of those interfaces are available via COM (Component Object Model) from VBScript, etc.
+
+ C:\Program Files (x86)\HTML Help Workshop\
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ gawk -f COMdescrToXML.awk ../Selenium/ComInterfaces/*.cs >COMs.xml
+
+ OnBuildSuccess
+
+
\ No newline at end of file
diff --git a/Scripts/StartEdge.vbs b/Scripts/StartEdge.vbs
index fbdee39..282b45d 100644
Binary files a/Scripts/StartEdge.vbs and b/Scripts/StartEdge.vbs differ
diff --git a/Selenium.Tests/Internals/BaseBrowsers.cs b/Selenium.Tests/Internals/BaseBrowsers.cs
index 572dc02..6ef4027 100644
--- a/Selenium.Tests/Internals/BaseBrowsers.cs
+++ b/Selenium.Tests/Internals/BaseBrowsers.cs
@@ -1,54 +1,114 @@
using NUnit.Framework;
using System;
-
-namespace Selenium.Tests.Internals {
-
+using System.Diagnostics;
+using OneTimeSetUp=NUnit.Framework.TestFixtureSetUpAttribute;
+using OneTimeTearDown=NUnit.Framework.TestFixtureTearDownAttribute;
+
+namespace Selenium.Tests.Internals
+{
public enum Browser {
- Firefox, Chrome, Opera, IE, PhantomJS
+ unknown, Firefox, Chrome, Opera, IE, PhantomJS, Gecko, Edge
}
abstract class BaseBrowsers {
-
- public readonly object Fixture;
-
+ public static bool remote_driver = false;
+ public readonly object FixtureParam;
+ private Process driver_process;
protected WebDriver driver;
protected Keys Keys = new Keys();
protected By By = new By();
+ public BaseBrowsers() : this(GetBrowserFromCategory()) {
+ }
+
public BaseBrowsers(Browser browser) {
WebServer.StartServer(@"..\..\Pages");
- this.driver = GetBrowserInstance(browser);
+ if( remote_driver ) {
+ this.driver = GetRemotelyStartedDriver(browser);
+ } else {
+ this.driver = GetDriverInstance(browser);
+ }
this.driver.BaseUrl = WebServer.BaseUri;
- this.Fixture = browser;
+ this.FixtureParam = browser;
+ }
+
+ [OneTimeSetUp]
+ public void TestFixtureSetUp() {
}
- [TestFixtureTearDown]
+ [OneTimeTearDown]
public void TestFixtureTearDown() {
driver.Quit();
+ if( driver_process != null && !driver_process.HasExited ) {
+ driver_process.Kill();
+ }
+ }
+
+ private static Browser GetBrowserFromCategory() {
+ if( NUnit.Core.TestExecutionContext.CurrentContext.CurrentTest.Categories.Contains("Edge") )
+ return Browser.Edge;
+ return Browser.unknown;
}
private string GetBrowserTypeLib(Browser browser) {
switch (browser) {
- case Browser.Firefox: return "Selenium.FirefoxDriver";
- case Browser.Chrome: return "Selenium.ChromeDriver";
- case Browser.Opera: return "Selenium.OperaDriver";
- case Browser.IE: return "Selenium.IEDriver";
+ case Browser.Gecko: return "Selenium.GeckoDriver";
+ case Browser.Firefox: return "Selenium.FirefoxDriver";
+ case Browser.Edge: return "Selenium.EdgeDriver";
+ case Browser.Chrome: return "Selenium.ChromeDriver";
+ case Browser.Opera: return "Selenium.OperaDriver";
+ case Browser.IE: return "Selenium.IEDriver";
case Browser.PhantomJS: return "Selenium.PhantomJSDriver";
}
throw new Exception("Browser not supported: " + browser.ToString());
}
- private WebDriver GetBrowserInstance(Browser browser) {
+ private WebDriver GetDriverInstance(Browser browser) {
switch (browser) {
- case Browser.Firefox: return new Selenium.FirefoxDriver();
- case Browser.Chrome: return new Selenium.ChromeDriver();
- case Browser.Opera: return new Selenium.OperaDriver();
- case Browser.IE: return new Selenium.IEDriver();
+ case Browser.Gecko: return new Selenium.GeckoDriver();
+ case Browser.Firefox:
+ Selenium.FirefoxDriver ffd = new Selenium.FirefoxDriver();
+ ffd.SetBinary( @"C:\Utils\Firefox46\firefox.exe" );
+ return ffd;
+ case Browser.Edge: return new Selenium.EdgeDriver();
+ case Browser.Chrome: return new Selenium.ChromeDriver();
+ case Browser.Opera: return new Selenium.OperaDriver();
+ case Browser.IE: return new Selenium.IEDriver();
case Browser.PhantomJS: return new Selenium.PhantomJSDriver();
}
throw new Exception("Browser not supported: " + browser.ToString());
}
+ private WebDriver GetRemotelyStartedDriver(Browser browser) {
+ ProcessStartInfo p_info = new ProcessStartInfo();
+ p_info.UseShellExecute = true;
+ p_info.CreateNoWindow = false;
+ p_info.WindowStyle = ProcessWindowStyle.Normal;
+ switch (browser) {
+ case Browser.Gecko:
+ p_info.FileName = "geckodriver.exe";
+ p_info.Arguments = "-vv";
+ break;
+ case Browser.Chrome:
+ p_info.FileName = "chromedriver.exe";
+ p_info.Arguments = "--port=4444 --verbose";
+ break;
+ case Browser.Edge:
+ p_info.FileName = "edgedriver.exe";
+ p_info.Arguments = "--port=4444 --verbose";
+ break;
+ default: throw new Exception("Browser not supported: " + browser.ToString());
+ }
+ try {
+ driver_process = Process.Start(p_info);
+ NUnit.Framework.Assert.False( driver_process.HasExited, "Driver process cannot start: " + browser.ToString() );
+ WebDriver s = new Selenium.WebDriver();
+ s.StartRemotely( "http://localhost:4444/", browser.ToString().ToLower() );
+ return s;
+ } catch( Exception e ) {
+ NUnit.Framework.Assert.Fail( "Thrown exception: " + e.Message );
+ }
+ return null;
+ }
}
-
}
diff --git a/Selenium.Tests/Internals/BaseExcel.cs b/Selenium.Tests/Internals/BaseExcel.cs
index 7b74f66..5a35445 100644
--- a/Selenium.Tests/Internals/BaseExcel.cs
+++ b/Selenium.Tests/Internals/BaseExcel.cs
@@ -1,8 +1,8 @@
using System;
using System.Globalization;
using System.Threading;
-using TestFixtureSetUp = NUnit.Framework.TestFixtureSetUpAttribute;
-using TestFixtureTearDown = NUnit.Framework.TestFixtureTearDownAttribute;
+using OneTimeSetUp=NUnit.Framework.TestFixtureSetUpAttribute;
+using OneTimeTearDown=NUnit.Framework.TestFixtureTearDownAttribute;
namespace Selenium.Tests.Internals {
@@ -14,7 +14,7 @@ abstract class BaseExcel {
protected COM worksheets;
protected COM worksheet;
- [TestFixtureSetUp]
+ [OneTimeSetUp]
public void TestFixtureSetUp() {
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
@@ -28,7 +28,7 @@ public void TestFixtureSetUp() {
worksheet = workbook.get("ActiveSheet");
}
- [TestFixtureTearDown]
+ [OneTimeTearDown]
public void TestFixtureTearDown() {
workbook.invoke("Close", false, Type.Missing, Type.Missing);
excel.invoke("Quit");
diff --git a/Selenium.Tests/Internals/IgnoreFixtureAttribute.cs b/Selenium.Tests/Internals/IgnoreFixtureAttribute.cs
index ba4d771..724bc5f 100644
--- a/Selenium.Tests/Internals/IgnoreFixtureAttribute.cs
+++ b/Selenium.Tests/Internals/IgnoreFixtureAttribute.cs
@@ -17,7 +17,7 @@ public IgnoreFixtureAttribute(object fixture, string reason) {
public void BeforeTest(TestDetails testDetails) {
BaseBrowsers tb = testDetails.Fixture as BaseBrowsers;
- if (tb != null && _fixture.Equals(tb.Fixture))
+ if (tb != null && _fixture.Equals(tb.FixtureParam))
A.Ignore(string.Format("{0}: {1}", _fixture, _reason));
}
diff --git a/Selenium.Tests/Internals/WebServer.cs b/Selenium.Tests/Internals/WebServer.cs
index b41a7d1..b43feb2 100644
--- a/Selenium.Tests/Internals/WebServer.cs
+++ b/Selenium.Tests/Internals/WebServer.cs
@@ -10,7 +10,7 @@ namespace Selenium.Tests.Internals {
public class WebServer {
- public static string BaseUri = @"http://localhost:9328";
+ public static string BaseUri = @"http://localhost:19328";
static WebServer _server = null;
diff --git a/Selenium.Tests/Pages/element.html b/Selenium.Tests/Pages/element.html
index 365332a..366427d 100644
--- a/Selenium.Tests/Pages/element.html
+++ b/Selenium.Tests/Pages/element.html
@@ -20,16 +20,30 @@
padding: 3px;
border: 1px solid gray;
}
+
+ #blocker {
+ display:none;
+ position: absolute;
+ background-color: gray;
+ opacity: 0.4;
+ width: 100%;
+ height: 100%;
+ left: 0px;
+ top: 0px;
+ }
+