第十三节:下拉选择框Select

selenium的下拉选择框。我们通常会遇到两种下拉框,一种使用的是html的标签select,另一种是使用input标签做的假下拉框。

后者我们通常的处理方式与其他的元素类似,点击或使用JS等。而对于前者,selenium给了有力的支持,就是Select类。

网页与源码截图如下:

测试网页截图

1.导入(import)

你可以用以下方式导入:

from selenium.webdriver.support.ui import Select
# 或者直接从select导入
# from selenium.webdriver.support.select import Select
   
   
  • 1
  • 2
  • 3

这两种方法没有本质的区别,你如果去看ui库,你会发现,它也只是把select import进去。

2.选择(select)

Select类提供了三种选择某一选项的方法

select_by_index(index)
select_by_value(value)
select_by_visible_text(text)
   
   
  • 1
  • 2
  • 3

针对于示例网站中的第一个select框:

<select id="s1Id">
<option></option>
<option value="o1" id="id1">o1</option>
<option value="o2" id="id2">o2</option>
<option value="o3" id="id3">o3</option>
</select>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们可以这样定位:

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

driver = webdriver.Firefox()
driver.get('http://sahitest.com/demo/selectTest.htm')

s1 = Select(driver.find_element_by_id('s1Id'))  # 实例化Select

s1.select_by_index(1)  # 选择第二项选项:o1
s1.select_by_value("o2")  # 选择value="o2"的项
s1.select_by_visible_text("o3")  # 选择text="o3"的值,即在下拉时我们可以看到的文本

driver.quit()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

以上是三种选择下拉框的方式,注意:

  1. index从 0 开始
  2. value是option标签的一个属性值,并不是显示在下拉框中的值
  3. visible_text是在option标签中间的值,是显示在下拉框的值

3.反选(deselect)

自然的,有选择必然有反选,即取消选择。Select提供了四个方法给我们取消原来的选择:

deselect_by_index(index)
deselect_by_value(value)
deselect_by_visible_text(text)
deselect_all() #全部取消
   
   
  • 1
  • 2
  • 3
  • 4

前三种分别于select相对应,第四种是全部取消选择,是的,你没看错,是全部取消。有一种特殊的select标签,即设置了multiple=”multiple”属性的select,这种select框是可以多选的,你可以通过多次select,选择多项选项,而通过deselect_all()来将他们全部取消。

重要说明:选择没有提供全选功能。

4.选项(options)

当我们选择了选项之后,想要看看选择的是哪项,所选的是否是我想选的,怎么办?别担心,Select为你提供了相应的方法(或者应该说是属性了):

options  #select元素所有的选项
all_selected_options  #所有被选中的选项
first_selected_option  #第一个被选中的选项
   
   
  • 1
  • 2
  • 3

1 想查看一个select所有的选项

...

s1 = Select(driver.find_element_by_id('s1Id'))

for select in s1.options:
    print select.text

...
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结果:


o1
o2
o3
   
   
  • 1
  • 2
  • 3
  • 4

一共四项,第一项为空字符串。

2 想查看我已选中的选项

...

s4 = Select(driver.find_element_by_id('s4Id'))

s4.select_by_index(1)
s4.select_by_value("o2val")
s4.select_by_visible_text("With spaces")
s4.select_by_visilbe_text("    With nbsp")

for select in s4.all_selected_options:
    print select.text

...
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

结果:

o1
o2
    With spaces
    With nbsp
   
   
  • 1
  • 2
  • 3
  • 4

输出所有被选中的选项,适合于能多选的框,仅能单选的下拉框有更合适的方法(当然用这种方法也可以)。这里需要注意的是两种不同空格的选择:

  1. 空格’ ‘,这种在以visible_text的方式选择时,不计空格,从第一个非空格字符开始
  2. 网页空格& nbsp;,对于这种以nbsp为空格的选项,在以visible_text的方式选择时,需要考虑前面的空格,每一个nbsp是一个空格

3 想要查看选择框的默认值,或者我以及选中的值

...

s2 = Select(driver.find_element_by_id('s2Id'))

print s2.first_selected_option.text

s2.select_by_value("o2")
print s2.first_selected_option.text

...
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果:


o2
   
   
  • 1
  • 2

第一行输出默认选项的文本——空字符串”“;第二行输出选中的选择的文本——”o2”。

5.总结

  • Select提供了三种选择方法:

    select_by_index(index) ——通过选项的顺序,第一个为 0 
    select_by_value(value) ——通过value属性 
    select_by_visible_text(text) ——通过选项可见文本

  • 同时,Select提供了四种方法取消选择:

    deselect_by_index(index) 
    deselect_by_value(value) 
    deselect_by_visible_text(text) 
    deselect_all()

  • 此外,Select提供了三个属性方法给我们必要的信息:

    options ——提供所有的选项的列表,其中都是选项的WebElement元素 
    all_selected_options ——提供所有被选中的选项的列表,其中也均为选项的WebElement元素 
    first_selected_option ——提供第一个被选中的选项,也是下拉框的默认值

  • 通过Select提供的方法和属性,我们可以对标准select下拉框进行任何操作,但是对于非select标签的伪下拉框,就需要用其他的方法了,此处未做说明。


### 回答1: 好的,下面是 element-ui 中 select 二级联动的代码示例: 1. 首先你需要在 data 中声明两个数组,分别用来存储第一个 select 的内容和第二个 select 的内容: ``` data() { return { options1: [], // 第一个 select 的内容 options2: [] // 第二个 select 的内容 } } ``` 2. 在页面中添加两个 select 组件,并绑定 options1 和 options2 数组: ``` <template> <el-select v-model="selected1" placeholder="请选择" :options="options1"> </el-select> <el-select v-model="selected2" placeholder="请选择" :options="options2"> </el-select> </template> ``` 3. 然后在第一个 select 的 change 事件中,根据选择的内容来更新第二个 select 的内容: ``` <template> <el-select v-model="selected1" placeholder="请选择" :options="options1" @change="updateOptions2"> </el-select> <el-select v-model="selected2" placeholder="请选择" :options="options2"> </el-select> </template> <script> export default { data() { return { selected1: '', // 选中的第一个 select 的内容 selected2: '', // 选中的第二个 select 的内容 options1: [], // 第一个 select 的内容 options2: [] // 第二个 select 的内容 } }, methods: { updateOptions2() { // 根据选中的第一个 select 的内容来更新 options2 数组 // 这里设 options1 和 options2 是已经初始化好的数组, // 并且 options2 中存储的是 options1 中每个选项对应的子选项 this ### 回答2: element-ui的select组件是一个下拉选择组件,支持二级联动。当使用select选择时,选择第一个的内容后,根据第一个的不同内容,展示第二个里对应的内容。下面是一个简单的代码示例: ``` <template> <div> <el-select v-model="selectedOption1" @change="handleChange1"> <el-option v-for="option in options1" :key="option.value" :label="option.label" :value="option.value"></el-option> </el-select> <el-select v-model="selectedOption2"> <el-option v-for="option in options2" :key="option.value" :label="option.label" :value="option.value"></el-option> </el-select> </div> </template> <script> export default { data() { return { selectedOption1: '', // 第一个选择的选中值 selectedOption2: '', // 第二个选择的选中值 options1: [ // 第一个选择的选项 { value: 'option1', label: '选项1' }, { value: 'option2', label: '选项2' }, { value: 'option3', label: '选项3' } ], options2: [] // 第二个选择的选项 } }, methods: { handleChange1() { // 根据第一个选择的选中值来更新第二个选择的选项 if (this.selectedOption1 === 'option1') { this.options2 = [ { value: 'option1-1', label: '选项1-1' }, { value: 'option1-2', label: '选项1-2' }, { value: 'option1-3', label: '选项1-3' } ] } else if (this.selectedOption1 === 'option2') { this.options2 = [ { value: 'option2-1', label: '选项2-1' }, { value: 'option2-2', label: '选项2-2' }, { value: 'option2-3', label: '选项2-3' } ] } else if (this.selectedOption1 === 'option3') { this.options2 = [ { value: 'option3-1', label: '选项3-1' }, { value: 'option3-2', label: '选项3-2' }, { value: 'option3-3', label: '选项3-3' } ] } else { this.options2 = [] // 若第一个选择没有选中值,则清空第二个选择的选项 } this.selectedOption2 = '' // 每次更新选项后,重置第二个选择的选中值 } } } </script> ``` 在这个示例中,我们使用了两个select选择,第一个选择的选项为`options1`,第二个选择的选项为`options2`。当第一个选择的选中值发生改变时,通过`handleChange1`方法来根据选中值更新第二个选择的选项。根据不同的选中值,我们为第二个选择设置不同的选项。同时,每次更新选项后,我们将第二个选择的选中值重置为空。 ### 回答3: element-ui提供了组件`ElSelect`和`ElOption`来实现select选择的二级联动功能。以下是示例代码: ``` <template> <div> <el-select v-model="selectedOption1" @change="handleChangeOption1"> <el-option v-for="option1 in options1" :key="option1.value" :label="option1.label" :value="option1.value"></el-option> </el-select> <el-select v-model="selectedOption2" v-if="selectedOption1" @change="handleChangeOption2"> <el-option v-for="option2 in options2" :key="option2.value" :label="option2.label" :value="option2.value"></el-option> </el-select> </div> </template> <script> export default { data() { return { options1: [ { value: 'option1', label: '选项1' }, { value: 'option2', label: '选项2' }, { value: 'option3', label: '选项3' } ], options2: [ { value: 'suboption11', label: '子选项11', parent: 'option1' }, { value: 'suboption12', label: '子选项12', parent: 'option1' }, { value: 'suboption13', label: '子选项13', parent: 'option1' }, { value: 'suboption21', label: '子选项21', parent: 'option2' }, { value: 'suboption22', label: '子选项22', parent: 'option2' }, { value: 'suboption31', label: '子选项31', parent: 'option3' }, { value: 'suboption32', label: '子选项32', parent: 'option3' } ], selectedOption1: '', selectedOption2: '' }; }, methods: { handleChangeOption1(value) { // 根据选项1的值,更新选项2的可选内容 // 清空选项2的值,防止出现旧选项2的值没有对应选项1的情况 this.selectedOption2 = ''; // 根据选项1的值过滤出对应的选项2 this.options2 = this.options2.filter((option) => option.parent === value); }, handleChangeOption2(value) { console.log('选中的选项2:', value); } } }; </script> ``` 以上代码实现了一个简单的二级联动select选择,第一个选择用于选择一级选项,选中后会根据选项1的值动态过滤出对应的二级选项供第二个选择选择。当第二个选择的值发生变化时,会触发`handleChangeOption2`方法,并打印选中的选项2的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值