打开webbrowser,自动填写表单组件并提交

我们目前正在研究一种创建WPF / winforms应用程序的方法,我们可以在内部设置它:

  1. 自动将Web浏览器的新实例打开到预定义的URL
  2. 使用预定义数据自动完成必填字段
  3. 自动提交表单并等待下一页加载
  4. 使用预定义数据自动填写必填字段(第2页)
  5. 自动提交表单并等待下一页加载(等)

经过多次调查,我们唯一能找到的是通过以下方式打开网络浏览器: –

object o = null; SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer(); IWebBrowserApp wb = (IWebBrowserApp)ie; wb.Visible = true; wb.Navigate(url, ref o, ref o, ref o, ref o); 

任何建议/阅读建议将不胜感激如何完成该过程。

我写了一个例子来填充html页面中的元素。 你必须做这样的事情:

Winform的

 public Form1() { InitializeComponent(); //navigate to you destination webBrowser1.Navigate("https://www.certiport.com/portal/SSL/Login.aspx"); } bool is_sec_page = false; private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (!is_sec_page) { //get page element with id webBrowser1.Document.GetElementById("c_Username").InnerText = "username"; webBrowser1.Document.GetElementById("c_Password").InnerText = "pass"; //login in to account(fire a login button promagatelly) webBrowser1.Document.GetElementById("c_LoginBtn_c_CommandBtn").InvokeMember("click"); is_sec_page = true; } //secound page(if correctly aotanticate else { //intract with sec page elements with theire ids and so on } } 

WPF

 public MainWindow() { InitializeComponent(); webBrowser1.Navigate(new Uri("https://www.certiport.com/portal/SSL/Login.aspx")); } bool is_sec_page = false; mshtml.HTMLDocument htmldoc; private void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e) { htmldoc = webBrowser1.Document as mshtml.HTMLDocument; if (!is_sec_page) { //get page element with id htmldoc.getElementById("c_Username").innerText = "username"; //or //htmldoc.getElementById("c_Username")..SetAttribute("value", "username"); htmldoc.getElementById("c_Password").innerText = "pass"; //login in to account(fire a login button promagatelly) htmldoc.getElementById("c_LoginBtn_c_CommandBtn").InvokeMember("click"); is_sec_page = true; } //secound page(if correctly aotanticate else { //intract with sec page elements with theire ids and so on } } 

只需导航到特定的URL并填充页面元素。

如果我理解你正确,你想在网络浏览器中打开一些URL,然后像普通用户那样与网站进行交互。 对于这样的任务我可以建议看看Selenium 。 虽然它通常用作回归测试自动化工具,但没有人可以阻止您将其用作浏览器自动化工具。

Selenium有详细的文档和大社区 。 很可能你会想要使用可通过nuget获得的Selenium WebDriver 。

下面是典型的Selenium“脚本”的一个小例子(从文档中采用):

 // Create a new instance of the Firefox driver. // Notice that the remainder of the code relies on the interface, // not the implementation. // Further note that other drivers (InternetExplorerDriver, // ChromeDriver, etc.) will require further configuration // before this example will work. See the wiki pages for the // individual drivers at http://code.google.com/p/selenium/wiki // for further information. IWebDriver driver = new FirefoxDriver(); //Notice navigation is slightly different than the Java version //This is because 'get' is a keyword in C# driver.Navigate().GoToUrl("http://www.google.com/"); // Find the text input element by its name IWebElement query = driver.FindElement(By.Name("q")); // Enter something to search for query.SendKeys("Cheese"); // Now submit the form. WebDriver will find the form for us from the element query.Submit(); // Google's search is rendered dynamically with JavaScript. // Wait for the page to load, timeout after 10 seconds WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until((d) => { return d.Title.ToLower().StartsWith("cheese"); }); // Should see: "Cheese - Google Search" System.Console.WriteLine("Page title is: " + driver.Title); //Close the browser driver.Quit(); 

就个人而言,我可以建议根据用户操作思考和组织脚本(注册,登录,填写表单,选择网格中的内容,过滤网格等)。 这将为脚本提供良好的形状和可读性,而不是凌乱的硬编码代码块。 这种情况下的脚本看起来类似于:

 // Fill username and password // Click on button "login" // Wait until page got loaded LoginAs("johndoe@domain.com", "johndoepasswd"); // Follow link in navigation menu GotoPage(Pages.Reports); // Fill inputs to reflect year-to-date filter // Click on filter button // Wait until page refreshes ReportsView.FilterBy(ReportsView.Filters.YTD(2012)); // Output value of Total row from grid Console.WriteLine(ReportsView.Grid.Total); 
 if (webBrowser1.Document != null) { HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("input"); foreach (HtmlElement elem in elems) { String nameStr = elem.GetAttribute("name"); if (nameStr == "email") { webBrowser1.Document.GetElementById(nameStr).SetAttribute("value", "test_email@mail.com"); } } }