簡體   English   中英

如何使用C#/ IHTMLDocument2設置文本字段的值

[英]How to set value of a textfield using C# / IHTMLDocument2

我是一名業余程序員,並且想要執行以下操作:

  1. 通過用戶名-/密碼登錄站點
  2. 單擊將我定向到某個(子)站點的圖像
  3. 填寫表格
  4. 在提交表單之前,我想加載整個頁面並在提交之前查看應用程序提供的輸入內容。

在過去的幾個月中,我寫了幾個Web爬蟲/解析器(全部使用Java),但是現在我在使用C#和.NET時遇到了很多困難。

我正在使用Visual Studio 2015 IDE,並且我不希望-如果可能的話-使用第三方工具/插件等。(如果可能,請盡量不要提供暗示HtmlAgilityPack,JSoup ..等價物或其他形式的答案)。 .NET的所有核心(或一般來說只是C#)等等都是不錯的。

(1)和(2)已經起作用,我可以登錄並提供用戶名和密碼,然后click()圖片上的click()並使用如下所示的SAME代碼重定向到表單。

在現階段,我有以下代碼:(CAVE:這是一個WPF項目( 的WinForms),使用IHTMLDocument (2)

目前,我的代碼如下所示:

using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Navigation;
using mshtml;
using System.Diagnostics;

public partial class MainWindow : Window
{
    private CustomObject testObject; 
    public IHTMLDocument2 doc2;

public MainWindow()
    {
        InitializeComponent();
        Browser.Navigate("https://www.xXx.xXx/"); //The Browser is the standard WPF WebBrowser 
        // Several other functions like LoadComplete etc. here
    }

    // Function for login

    private void Browser_Login(object sender, RoutedEventArgs e)
    {
        doc2.all.item("ID_OF_USERNAME_TEXTFIELD").value = "MyUsername";
        doc2.all.item("ID_OF_PASSWORD_TEXTFIELD").value = "MyPassWord";
        doc2.all.item("NAME_OF_SUBMIT_BUTTON").click();
    } 

    private void Browser_ClickOnImageLinkToGetToForm(object sender, RoutedEventArgs e)
    {
        // Logic to get to the Form, everything works as expected
    }

    private void Browser_FillForm(object sender, RoutedEventArgs e)
    {
        doc2.all.item("NAME_OF_THE_TEXTFIELD_TO_FILL").value = "Text if want to put into the field";

    // /repeat for all other TextFields and a couple of other input elements.

                  --> Exception!
    }

每次運行代碼時,我都會執行以下操作:

  1. 啟動應用程序-> WebBrowser打開,將我定向到主頁。

  2. 單擊Button1(Browser_Login)->自動填充用戶名&&密碼->單擊提交(我現在已登錄)

  3. 單擊Image上的Button2(Browser_ClickOnImageLinkToGetToForm)->“ Click()”,重定向到該窗體。

  4. 單擊Button3(Browser_FillForm)-> RunTimeException:

附加信息:'System .__ ComObject'不包含'textContent'的定義或'value'的定義或'innerText'的定義或'InnerHtml'的定義等。

我嘗試了很多不同的方法,但似乎都沒有效果。

我要填充的TextField具有以下屬性:

    <input class="TxtField1" maxlength="800" type="text" id="Title" name="Title" value="" onkeyup="checkField(this.name);"  onblur="checkField(this.name);" style="width: 550px; cursor: help; background-color: rgb(228, 234, 224);" title="Some Title">

我從來沒有遇到過用Java進行編碼的此類問題,也有人提到我應該檢查32/64位系統,還有一些人建議為the_COM對象和其他東西編寫包裝器。 我不想寫一個包裝器,也不想檢查32位/ 64位,我想在每個系統上運行它。

有人會為此提供一個簡單的標准.Net / C#解決方案嗎? 請記住,我是一名業余愛好者,我不是專業開發人員(也許不懂一些超級深入的示例(我肯定會很艱難地學習它們))。

TL; DR:

如何填寫使用.NET / C#使用WPF WebBrowser控件檢查注冊表內容的表單!

如果掌握了DOM,可以做很多事情:

    private dynamic GetDOM(WebBrowser wb)
    {
        dynamic document = null;
        System.Threading.Thread.Sleep(500);
        while (document == null)
        {
            Dispatcher.Invoke(() => document = wb.Document);
            System.Threading.Thread.Sleep(100);
        }
        return document;
    }

不知道為什么您的工作沒有用,但是我從一個有效的解決方案中復制了此代碼。 如果您在主線程上,則可以剪切Dispatcher的內容。

您將獲得一個具有許多方法的COM對象,就像JavaScript中一樣。 因此,要設置文本,您可以執行以下操作:

document.getElementById("bob").value = "fred";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM