【问题标题】:Dependent DROP-DOWN selection using selenium and python使用 selenium 和 python 的依赖 DROP-DOWN 选择
【发布时间】:2016-03-07 12:41:49
【问题描述】:

我有一个表单,它有两个下拉菜单 A 和 B。下拉 B 的内容取决于下拉 A 的选择。

表单使用AJAX加载下拉B的内容。

我正在使用 selenium 和 python 来自动选择下拉菜单。我可以选择下拉 A,但由于使用 AJAX,我的代码无法选择下拉 B 的内容。

我已经搜索了 selenium 文档(显式等待)和一些 stackoverflow 答案,但我仍然无法在 python 中实现它。我是 python 和 selenium 的新手,所以请多多包涵。

这是我的一小部分代码:

#District selection DROP-DOWN A
district=Select(driver.find_element_by_id("ddlDistrict85"))
district.select_by_value("1")

#SRO selection DROP-DOWN B
# I Need EXPLICIT WAIT logic here to wait till the entire drop-down B is loaded
sro=Select(driver.find_element_by_id("ddlSRO85"))
sro.select_by_value("1")

建议一些逻辑来等待整个下拉 B 被加载。

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    您可以使用Select 中的options 属性来检查下拉菜单中有元素

    district=Select(driver.find_element_by_id("ddlDistrict85"))
    district.select_by_value("1")
    
    sro=Select(driver.find_element_by_id("ddlSRO85"))
    while len(sro.options) == 0:
        continue
    sro.select_by_value("1")
    

    【讨论】:

    • @sakyan 你能检查下拉列表填充前后sro.options 的大小吗?也许有一些默认值,while 中的条件应该是while len(sro.options) == 1 或更多。
    • 在加载之前sro.options 的大小为1。我尝试通过修改您的代码但仍然无法正常工作。
    • @sakyan 想分享吗? :)
    • 我有一个解决方案,我正在使用time.sleep(delay) 等待页面加载下拉B。
    【解决方案2】:

    您还没有分享这些不同菜单的 html 外观,所以让我假设下拉 B 由具有特定类的 DIV 包装,或者更好的是 ID,也许:

    <div id="menuB"> ... </div>
    

    现在,您可以使用Expected Conditions 等待该菜单出现。

    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.visibility_of_element_located((By.ID,'menuB')))
    

    【讨论】:

      【解决方案3】:

      经过大量搜索,我找到了一个简单的解决方案,我可以选择下拉 B 的内容。 所以我正在回答我自己的问题。

      使用time 模块中的sleep 函数暂停程序的执行一段时间(以秒为单位)。

      程序代码如下:

      import time #To import time module
      #District selection
      district=Select(driver.find_element_by_id("ddlDistrict85"))
      district.select_by_value("1")
      #SRO selection
      time.sleep(5) 
      sro=Select(driver.find_element_by_id("ddlSRO85"))
      sro.select_by_value("1")
      

      现在可以了。

      【讨论】:

      • 作为一个新手,您最终会发现使用硬编码的睡眠并不可靠或不可靠,因此 WebDriverWait 类的可用性。我鼓励您进一步了解它,并进一步尝试使用 ExpectedConditions。你会更快乐前进!
      • 感谢@BreaksSoftware,我一定会尝试更多。
      猜你喜欢
      • 2023-03-17
      • 2021-04-23
      • 2017-01-01
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2022-12-02
      • 1970-01-01
      相关资源
      最近更新 更多