我想从 ac# 应用程序发送命令以在 Firefox 中打开网页并填写表格并单击按钮。
我不想使用 Selenium,我该怎么做才能自己构建它?
像 selenium 这样的框架工作的原因是因为网站是喜怒无常的,像 firefox 这样的浏览器已经实现了所需的请求和响应,而像 selenium 这样的框架是在此基础上构建的。
至于配置文件问题,请查看此处以获取有关创建供 selenium 使用的自定义配置文件的一些信息,然后像这样实例化驱动程序:
driver = new FirefoxDriver(new FirefoxProfile(@"...\AppData\Roaming\Mozilla\Firefox\Profiles\7923jt85.default"));
我个人更喜欢 Selenium 的 API。基本上,我在 firefox 中使用 IDE 扩展来记录和导出 C# 测试用例,然后使用输出来确定 Selenium 如何解析 html,然后构建一个库包装器以使其可根据我的需要进行定制。(导出的测试用例有很多 NUnit 测试框架属性,我只是删除所有这些,并调用给定的方法。)
下面的示例将打开 Firefox,在 google 中搜索“Cute Fluffy Cats”,然后单击“图像”选项卡。如有必要,您可以使用 API 做更多事情,这只是查看文档中可用内容的问题。(您可以复制此源代码,在 Visual Studio 中创建一个控制台项目,添加 selenium 引用并在您眼前看到它执行。)
另一种选择是 WatiN,但它与 Selenium 类似,Selenium 是一个测试框架,供构建并希望测试其网站用户体验的人使用。
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;
namespace SeleniumTests
{
public class Googletest
{
private IWebDriver driver;
private WebDriverWait wait;
private StringBuilder verificationErrors;
private string baseURL;
private bool acceptNextAlert = true;
public static void Main(string[] args)
{
var gt = new Googletest();
gt.SetupTest();
gt.TheGoogleTest();
//gt.TeardownTest();
}
public void SetupTest()
{
driver = new FirefoxDriver();
wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
baseURL = "https://www.google.com/";
verificationErrors = new StringBuilder();
}
public void TeardownTest()
{
try
{
driver.Quit();
}
catch (Exception)
{
// Ignore errors if unable to close the browser
}
}
public void TheGoogleTest()
{
driver.Navigate().GoToUrl(baseURL + "/");
driver.FindElement(By.Id("gbqfq")).Clear();
driver.FindElement(By.Id("gbqfq")).SendKeys("Cute Fluffy Cats");
driver.FindElement(By.Id("gbqfb")).Click();
wait.Until(d => d.FindElement(By.LinkText("Images"))).Click();
}
private bool IsElementPresent(By by)
{
try
{
driver.FindElement(by);
return true;
}
catch (NoSuchElementException)
{
return false;
}
}
private bool IsAlertPresent()
{
try
{
driver.SwitchTo().Alert();
return true;
}
catch (NoAlertPresentException)
{
return false;
}
}
private string CloseAlertAndGetItsText()
{
try
{
IAlert alert = driver.SwitchTo().Alert();
string alertText = alert.Text;
if (acceptNextAlert)
{
alert.Accept();
}
else
{
alert.Dismiss();
}
return alertText;
}
finally
{
acceptNextAlert = true;
}
}
}
}