14

onclick内で定義されたJavaScriptコードを取得する方法を探しています。.NET 2.0 C#VisualStudio2005を使用しています。

例:

<span id="foo" onclick+"window.location.href='someURL'>click here</span>

私の目標は、文字列「window.location.href='someURL'」を取得することです。

シナリオ:

ユーザーは、WebBrowserコントロール内で、たとえば上記のタグなどのWebページ要素をクリックします。次に、クリックされたタグはHを参照しtmlElement objectます。

次にWebBrowserコントロールで呼び出すとHtmlElement object's getAttribute("onclick")、「System.__ComObject」が表示されます。

私はそれを処理する方法を検索し、それをキャストして値を取得できることを発見しました。

if (tag.GetAttribute("onclick").Equals("System.__ComObject"))
{
    Console.WriteLine("dom elem  >>>>>>>>>>> " + tag.DomElement.ToString());
    mshtml.HTMLSpanElementClass span = (mshtml.HTMLSpanElementClass)tag.DomElement;

    Console.WriteLine("js value ===>" + span.onclick);
}

出力:

dom elem  >>>>>>>>>>> mshtml.HTMLSpanElementClass
js value ===> System.__ComObject

示されているように、span.onclickはまだSystem .__ ComObjectを提供しますが、何が間違っているのでしょうか。

HtmlElementのGetAttribute()メソッドが属性の値の代わりに「mshtml.HTMLInputElementClass」を返すのはなぜですか? この男はそれが彼の場合にうまくいったと言いました、そして私はそれに従いました、しかし私のものは幾分うまくいきません...

アップデート

研究、研究.....

参照VisualBasic.dllをC#プロジェクトに追加してから、メソッドを呼び出して、このSystem.__ComObjectが実際に誰であるかを確認できます。

Console.WriteLine(Microsoft.VisualBasic.Information.TypeName(span.onclick));

出力:

JScriptTypeInfo

これはJScriptタイプのようです...このオブジェクトにアクセスするにはどうすればよいですか?

より詳しく

上記の説明は私の現在のプロジェクトに基づいています。プロジェクトは、SeleniumIDEのようなものを作成することです。代わりにWebBrowserコントロールを使用します。

Selenium IDEは、Webドキュメントに要素を記録するために3つの異なるものを作成します。

1. actionType
2. xpath
3. value

例えば、

type, //input[@id=foo], "hello world"
clickAndWait, //link=login, ""

Selenium IDEはページの読み込みを認識するため、actionTypeをとの間で変更"click""clickAndWait"ます。私の場合、それを単純にしたい。

要素をクリックし、それanchor tagがページロードの種類であるか、またはそのようなjavascriptを持っている場合はonclick=window.location.href='blah'、actionTypeをに設定し"clickAndWait"ます。

4

6 に答える 6

9

あなたがそれを行うことができるいくつかの方法があります。

  1. DOM には Event オブジェクトがあり、このイベントを生成した要素に関する情報を提供します。
  2. ここで見ることができますhttp://msdn.microsoft.com/en-us/library/ff975965%28v=VS.85%29.aspx
  3. これは良いです。これを簡単に使用できます。イベントオブジェクトをメソッドパラメーターとして取得し、パラメーターを調査してイベントのソースを見つけることができます。http://support.microsoft.com/kb/312777

もう 1 つの方法は、カスタム ナビゲーション URL を使用して、それに基づいて操作することです。

  1. BeforeNavigate イベントをオーバーライドする
  2. ナビゲーション URL に「mycommand:click」または「mycommand:clickandwait」が含まれているかどうかを確認します。 3. このいずれかが含まれている場合は、cancel を true に設定します。(これにより、ブラウザによるナビゲーションが停止します)。
  3. 次に、C# コードから Web ブラウザー コードをナビゲートし、cancel を true として渡すことができます。

もう 1 つの代替方法は、External オブジェクトを使用することです。WebBrowser を使用すると、HTML の Javascript 内でアクセスできるObjectForScriptingを設定できます。

.NET 2.0 の ObjectForScripting

[ComVisible(true)]
public class MyClass
{
   // can be called from JavaScript
   public void ShowMessageBox(string msg){
       MessageBox.Show(msg);
   }
}

myBrowser.ObjectForScripting = new MyClass(); 
// or you can reuse instance of MyClass

そして、あなたは電話することができます、

window.external.ShowMessageBox("This was called from JavaScript");
于 2011-06-09T13:23:20.153 に答える
4

要素オブジェクトを mshtml.IHTMLDOMNode にキャストし、 IHTMLDOMNode.attributesを介して属性を読み取ります。HtmlElement.GetAttribute は、埋め込み属性から生成された jscript 関数の IDispatch インターフェイスを取得しています。

于 2011-06-14T06:11:54.930 に答える
3

Sheng Jiangの回答によると、ここにいくつかの実用的なサンプルがあります:

IHTMLElement element = YourCodeToGetElement();
string onclick = string.Empty;

IHTMLDOMNode domNode = element as IHTMLDOMNode;
IHTMLAttributeCollection attrs = domNode.attributes;

foreach (IHTMLDOMAttribute attr in attrs)
{
    if (attr.nodeName.Equals("onclick"))
    {
        string attrValue = attr.nodeValue as string;
        if (!string.IsNullOrEmpty(attrValue))
        {
            onclick = attr.nodeValue;
            break;
        }
    }
}
于 2011-11-10T03:24:43.770 に答える
2

C#で行う必要がない場合(JSで行うことができ、ポストバックを作成できます)、この質問を確認する必要があります

于 2011-06-09T14:36:15.287 に答える
2

HtmlAgilityPackwebBrowser1.DocumentTextを使用してプロパティを解析し、XPath を使用して目的の結果を得ることができます。

于 2011-06-06T12:37:18.803 に答える
2

最初に obj.outerHtml を読み取ることで、自分で簡単に解析できます。これにより、その obj の html 全体が表示され、値 onclick="????" が検索されます。????を抽出します 部。

于 2012-04-09T23:27:35.923 に答える