Web驱动程序如何在VBA中选择DYNAMIC中的选项

时间:2016-11-22 23:15:57

标签: vba selenium-webdriver webdriver

我有这个HTML

<div class="ui-widget">
<select name="calAlum" style="display: none;">undefined
<option value=""></option> 
<option value="5.0">5.0</option>
 <option value="5.1">5.1</option> 
<option value="5.2">5.2</option>
 <option value="5.3">5.3</option>
 <option value="5.4">5.4</option>
 <option value="5.5">5.5</option>
 <option value="5.6">5.6</option>
 <option value="5.7">5.7</option>
 <option value="5.8">5.8</option>
 <option value="5.9">5.9</option>
 <option value="6.0">6.0</option>
 <option value="6.1">6.1</option>
 <option value="6.2">6.2</option>
 <option value="6.3">6.3</option>
 <option value="6.4">6.4</option>
 <option value="6.5">6.5</option>
 <option value="6.6">6.6</option>
 <option value="6.7">6.7</option>
 <option value="6.8">6.8</option>
 <option value="6.9">6.9</option>
 <option value="7.0">7.0</option>
 <option value="7.1">7.1</option>
 <option value="7.2">7.2</option>
 <option value="7.3">7.3</option>
 <option value="7.4">7.4</option>
 <option value="7.5">7.5</option>
 <option value="7.6">7.6</option>
 <option value="7.7">7.7</option>
 <option value="7.8">7.8</option>
 <option value="7.9">7.9</option>
 <option value="8.0">8.0</option>
 <option value="8.1">8.1</option>
 <option value="8.2">8.2</option>
 <option value="8.3">8.3</option>
 <option value="8.4">8.4</option>
 <option value="8.5">8.5</option>
 <option value="8.6">8.6</option>
 <option value="8.7">8.7</option>
 <option value="8.8">8.8</option>
 <option value="8.9">8.9</option>
 <option value="9.0">9.0</option>
 <option value="9.1">9.1</option>
 <option value="9.2">9.2</option>
 <option value="9.3">9.3</option>
 <option value="9.4">9.4</option>
 <option value="9.5">9.5</option>
 <option value="9.6">9.6</option>
 <option value="9.7">9.7</option>
 <option value="9.8">9.8</option>
 <option value="9.9">9.9</option>
 <option value="10.0">10.0</option>
 </select>

当我点击objetc显示所有列表但是如果按“5”例如列表只显示“5.0”,“5.1”,“5.2”等,当我按5.8时只显示“5.8” llike值选择

所以我想用VBA选择任何选项,(其他combox我没有问题,但这有错误)

我试过这个

sub CALF()

Dim H As selenium.Keys

*Here  find the element "select" whit the name "calAlum"* i dont have problem

For Each element In WEB3.FindElementsByTag("select")

If element.Attribute("name") = "calAlum" Then

 element.AsSelect.selectbyvalue Activecell *in this part show error*

End If

Next

MsgBox "fin"

End Sub

但是对于这个下拉不起作用我试图使用不同的方法,但不工作,注意:此代码转到IF内部

“专注于盒子但不行”

element.click 

“写价值不行”

element.sendkeys "5.8"

“复制剪贴板中的值,然后在objetc中粘贴值不起作用”

WEB3.SetClipBoard ActiveCell.Value
element.SendKeys Control, "V"

但如果手动选择对象中的任何值,如“9.8”,则在代码中使用

R= element.value

R=elment.attrribute("value")

返回“9.8”然后我使用

element.asselect.selectbyvalue R  work

但如果我改变R =“9.7”并使用

element.asselect.selectbyvalue R

返回找不到错误值

然后我试着在selectelemnet中包装webelement这个

r= element.SelectedOption

r= element.asselect.selectedoption

知道选择了什么选项,但两者都返回void“”很少见,因为R = element.value返回“9.8”然后我使用

element.asselect.options

for i=0 to element.asselect.options

r(i)=element.asselect.selectedoption

next

知道所有选项都在选择元素“元素”但返回错误其必要的对象所以使用

r = element.IsSelected

但是返回false就是说我不能像webelement那样使用对象,如果我对selectelment进行包装,那么对象就没有任何选择,有人可以帮助我。

如果你帮我如何选择对象o如何操纵对象“选择”动态

1 个答案:

答案 0 :(得分:0)

CSS选择器:

您可以使用CSS选择器来定位选择的选项,然后使用.Click进行选择。您可以将选项值提取到一个变量中,然后将其连接到CSS选择器字符串中。

您的示例:

例如,您可以使用选择器select option[value='5.0'],其中将5.0提取到变量中。

CSS query

CONST SELECTED_INDEX As String = "5.0"
WEB3.FindElementByCss("select option[value='" & SELECTED_INDEX & "']").Click

以下是使用Facebook并选择生日下拉菜单的示例。

Facebook生日那天的CSS选择器:

#day option[value='18']

CSS query

这被读为ID为"day"的元素,其中包含标签option,属性value=18#是ID选择器,[]是属性。


VBA Code:

Option Explicit
Public Sub MakeSelection()
    Dim d As WebDriver
    Set d = New ChromeDriver
    Const URL = "https://www.facebook.com/"
    Const SELECTED_INDEX As Long = 18
    With d
        .Start "Chrome"
        .get URL
        'Selector was e.g. for day 1 "#day option[value='1']"
        .FindElementByCss("#day option[value='" & SELECTED_INDEX & "']").Click

        Stop '<= Delete me later
        .Quit
        Application.ScreenUpdating = True
    End With
End Sub