Selenium - Python - 下拉菜单选项值

时间:2011-10-23 16:40:47

标签: python selenium selenium-webdriver web-scraping webdriver

我需要从下拉菜单中选择一个元素。

例如,打开这个:

<select id="fruits01" class="select" name="fruits">
    <option value="0">Choose your fruits:</option>
    <option value="1">Banana</option>
    <option value="2">Mango</option>
</select>
  1. 首先我必须点击它。我这样做:

    inputElementFruits = driver.find_element_by_xpath("//select["id='fruits']).click()
    
  2. (好吧,它正在打开菜单)

    1. 在我必须选择好元素之后,让我们说芒果。我用inputElementFruits.send_keys(...)尝试了不同的东西,但它不起作用。

15 个答案:

答案 0 :(得分:219)

Selenium为select -> option构造提供了方便的Select class

from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Firefox()
driver.get('url')

select = Select(driver.find_element_by_id('fruits01'))

# select by visible text
select.select_by_visible_text('Banana')

# select by value 
select.select_by_value('1')

另见:

答案 1 :(得分:84)

除非你的点击正在触发某种类型的ajax调用以填充你的列表,否则你实际上不需要执行点击。

找到元素,然后枚举选项,选择所需的选项。

以下是一个例子:

from selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@name='element_name']/option[text()='option_text']").click()

您可以阅读更多内容:
https://sqa.stackexchange.com/questions/1355/unable-to-select-an-option-using-seleniums-python-webdriver

答案 2 :(得分:17)

首先需要导入Select类,然后需要创建Select类的实例。 创建Select类的实例后,您可以在该实例上执行select方法以从下拉列表中选择选项。 这是代码

from selenium.webdriver.support.select import Select

select_fr = Select(driver.find_element_by_id("fruits01"))
select_fr.select_by_index(0)

答案 3 :(得分:6)

我尝试了很多东西,但是我的下拉是在一张桌子里,我无法执行简单的选择操作。只有以下解决方案有效。在这里,我突出显示下拉元素并按下箭头直到获得所需的值 -

class VersionsPage(models.Model):
    pass
    # ToDo: add unique together here,  to foreign key field

class Page(models.Model):
    ...
    versions = models.ManyToManyField('self', blank=True, through="VersionsPage")

答案 4 :(得分:3)

希望这段代码对您有所帮助。

from selenium.webdriver.support.ui import Select

具有ID的下拉元素

ddelement= Select(driver.find_element_by_id('id_of_element'))

带有xpath的下拉元素

ddelement= Select(driver.find_element_by_xpath('xpath_of_element'))

带有CSS选择器的下拉元素

ddelement= Select(driver.find_element_by_css_selector('css_selector_of_element'))

从下拉列表中选择“香蕉”

  1. 使用下拉索引

ddelement.select_by_index(1)

  1. 使用下拉菜单的值

ddelement.select_by_value('1')

  1. 您可以使用匹配下拉菜单中显示的文本。

ddelement.select_by_visible_text('Banana')

答案 5 :(得分:3)

通过这种方式,您可以在任何下拉菜单中选择所有选项。

driver.get("https://www.spectrapremium.com/en/aftermarket/north-america")

print( "The title is  : " + driver.title)

inputs = Select(driver.find_element_by_css_selector('#year'))

input1 = len(inputs.options)

for items in range(input1):

    inputs.select_by_index(items)
    time.sleep(1)

答案 6 :(得分:2)

from selenium.webdriver.support.ui import Select
driver = webdriver.Ie(".\\IEDriverServer.exe")
driver.get("https://test.com")
select = Select(driver.find_element_by_xpath("""//input[@name='n_name']"""))
select.select_by_index(2)

它会正常工作

答案 7 :(得分:1)

使用selenium.webdriver.support.ui.Select类来处理下拉列表选择的最佳方法,但由于设计问题或HTML的其他问题,有时它无法按预期工作。

在这种情况下,您也可以使用execute_script()作为替代解决方案,如下所示: -

option_visible_text = "Banana"
select = driver.find_element_by_id("fruits01")

#now use this to select option from dropdown by visible text 
driver.execute_script("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].text == arguments[1]){ select.options[i].selected = true; } }", select, option_visible_text);

答案 8 :(得分:1)

您可以很好地使用CSS选择器组合

driver.find_element_by_css_selector("#fruits01 [value='1']").click()

将attribute = value css选择器中的1更改为与所需水果对应的值。

答案 9 :(得分:1)

它与选项值一起使用:

from selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@class='class_name']/option[@value='option_value']").click()

答案 10 :(得分:0)

您无需单击任何内容。 使用xpath查找或选择任何内容,然后使用发送键

例如: HTML:

<select id="fruits01" class="select" name="fruits">
    <option value="0">Choose your fruits:</option>
    <option value="1">Banana</option>
    <option value="2">Mango</option>
</select>

Python:

fruit_field = browser.find_element_by_xpath("//input[@name='fruits']")
fruit_field.send_keys("Mango")

就是这样。

答案 11 :(得分:0)

根据提供的HTML:

<select id="fruits01" class="select" name="fruits">
  <option value="0">Choose your fruits:</option>
  <option value="1">Banana</option>
  <option value="2">Mango</option>
</select>

要从菜单中选择<option>元素,必须使用Select Class 。此外,由于您必须与进行交互,因此必须为element_to_be_clickable()诱导WebDriverWait

要从中选择文本为 Mango <option>,可以使用以下Locator Strategies之一:

  • 使用 ID 属性和select_by_visible_text()方法:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import Select
    
    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "fruits01"))))
    select.select_by_visible_text("Mango")
    
  • 使用 CSS-SELECTOR select_by_value()方法:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.select[name='fruits']"))))
    select.select_by_value("2")
    
  • 使用 XPATH select_by_index()方法:

    select = Select(WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "//select[@class='select' and @name='fruits']"))))
    select.select_by_index(2)
    

答案 12 :(得分:0)

没有 <select> 的下拉菜单

每当我面对没有 <select> 标签的下拉菜单时,这都对我有用

# Finds the dropdown option by its text
driver.find_element_by_xpath("//*[text()='text of the option']")

导入 ActionChains 模块

from selenium.webdriver.common.action_chains import ActionChains

使用 ActionChains 点击元素

drp_element = driver.find_element_by_xpath("//*[text()='text of the option']")
action = ActionChains(driver)
action.click(on_element=drp_element).perform()

答案 13 :(得分:0)

在浏览了很多这样的帖子后,我设法找到了一个解决方案,让我可以在下拉列表中选择一个项目。我以各种方式尝试了 .send_keys、click() 和 Select,但没有成功。在单击下拉列表中的项目之前,最终将 click() 命令发送到下拉列表 3 次。

dropMenu = browser.find_element_by_id('cmbDeviceType')
dropMenu.click()
dropMenu.click()
dropMenu.click()

deviceType = browser.find_element_by_id('cmbDeviceType_DDD_L_LBI16T0')
deviceType.click()

绝对不是超级漂亮,但它有效。

希望这对某人有所帮助。这是在 Firefox 88.0.1 上使用 Python3.7.7 完成的。

答案 14 :(得分:-1)

  1. 列表项

公共类ListBoxMultiple {

public static void main(String[] args) throws InterruptedException {
    // TODO Auto-generated method stub
    System.setProperty("webdriver.chrome.driver", "./drivers/chromedriver.exe");
    WebDriver driver=new ChromeDriver();
    driver.get("file:///C:/Users/Amitabh/Desktop/hotel2.html");//open the website
    driver.manage().window().maximize();


    WebElement hotel = driver.findElement(By.id("maarya"));//get the element

    Select sel=new Select(hotel);//for handling list box
    //isMultiple
    if(sel.isMultiple()){
        System.out.println("it is multi select list");
    }
    else{
        System.out.println("it is single select list");
    }
    //select option
    sel.selectByIndex(1);// you can select by index values
    sel.selectByValue("p");//you can select by value
    sel.selectByVisibleText("Fish");// you can also select by visible text of the options
    //deselect option but this is possible only in case of multiple lists
    Thread.sleep(1000);
    sel.deselectByIndex(1);
    sel.deselectAll();

    //getOptions
    List<WebElement> options = sel.getOptions();

    int count=options.size();
    System.out.println("Total options: "+count);

    for(WebElement opt:options){ // getting text of every elements
        String text=opt.getText();
        System.out.println(text);
        }

    //select all options
    for(int i=0;i<count;i++){
        sel.selectByIndex(i);
        Thread.sleep(1000);
    }

    driver.quit();

}

}