Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用selenium和python的依赖下拉选择_Python_Selenium - Fatal编程技术网

使用selenium和python的依赖下拉选择

使用selenium和python的依赖下拉选择,python,selenium,Python,Selenium,我有一个表单,它有两个下拉菜单,比如a和B。下拉菜单B的内容取决于下拉菜单a的选择 表单使用AJAX加载下拉列表B的内容 我正在使用selenium和python自动选择下拉列表。我可以选择下拉列表A,但由于使用了AJAX,我的代码无法用于选择下拉列表B的内容 我已经搜索了selenium文档(显式等待)和一些stackoverflow答案,但仍然无法在python中实现它。我是python和selenium方面的新手,所以请容忍我 以下是我代码的一小部分: #District selectio

我有一个表单,它有两个下拉菜单,比如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加载。

您可以使用
选择中的属性检查下拉列表中是否有元素

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,我一定会尝试探索更多。