Python selenium :从下拉列表中获取值

zd287kbt  于 2022-12-13  发布在  Python
关注(0)|答案(4)|浏览(228)

我在Python中使用Selenium打开一个网页,并试图从一个特定的下拉列表中获取值列表。

<select class="mdc-select__input" name="nouveau-num" data-msisdn-loaded="0">                           <option value="" selected="selected"></option>
                     <option value="351 8320175">351 8320175</option>
<option value="351 8652736">351 8652736</option>
<option value="351 8783295">351 8783295</option>
<option value="351 8094085">351 8094085</option>
<option value="351 8861691">351 8861691</option>
<option value="351 8271705">351 8271705</option>
<option value="351 8970191">351 8970191</option>
<option value="351 8965848">351 8965848</option>
<option value="351 8353924">351 8353924</option>
<option value="351 8988158">351 8988158</option>
</select>

我想检索<option>标记之间的所有值。我尝试执行browser.page_source,它返回网页的HTML源代码,然后执行正则表达式(类似于<option value="[0-9 ]*">),但结果为空。上面的HTML代码不在Selenium检索到的HTML页面源代码中。有什么想法我可以用不同的方法处理这个问题吗/现时的做法有甚么问题?

ippsafx7

ippsafx71#

您可以创建一个Select对象,并使用循环遍历选项的数量。
例如:

from selenium.webdriver.support.ui import Select
selector = Select(driver.find_element_by_name("nouveau-num"))
options = selector.options
for index in range(0, len(options)-1):
    print(options[index])

编辑:

我在你提供的链接上尝试了代码,似乎有一个延迟,直到下拉列表的值被加载。另外,我忘记了选项有一个元素列表,所以你需要指定. text。最重要的是,By.NAME似乎比find_element_by_name更好地工作
下面是更正后的代码:

from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

dropdown = driver.find_element(By.NAME, "nouveau-num")

selector = Select(dropdown)

# Waiting for the values to load
element = WebDriverWait(driver, 
10).until(EC.element_to_be_selected(selector.options[0]))

options = selector.options
for index in range(1, len(options)-1):
    print(options[index].text)

使用这段代码,我收到了以下结果:

351 8631174
351 8586821
351 8014561
351 8831839
351 8957001
351 8673968
351 8612034
351 8585995
351 8438130
snvhrwxg

snvhrwxg2#

根据这个聪明的回答,用Regex解析HTML从来都不是一个好主意。
您最好使用find_elements_by_css_selectorfind_elements_by_xpath
css选择器示例:

for tag in browser.find_elements_by_css_selector('select[name=nouveau-num] option'):
    value = tag.get_attribute('value')
    text = tag.text
lsmepo6l

lsmepo6l3#

为此我这样做:
1.获取xpath. (//label/div/div[1]/div[1]/div[1])
1.将"/*"放在(//label/div/div[1]/div[1]/div[1]/*)的末尾
1.使用driver.find_elements找到它(这很重要,如果省略结尾的“s”,则会失败)(lista = driver.find_elements(By.XPATH, '//label/div/div[1]/div[1]/div[1]/*'))
1.然后,您将得到一个web元素列表(不是字符串),我称之为“lista”
1.使用for循环并将值放入列表中。
列表项=列表()
对于列表项中的i:列表项目. append(i.文本)
仅此而已。

kpbwa7wx

kpbwa7wx4#

def verify_dropdown_value(self, Elementlocator, LocatorType, Expectedvalue):
    time.sleep(5)
    Value = self.helper.identify_element(Elementlocator, LocatorType, "Value")
    #ActualValue = Value.get_attribute('value')

    #options = Value.options
    ActualValue = Value.text

    if ActualValue == Expectedvalue:
        print("Pass")
        return True
    else:
        print("Fail")
        return False

相关问题