使用selenium和python的依赖下拉选择
我有一个表单,它有两个下拉菜单,比如a和B。下拉菜单B的内容取决于下拉菜单a的选择 表单使用AJAX加载下拉列表B的内容 我正在使用selenium和python自动选择下拉列表。我可以选择下拉列表A,但由于使用了AJAX,我的代码无法用于选择下拉列表B的内容 我已经搜索了selenium文档(显式等待)和一些stackoverflow答案,但仍然无法在python中实现它。我是python和selenium方面的新手,所以请容忍我 以下是我代码的一小部分:使用selenium和python的依赖下拉选择,python,selenium,Python,Selenium,我有一个表单,它有两个下拉菜单,比如a和B。下拉菜单B的内容取决于下拉菜单a的选择 表单使用AJAX加载下拉列表B的内容 我正在使用selenium和python自动选择下拉列表。我可以选择下拉列表A,但由于使用了AJAX,我的代码无法用于选择下拉列表B的内容 我已经搜索了selenium文档(显式等待)和一些stackoverflow答案,但仍然无法在python中实现它。我是python和selenium方面的新手,所以请容忍我 以下是我代码的一小部分: #District selectio
#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加载。您可以使用选择中的属性检查下拉列表中是否有元素
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")
您可以使用Select
中的属性检查下拉列表中是否有元素
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")
您尚未共享这些不同菜单的html外观,因此让我假设下拉列表B由一个具有特定类的DIV包装,或者更好地说是一个ID,可能:
<div id="menuB"> ... </div>
您尚未共享这些不同菜单的html外观,因此让我假设下拉列表B由一个具有特定类的DIV包装,或者更好地说是一个ID,可能:
<div id="menuB"> ... </div>
在搜索了很多之后,我找到了一个简单的解决方案,在这里我可以选择下拉列表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")
它现在可以工作了。在搜索了很多之后,我找到了一个简单的解决方案,在这里我可以选择下拉列表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")
现在可以使用了。@sakyan您能在填充下拉列表之前和之后检查一下sro.options
的大小吗?可能存在一些默认值,while
中的条件应为while len(sro.options)==1
或更多。加载sro.options
之前,其大小应为1。我试图修改你的代码,但仍然不起作用。@sakyan想分享吗?:)我找到了一个解决方案,我正在使用time.sleep(delay)
等待页面加载下拉列表B。@sakyan您能在填充下拉列表之前和之后检查sro.options的大小吗?可能存在一些默认值,while
中的条件应为while len(sro.options)==1
或更多。加载sro.options
之前,其大小应为1。我试图修改你的代码,但仍然不起作用。@sakyan想分享吗?:)我找到了一个解决方案,我使用time.sleep(delay)
等待页面加载下拉列表B。作为新手,您最终会发现使用硬编码的sleep不可靠或不可靠,因此WebDriverWait类的可用性也不高。我鼓励你去更多地了解它,并在预期的条件下做进一步的实验。你会更快乐地前进!谢谢@BreaksSoftware,我一定会尝试探索更多。作为一个新手,你最终会发现使用硬编码睡眠既不可靠也不健壮,因此WebDriverWait类的可用性也不高。我鼓励你去更多地了解它,并在预期的条件下做进一步的实验。你会更快乐地前进!谢谢@BreaksSoftware,我一定会尝试探索更多。