如何从C#应用程序自动化Firefox?

从最简单的任务开始,从C#应用程序中捕获Firefox中的URL。 它似乎使用user32.dll Windows API函数将无法正常工作,因为它是在IE中捕获URL的方法。

我是否需要使用AutoHotkey捕获URL,例如,我会发送Ctrl + L(将焦点放在地址栏中并突出显示内容)和Ctrl + C(将选择复制到剪贴板)。 然后你只需阅读剪贴板即可获得信息。

对于更复杂的任务,我会使用Greasemonkey或iMacros扩展,可能是由类似的键盘快捷键触发的。

WatiN支持Firefox。

WebAii可以自动化FireFox,包括设置和检索URL

它似乎非常beta-ey,但有人为mozrepl构建了一个.net连接器 。 实际上,mozrepl代码库刚刚转移到github 。 但是mozrepl允许您向Firefox的XUL环境发出命令。

试试Selenium(Google测试引擎 – http://seleniumhq.org/ )您可以在Firefox中记录任务(与Web页面相关的UI),并将录制内容转换为C#源代码:)

您可以将Selenium WebDriver用于C#。

这是一个跨平台的API,允许您使用Java,C#等API控制各种浏览器。

使用Selenium WebDriver测试附加代码C#。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using OpenQA.Selenium.Firefox; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; using OpenQA.Selenium.Interactions.Internal; using OpenQA.Selenium.Support.UI; using OpenQA.Selenium.IE; using NUnit.Framework; using System.Text.RegularExpressions; namespace sae_test { class Program { private static string baseURL; private static StringBuilder verificationErrors; static void Main(string[] args) { // test with firefox IWebDriver driver = new OpenQA.Selenium.Firefox.FirefoxDriver(); // test with IE //InternetExplorerOptions options = new InternetExplorerOptions(); //options.IntroduceInstabilityByIgnoringProtectedModeSettings = true; //IWebDriver driver = new OpenQA.Selenium.IE.InternetExplorerDriver(options); SetupTest(); driver.Navigate().GoToUrl(baseURL + "Account/Login.aspx"); IWebElement inputTextUser = driver.FindElement(By.Id("MainContent_LoginUser_UserName")); inputTextUser.Clear(); driver.FindElement(By.Id("MainContent_LoginUser_UserName")).Clear(); driver.FindElement(By.Id("MainContent_LoginUser_UserName")).SendKeys("usuario"); driver.FindElement(By.Id("MainContent_LoginUser_Password")).Clear(); driver.FindElement(By.Id("MainContent_LoginUser_Password")).SendKeys("123"); driver.FindElement(By.Id("MainContent_LoginUser_LoginButton")).Click(); driver.Navigate().GoToUrl(baseURL + "finanzas/consulta.aspx"); // view combo element IWebElement comboBoxSistema = driver.FindElement(By.Id("MainContent_rcbSistema_Arrow")); //Then click when menu option is visible comboBoxSistema.Click(); System.Threading.Thread.Sleep(500); // container of elements systems combo IWebElement listaDesplegableComboSistemas = driver.FindElement(By.Id("MainContent_rcbSistema_DropDown")); listaDesplegableComboSistemas.FindElement(By.XPath("//li[text()='BOMBEO MECANICO']")).Click(); System.Threading.Thread.Sleep(500); IWebElement comboBoxEquipo = driver.FindElement(By.Id("MainContent_rcbEquipo_Arrow")); //Then click when menu option is visible comboBoxEquipo.Click(); System.Threading.Thread.Sleep(500); // container of elements equipment combo IWebElement listaDesplegableComboEquipos = driver.FindElement(By.Id("MainContent_rcbEquipo_DropDown")); listaDesplegableComboEquipos.FindElement(By.XPath("//li[text()='MINI-V']")).Click(); System.Threading.Thread.Sleep(500); driver.FindElement(By.Id("MainContent_Button1")).Click(); try { Assert.AreEqual("BOMBEO MECANICO_22", driver.FindElement(By.XPath("//*[@id=\"MainContent_RejillaRegistroFinanciero_ctl00_ctl04_LabelSistema\"]")).Text); } catch (AssertionException e) { verificationErrors.Append(e.Message); } // verify coin format $1,234,567.89 usd try { Assert.IsTrue(Regex.IsMatch(driver.FindElement(By.XPath("//*[@id=\"MainContent_RejillaRegistroFinanciero_ctl00_ctl04_labelInversionInicial\"]")).Text, "\\$((,)*[0-9]*[0-9]*[0-9]+)+(\\.[0-9]{2})? usd")); } catch (AssertionException e) { verificationErrors.Append(e.Message); } try { Assert.IsTrue(Regex.IsMatch(driver.FindElement(By.XPath("//*[@id=\"MainContent_RejillaRegistroFinanciero_ctl00_ctl04_labelCostoOpMantto\"]")).Text, "\\$((,)*[0-9]*[0-9]*[0-9]+)+(\\.[0-9]{2})? usd")); } catch (AssertionException e) { verificationErrors.Append(e.Message); } try { Assert.IsTrue(Regex.IsMatch(driver.FindElement(By.XPath("//*[@id=\"MainContent_RejillaRegistroFinanciero_ctl00_ctl04_labelCostoEnergia\"]")).Text, "\\$((,)*[0-9]*[0-9]*[0-9]+)+(\\.[0-9]{2})? usd")); } catch (AssertionException e) { verificationErrors.Append(e.Message); } try { Assert.IsTrue(Regex.IsMatch(driver.FindElement(By.XPath("//*[@id=\"MainContent_RejillaRegistroFinanciero_ctl00_ctl04_labelcostoUnitarioEnergia\"]")).Text, "\\$((,)*[0-9]*[0-9]*[0-9]+)+(\\.[0-9]{2})? usd")); } catch (AssertionException e) { verificationErrors.Append(e.Message); } // verify number format 1,234,567.89 try { Assert.IsTrue(Regex.IsMatch(driver.FindElement(By.XPath("//*[@id=\"MainContent_RejillaRegistroFinanciero_ctl00_ctl04_labelConsumo\"]")).Text, "((,)*[0-9]*[0-9]*[0-9]+)+(\\.[0-9]{2})?")); } catch (AssertionException e) { verificationErrors.Append(e.Message); } System.Console.WriteLine("errores: " + verificationErrors); System.Threading.Thread.Sleep(20000); driver.Quit(); } public static void SetupTest() { baseURL = "http://127.0.0.1:8081/ver.rel.1.2/"; verificationErrors = new StringBuilder(); } protected static void mouseOver(IWebDriver driver, IWebElement element) { Actions builder = new Actions(driver); builder.MoveToElement(element); builder.Perform(); } public static void highlightElement(IWebDriver driver, IWebElement element) { for (int i = 0; i < 2; i++) { IJavaScriptExecutor js = (IJavaScriptExecutor)driver; js.ExecuteScript("arguments[0].setAttribute('style', arguments[1]);", element, "color: yellow; border: 2px solid yellow;"); js.ExecuteScript("arguments[0].setAttribute('style', arguments[1]);", element, ""); } } } } 

我碰到的一个Microsoft工具:

UI自动化,作为.NET 3.5的一部分http://msdn.microsoft.com/en-us/library/aa348551.aspx

这是一个例子: http : //msdn.microsoft.com/en-us/library/ms771286.aspx

我的电脑上没有用于查询Firefox的UI Spy,所以我不知道这是否有助于解决你的user32.dll问题。