微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在VBA中使用Selenium选择/取消选择网页上的一组复选框

如何解决在VBA中使用Selenium选择/取消选择网页上的一组复选框

下面是带有6个复选框的网页框架的一部分。我正在尝试在VBA中创建一个可重用的脚本,以选择或取消选择此表元素中的所有复选框。

一个表单元格中有多个复选框,因此我尝试使用表元素进行操作不起作用。

我认为基于“对于每个对象来说都可以解决问题,但是不幸的是,我无法使其起作用。另一方面,我也可能会遍历所有具有” // input [@ type ='checkBox”的元素']”,然后检查父元素是否与“ / p [@ id ='p_status'] / table / tbody / tr / td”匹配。在这里,选择元素很容易,但可以验证父元素不断失败。也许我在这里错过了一个重要的选择。

也许可以创建代码,但是我真的很感谢这里的帮助。

<p id="p_status" style="">
<table width="50%" align="center">
    <tbody><tr>
        <td Nowrap="">
            <input type="checkBox" name="status" value="X"><b>Dr</b><br>
            <input type="checkBox" name="status" value="W" checked=""><b>Pe</b><br>
            <input type="checkBox" name="status" value="R"><b>Re</b>
        </td>
        <td Nowrap="" width="50%">
            <input type="checkBox" name="status" value="U"><b>UI</b><br>
            <input type="checkBox" name="status" value="A"><b>Au</b><br>
            <input type="checkBox" name="status" value="Q"><b>SA</b>                        
        </td>
    </tr>
</tbody></table>
</p>

Art。

解决方法

如果要一次性选择/取消选中所有复选框,则可以使用以下代码:

Set checkboxes= driver.FindElementsByXPath("//p[@id='p_status']//input[@type='checkbox']")
For Each checkbox In checkboxes
    checkbox.Click
Next

它将选中所有未选中的复选框,反之亦然。

但是,如果您要创建可重用的功能,以在给定时间选择/取消选择任何一个复选框。您可以创建如下函数:

Sub Check_checkboxLogo(driver As WebDriver,lbl as String)
    set xpath_Checkbox = "//p[@id='p_status']//b[text()='"& lbl &"']//preceding-sibling::input[@type='checkbox']"
    driver.FindElementByXPath(xpath_Checkbox).Click
End Sub

现在您可以调用上述功能,例如Check_checkboxLogo(driver,"Dr")Check_checkboxLogo(driver,"Pe")等。

,

谢谢拉胡尔!不知何故,我的问题的某些部分在**对于Webelements中的每个Webelement都被省略了,但是我希望可以在此处找到解决方案。

我的可重用解决方案更通用,但功能相同:

Public Function AllCkBoxes(strXP As String,_
                           Optional blnSelect As Boolean = False,_
                           Optional lngTimeOut As Long = 500)
    
    'This function deselects (blnSelect=False) or selects (blnSelect=True) all child checkboxes of a webelement

    On Error GoTo Err_Proc
    
    Dim lngResult As Long
    Dim wEle As WebElement
    Dim wEles As WebElements
    Dim strXpType As String

    With driver
        strXpType = "//preceding-sibling::input[@type='checkbox']"
        lngResult = .FindElementsByXPath(XPath:=strXP & strXpType).Count
        If lngResult > 0 Then
            Set wEles = .FindElementsByXPath(XPath:=strXP & strXpType,timeout:=lngTimeOut)
            For Each wEle In wEles
                If wEle.IsSelected <> blnSelect Then
                    wEle.Click
                End If
            Next
        End If
    End With

Exit_Proc:
    On Error Resume Next
    Set wEle = Nothing
    Set wEles = Nothing
    Exit Function

Err_Proc:
    Select Case Err.Number
        Case Else
            MsgBox "Error: " & CStr(Err.Number) & vbCrLf & _
                   "Desc: " & Err.Description & vbCrLf & vbCrLf & _
                   "Source: " & Err.Source & vbCrLf & _
                   "Library: " & Application.CurrentProject.Name & vbCrLf & _
                   "Module: Mod_RA" & vbCrLf & _
                   "Function: AllCkBoxes" & vbCrLf,_
                   vbCritical,"Error"
    End Select
    Resume Exit_Proc
    Resume
End Function 

再次,谢谢!

Art。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。