如何在 ASPX 网站的下拉列表中选择特定项目

Posted

技术标签:

【中文标题】如何在 ASPX 网站的下拉列表中选择特定项目【英文标题】:How to select an specific item on a drop down list on ASPX site 【发布时间】:2018-06-03 06:19:40 【问题描述】:

我希望它就像用户点击了“牙科”一样。但是,当我运行以下代码时,没有任何反应。 我希望它就像用户点击了“牙科”一样。但是,当我运行以下代码时,没有任何反应。 我希望它就像用户点击了“牙科”一样。但是,当我运行以下代码时,什么也没有发生。

'Public Sub IE_Search_and_Extract()  
    'Dim URL As String
    'Dim IE As SHDocVw.InternetExplorer
    'Dim htmldoc As HTMLDocument
    'Dim response As String
    'response = MsgBox("Login ", vbYesNo + vbQuestion, "login")
    'If response = vbYes Then
     '   URL = " "
    'Else
    'End If

    'Set IE = Get_IE_Window(URL)
    'If IE Is Nothing Then
     '   Set IE = New SHDocVw.InternetExplorer
    'End If

   ' With IE
    '    SetForegroundWindow .hwnd
     '   .navigate URL
      '  .Visible = True
       ' While .Busy Or .readyState <> READYSTATE_COMPLETE
        '    DoEvents
        'Wend

      '  '.document.getElementById("btnLogin").Click

'      '  While .Busy Or .readyState <> READYSTATE_COMPLETE
'            DoEvents
'        Wend
        Application.Wait (Now + TimeValue("0:00:5"))
        Set HTMLdoc = .document
    End With

    'Dim post As Object, elem As Object
    'For Each post In HTMLdoc.getElementsByClassName("cboItem")
     '   If InStr(post.innerText, "Dental") > 0 Then post.Click: Exit For
    'Next post

'End Sub

【问题讨论】:

您好,欢迎来到 SO!我们在这里帮助现有代码(或尝试的研究),通常人们不会为您创建代码,如果您需要为您编写的代码,您可能需要查看一些付费服务。请参考How-To-Ask @马尔德雷德。谢谢你的建议。很抱歉当时我没有包含我的代码。现在我已经包含了我迄今为止创建的代码。在发布此问题之前,我还浏览了各种帖子并尝试解决此问题。但是我没有成功。 您的意思是要合成点击“牙科”?您希望它就像用户点击了“牙科”一样?或者你的意思是你想知道用户已经点击了什么项目? 另外,您现有的代码有什么问题?运行时会发生什么? @cxw 我希望它就像用户点击了“牙科”一样。当我运行这段代码时,什么都没有发生,我在 VBE 上也没有收到错误。 谢谢!我已编辑您的问题以包含该信息。请允许我建议您以后自己进行此类编辑:)。 【参考方案1】:

此特定网页未使用 &lt;select&gt;&lt;option&gt;。这表明他们正在使用一些自定义 javascript 来模拟下拉列表,使用图示的 &lt;div&gt;&lt;span&gt; 元素。此外,他们使用onselect 而不是onclick 来触发事件处理程序。

我无法复制您的测试用例。但是,我确实制作了自己的测试用例,我认为它有效。简而言之,将post.Click 替换为post.onselect。您的代码的问题在于它试图触发目标 &lt;span&gt; 上不存在的 onclick 处理程序!

HTML

<html>
    <head>
    <script type="text/javascript">
    function clk()  alert('Dental clicked');      // *** So I could see if Click had an effect
    function sel()  alert('Dental selected');     // *** Simulate the given testcase
    </script>
    </head>
<body>
    <div class="cboGroupGrid">
        <span class="cboItem" option="0"></span>
        <span class="cboItem" option="1" onselect="sel();" onclick="clk();">Dental</span>
        <span class="cboItem" option="2">Health</span>
        <span class="cboItem" option="3">Unknown Product</span>
    </div>
</body></html>

VBA

在下面的代码中,''' 是我注释掉的东西,因为我没有它们,而且据我所知,它们对任务来说不是必不可少的。

Public Sub IE_Search_and_Extract()

    Dim URL As String
    Dim IE As SHDocVw.InternetExplorer
    Dim HTMLdoc As HTMLDocument
    Dim response As String
    '''response = MsgBox("Login ", vbYesNo + vbQuestion, "login")
    '''If response = vbYes Then
    '''    URL = " "
    '''Else
    '''End If
    URL = "prashant.htm"     ' ** Local testcase

    '''Set IE = Get_IE_Window(URL)  ' ** I don't have the code for this function
    '''If IE Is Nothing Then
        Set IE = New SHDocVw.InternetExplorer
    '''End If

    With IE
        '''SetForegroundWindow .Hwnd    ' ** I don't have this function
        .navigate URL
        .Visible = True
        While .Busy Or .readyState <> READYSTATE_COMPLETE
            DoEvents
        Wend

        '.document.getElementById("btnLogin").Click

'        While .Busy Or .readyState <> READYSTATE_COMPLETE
'            DoEvents
'        Wend
        'Application.Wait (Now + TimeValue("0:00:5"))
        Set HTMLdoc = .document
    End With

    Dim post As Object, elem As Object
    For Each post In HTMLdoc.getElementsByClassName("cboItem")
        If InStr(post.innerText, "Dental") > 0 Then     ' ** Use a block If, not inline.
            'post.Click    ' ** This does work, and triggers clk()
            post.onselect  ' ** This triggers sel()
            Exit For
        End If
    Next post
End Sub

样式建议:如果您在 ThenElse 块中有多个内容,请始终使用多行形式。这样,: 是否结束 Then 块就没有歧义了。

【讨论】:

@prashant 这就是我所拥有的。如果您还没有阅读,请阅读the MCVE page 吗?这将帮助您从网站中获得更多收益。在这种情况下,如果您包含完整的本地测试用例的 HTML 和 VBA,您的问题可能会更容易被接受。我不得不通过从您提供的屏幕截图中手动复制来重新创建一个测试用例,大多数人不会这样做(而且我可能不会再这样做了,现在您知道发生了什么;))。一如既往,祝黑客愉快! 感谢您的帮助。我试过你的代码。它不工作。我附上了另一个下拉列表的屏幕截图。您的代码在右侧下拉列表中运行良好。但不适用于左边的。 @prashant 很高兴听到它对某些事情有用!如果它适用于Dental 但不适用于Ad Hoc Work Search,请您投票+接受这个答案并进行一些研究吗?然后,如果您仍然遇到Ad Hoc Work Search 的问题,您可以提出另一个链接到这个问题的问题。尝试我使用过的和其他人提到的一般技术:制作 HTML 文件的本地副本,将其剥离为基础,然后使用 VBA 调试器逐步执行您的代码。单步执行时,使用立即窗口和监视窗口查看变量的值。祝你好运! @cxw 其实反之亦然。它适用于 Adhoc,而不适用于牙科。我将在即时窗口上尝试,如果成功,请告诉您。再次感谢!! @prashant 有趣!不客气!不要忘记 Watch 窗口 - 它会显示变量的类型,然后您可以在 MSDN 或对象浏览器中检查该类型。

以上是关于如何在 ASPX 网站的下拉列表中选择特定项目的主要内容,如果未能解决你的问题,请参考以下文章

在 DataGridViewComboBox 下拉列表中设置特定项目的颜色

当我在 asp.net 核心中选择下拉值时,如何将特定文本设置为下拉列表?

如何以编程方式在 select2 多选下拉列表中添加其他选择而不会丢失现有的选定项目

如何在下拉列表中仅显示(设置)特定项目?

当用户从日期选择器中选择日期时,如何在下拉列表中获取特定的星期几?

如何按当前时间设置下拉列表的默认选择?