0

Webサイトには17個のHTMLボタンがあります。これらのボタンにはIDがなく、同じ名前、タイプ、および値があります。vb.net 2008 webbrowserコントロールを使用して、プログラムでボタンをクリックしたいと思います。このコードを書くとき

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        WebBrowser1.Navigate("website bla bla")
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        Dim allelements As HtmlElementCollection = WebBrowser1.Document.All

        For Each webpageelement As HtmlElement In allelements

            If webpageelement.GetAttribute("value") =  "Start" Then

                webpageelement.InvokeMember("click")

            End If

        Next

    End Sub
End Class

その後、毎回、17番目のボタンが私のプログラムによってクリックされます。1番目のボタンを個別にクリックしたい場合は、2番目のボタン、3番目のボタンなど、次のボタンをそれぞれ個別にクリックします。では、各ボタンを個別にクリックする方法を教えてください。これがボタンのHTMLコードです。

4

1 に答える 1

0

あなたが主張するように、すべてのボタンが同じ値を持っているので、最後のボタンがクリックされます。したがって、ボタンを値で識別しないでください。

最善の解決策は、サーバー側を変更して、ボタンがidプログラムで互いに区別しやすいようにするプロパティ(理想的には)を持つようにすることです。(これは、たとえば、同僚が開発したWebサイトのテストハーネスを作成している場合に当てはまります。同僚と話し、要求を「テスト容易性」と呼びます。)

ただし、どうしてもWebサイトをそのまま使用する必要がある場合は、各ボタンを一意にする1ビットの情報があり、それがシーケンシャルインデックスです。

Dim i As Integer
Dim allButtons As HtmlElementCollection

allButtons = WebBrowser1.Document.getElementsByTagName('input');

i = 0
For Each webpageelement As HtmlElement In allButtons
    i += 1
    If i = 7 Then
        webpageelement.InvokeMember("click")
    End If
Next

これにより、7番目のボタンをクリックします。この方法の欠点は、Webサイトのレイアウトが少し変更されるたびに、クライアントコードがひどく壊れて、修正される前にあらゆる種類の混乱と退屈を引き起こすことです。これらの固定インデックス値をシンボリック名で表し、シーケンシャルインデックスをそれらとのみ比較することで、これと部分的に戦うことができますが、それでも再利用が困難な脆弱な手法です。

于 2012-06-17T21:28:48.560 に答える