【问题标题】:How to loop through options in a drop down list?如何遍历下拉列表中的选项?
【发布时间】:2018-12-20 15:42:01
【问题描述】:

我正在尝试循环浏览下拉菜单的选项或项目,但我不知道项目的数量,因为它每次都会更改。

这是 sList3 的 html 部分

<select name="ctl00$ContentPlaceHolder1$Dschool" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$Dschool\',\'\')', 0)" id="ContentPlaceHolder1_Dschool" style="font-size:12pt;font-weight:bold;width:500px;">
	<option selected="selected" value="0"> Select From Menu </option>
	<option value="311223">first option</option>
	<option value="311625">some option</option>
</select>

这是我已经开始的代码

For i = 1 To 4
    Set sList1 = .FindElementById("ContentPlaceHolder1_Dedara").AsSelect
    sList1.SelectByIndex i
    .Wait 2000
    Set sList2 = .FindElementById("ContentPlaceHolder1_Drel").AsSelect
    sList2.SelectByIndex 1
    .Wait 2000
    Set sList3 = .FindElementById("ContentPlaceHolder1_Dschool").AsSelect

    'How can I loop through the options (unknown in length)
Next i

我想循环每个选项并 debug.print 选项的值。

解决方案

在 JeffC 的帮助下,这是最终的解决方案

            For j = 1 To sList3.Options.Count
            Debug.Print sList3.Options(j).Text
        Next j

【问题讨论】:

  • 我认为你可以通过sList3.children() 或其他类似的方式来for each?这就是它与HtmlDocumentiirc 一起工作的方式
  • 我尝试了For Each e In sList3.Children(),但没有成功,并且出现错误。
  • .AsSelect 上没有 Options 列表吗?如果不出意外,您可以计算作为SELECT 子级的OPTIONs 的数量。
  • 非常感谢。我没明白你的意思?你能给我一行代码来计算选项,因为我注意到其中一些列表是空的并且没有选项..
  • 我不使用 VBA Selenium ...我使用 C#(以前是 Java)。在 C# 中,我们有 new SelectElement(driver.FindElement(...)).Options 这是一个元素列表。您可以在末尾打一个.Count 并获取选项数量。我不知道你在 VBA 中是否有等价物,但我假设你有,因为你有一个 .AsSelect。如果我猜的话,应该是.FindElementById(...).AsSelect.Options。如果你有 Intellisense,当你在.AsSelect 之后输入. 时,你应该得到一个方法/属性列表。浏览该列表,看看你能找到什么。

标签: excel vba selenium selenium-webdriver web-scraping


【解决方案1】:

我认为你可以为每个循环使用

WebElement selectElement = driver.findElement(By.xpath("//select[@id='ContentPlaceHolder1_Dschool']"));
Select select = new Select(selectElement);
List<WebElement> options = select.getOptions();
for (WebElement we : options) 
{
  System.out.println("Element="+we.getText());
}

【讨论】:

  • 好吧..我不做 VBA selenium..我在 Java 中使用 selenium WebDriver
  • 我认为我帖子中发布的解决方案与 Java 中使用的解决方案相似。我说的对吗?
【解决方案2】:

您可以使用 CSS 选择器来获取父 id 下的选项集合

Dim elements As Object, element As Object
Set elements = driver.FindElementsByCss("#ContentPlaceHolder1_Dschool option")

然后循环

For Each element In elements:
    Debug.Print element.text
Next

CSS:


如果id是动态切换css到

[id^=ContentPlaceHolder1] option

【讨论】:

  • 非常感谢。在这一行Set elements ... 我得到了不支持这个对象的错误。而且我在 excel VBA for selenium 中找不到 findElementsByCssSelector 方法。我玩过它并使用FindElementsByCss' instead of findElementsByCssSelector `
  • 对不起,我对 python 语法感到困惑,做了一种混合。哈哈。让我更新
  • 您知道您也可以发布自己的答案并在两天后接受。
  • 但这是 JeffC 的回答,我只是按照他的步骤进行
  • 由您决定,但可能对其他读者有用,并且随着时间的推移,cmets 可能会逐渐消失。 Css 选择器和 For Each 循环一样更快,但您的解决方案是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多