我需要从下拉菜单中选择一个元素。
例如,打开这个:
<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>
首先我必须点击它。我这样做:
inputElementFruits = driver.find_element_by_xpath("//select["id='fruits']).click()
(好吧,它正在打开菜单)
inputElementFruits.send_keys(...)
尝试了不同的东西,但它不起作用。答案 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()
答案 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'))
从下拉列表中选择“香蕉”
ddelement.select_by_index(1)
ddelement.select_by_value('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>
要从html-select菜单中选择<option>
元素,必须使用Select Class 。此外,由于您必须与drop-down-menu进行交互,因此必须为element_to_be_clickable()
诱导WebDriverWait。
要从dropdown中选择文本为 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)
公共类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();
}
}