参考:www.w3school.com.cn/cssref/css_…
css知识回顾
<https://www.w3school.com.cn/cssref/css_selectors.asp>
元素2 是元素1 的直接子元素
元素1 > 元素2
元素2 是 元素1 的后代元素
元素1 元素2
或的关系
选择class为plant或id为animal的元素
.plant, #animal
选择id为t1下面的span* 或p元素
#t1 > span, #t1 > p
最近相邻兄弟
元素1 + 元素2
所有兄弟
元素1 ~ 元素2
选择h3后面所有的兄弟节点span
h3 ~ span
使用 ID, class, tag 选择元素
find_element(By.ID, 'username')
find_element(By.CLASS_NAME, 'password')
wd.find_element(By.TAG_NAME, 'input')
# element也可以find
spans = element.find_elements(By.TAG_NAME, 'span')
for span in spans:
print(span.text)
# 选择id为container下面的后代tag为span的元素
elements = wd.find_elements(By.CSS_SELECTOR, '#container span')
使用 CSS_SELECTOR 选择元素
# 相当于 find_element(By.ID, '.plant')
find_element(By.CSS_SELECTOR, '.plant')
# 相当于 find_element(By.TAG_NAME, 'plant')
find_element(By.TAG_NAME, 'plant')
# 相当于 find_element(By.ID, 'searchtext')
find_element(By.CSS_SELECTOR, '#searchText')
# 基于属性选择
find_element(By.CSS_SELECTOR, 'button[type=submit]').click()
find_element(By.CSS_SELECTOR, '[href="http://www.miitbeian.gov.cn"]')
find_element(By.CSS_SELECTOR, 'div[class=“SKnet”]')
# 选择属性为 href 的元素
element = wd.find_element(By.CSS_SELECTOR, '[href]')
# 选择class为plant,属性name为sknet的元素
element = wd.find_element(By.CSS_SELECTOR, '.plant[name="sknet"]')
# 父元素的第n个子节点
nth-child(n)
# 选择第2个子元素(有父元素,并且作为父元素的第二个子元素),并且是span类型
span:nth-child(2)
# 选择第2个元素,不管是什么类型
:nth-child(2)
# 父元素的倒数第n个子节点
nth-last-child(n)
# 选择倒数第1个子元素,并且是p元素
p:nth-last-child(1)
# 父元素的第n个子节点(指定子节点的类型)
nth-of-type(n)
# 选择第1个span类型的子元素
span:nth-of-type(1)
# 倒数第2个类型为p的元素
p:nth-last-of-type(2)
# 父元素的偶数节点
p:nth-child(even)
# 父元素的奇数节点
p:nth-child(odd)
# 父元素的 某类型偶数节点
p:nth-of-type(even)
# 父元素的 某类型奇数节点
p:nth-of-type(odd)
使用 XPATH 选择元素
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上
www.w3school.com.cn/xpath/index…
www.byhy.net/tut/auto/se…
# 选择所有/htm/body/div下面的p元素
find_elements(By.XPATH, "/html/body/div/p")
# 选择所有 div 下面的 p 元素
# 这相当于:find_elements(By.CSS_SELECTOR,"div p")
find_elements(By.XPATH, "//div//p")
# 选择 div 元素里面的 所有的 p 元素
# 对应 css 选择器 div p
//div//p
# Xpath 可以根据属性来选择元素。
# 根据属性来选择元素 是通过 这种格式来的 [@属性名='属性值']
# 选择 id 为 west 的元素:
//*[@id='west']
# 选择所有 select 元素中 class为 single_choice 的元素:
//select[@class='single_choice']
# 选择所有 p 元素下 calss 为 capital huge-city 的元素
# XPATH选择class和css_Selector不同,使用XPATH需要指定全量的class名,而使用css_selector只需指定一个
//p[@class="capital huge-city"]
# 选择属性为 multiple 的所有元素
//*[@multiple]
# 选择 p 类型倒数第2个
//p[last()-1]
# 选择 style属性值 包含 color 字符串的元素
//*[contains(@style, 'color')]
选择 style 属性值 以 color 字符串 开头的元素
//*[starts-with(@style,'color')]
选择 style 属性值以color结尾的元素
//*[ends-with(@style,'color')] # 很遗憾,这是xpath 2.0 的语法 ,目前浏览器都不支持
# 选择所有p类型中第2个
//p[2]
# 选择父元素为div的所有p类型中第2个
//div/p[2]
# 选择父元素为 div 的第2个子元素,不管是什么类型
//div/*[2]
# 选取p类型倒数第1个(即最后一个)子元素
//p[last()]
# 选取p类型倒数第2个子元素
//p[last()-1]
# 选择父元素为div中p类型倒数第3个子元素
//div/p[last()-2]
# 选取option类型第1到2个子元素
//option[position()<=2]
# 选择class属性为multi_choice的前3个子元素
//*[@class='multi_choice']/*[position()<=3]
# 选择class属性为multi_choice的后3个子元素
//*[@class='multi_choice']/*[position()>=last()-2]
# 选所有的 class 为 single_choice 和 class 为 multi_choice 的元素
//*[@class ='single_choice'] | // *[@ class ='multi_choice']
# 选择 id 为 china 的节点的父节点
# 当某个元素没有特征可以直接选择,但是它有子节点有特征, 就可以采用这种方法,先选择子节点,再指定父节点
//*[@id='china']/..
# 选择class为single_choice的后续兄弟节点中的div节点
//*[@class='single_choice']/following-sibling::div
# 选择 class 为 single_choice 的元素的所有前面的兄弟节点
//*[@class='single_choice']/preceding-sibling::*
# 选择 class 为 single_choice 的元素的前面最靠近的兄弟节点
# 而 CSS选择器 目前还没有方法选择前面的兄弟节点
//*[@class='single_choice']/preceding-sibling::*[1]
# 选择 div 元素里面的直接子节点 p
# 对应 css 选择器 div > p
//div/p
# 选择所有 div 节点的所有直接子节点
# 对应 css 选择器 div > *
//div/*
# 选择所有tag为 a 属性以 hello 开头的节点
# 对应 css 选择器 a[href*="hello"]
//a[contains(@href,’hello’)]
# 选择 tag 为 a 属性href以 hello 结束的节点
# 对应 css 选择器 a[href^="hello"]
//a[starts-with(@href, ‘hello’)]
# 选择所有 p 元素的第2个
# 对应 css 选择器 p:nth-of-type(2)
//p[2]
# 选择父元素为 div 第2个p的子节点
# 对应 css 选择器 div > p:nth-of-type(2)
//div/p[2]
# 组选择
# 对应 css 选择器 option, h4
//option | h4
# 组选择
# 对应 css 选择器 .choice1, .choice2
//*[@class=’choice1’] | *[@class=’choice2’]
# 选择 class 为 single_choice 的元素的所有后续兄弟节点
# 对应 css 选择器 .single_choice ~ *
//*[@class='single_choice']/following-sibling::*
radio 框选择
<div id="my_radio">
<input type="radio" name="teacher" value="刘德华">刘德华<br>
<input type="radio" name="teacher" value="张三丰">张三丰<br>
<input type="radio" name="teacher" value="大刘忙" checked="checked">大刘忙
</div>
# 获取当前选中的元素
find_element(By.CSS_SELECTOR,
'#my_radio input[name="teacher"]:checked')
print('当前选中的是: ' + element.get_attribute('value'))
# 点选 张三丰
find_element(By.CSS_SELECTOR,
'#my_radio input[value="张三丰"]').click()
checkbox 框选择
<div id="my_checkbox">
<input type="checkbox" name="teacher" value="刘德华">刘德华<br>
<input type="checkbox" name="teacher" value="张三丰">张三丰<br>
<input type="checkbox" name="teacher" value="大刘忙" checked="checked">大刘忙
</div>
# 业务:选中张三丰
# 先把已经选中的选项全部点击一下
elements = driver.find_elements(By.CSS_SELECTOR,
'#s_checkbox input[name="teacher"]:checked')
for element in elements:
element.click()
# 再点击
driver.find_element(By.CSS_SELECTOR,
"#s_checkbox input[value='张三丰']").click()
select 框选择
https://cdn2.byhy.net/files/selenium/test2.html
对于Select 选择框, Selenium 专门提供了一个 Select类进行操作
<select id="ss_single">
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
from selenium.webdriver.support.ui import Select
if __name__ == '__main__':
wd = chrome_driver()
wd.implicitly_wait(10)
wd.get('https://cdn2.byhy.net/files/selenium/test2.html')
# 创建Select对象
select = Select(wd.find_element(By.ID, 'ss_single'))
# 通过 Select 对象选中小雷老师
select.select_by_visible_text('小雷老师')
# select.select_by_index(2) # 索引从0开始
# select_by_value
# select_by_index
# select_by_visible_text
# deselect_by_value
# deselect_by_index
# deselect_by_visible_text
# deselect_all
input()
wd.quit()
Select多选框:
<select id="ss_multi" multiple="">
<option value="小江老师">小江老师</option>
<option value="小雷老师">小雷老师</option>
<option value="小凯老师" selected="selected">小凯老师</option>
</select>
select = Select(wd.find_element(By.ID, 'ss_multi'))
select.deselect_all() # 清除所有 已经选中 的选项
select.select_by_visible_text('小雷老师')
select.select_by_visible_text('小凯老师')