selenium 基础-选择元素
1.选择元素的基本方法
1.根据元素的ID属性选择元素:find_element_by_id
根据id选择元素,返回的就是该元素对应的WebElement对象
element = driver.find_element_by_id('kw') element.send_keys('自动化测试')
2.根据class名选择元素(class表示的是类别、属性):find_elements_by_class_name
from selenium import webdriver # 创建 WebDriver 实例对象,指明使用chrome浏览器驱动 wd = webdriver.Chrome() # WebDriver 实例对象的get方法 可以让浏览器打开指定网址 wd.get('http://cdn1.python3.vip/files/selenium/sample1.html') # 根据 class name 选择元素,返回的是 一个列表 # 里面 都是class 属性值为 animal的元素对应的 WebElement对象 elements = wd.find_elements_by_class_name('animal') # 取出列表中的每个 WebElement对象,打印出其text属性的值 for element in elements: print(element.text) # text属性就是该 WebElement对象对应的元素在网页中的文本内容
find_element和find_elements的区别:
使用 find_elements
选择的是符合条件的 所有
元素, 如果没有符合条件的元素, 返回空列表
使用 find_element
选择的是符合条件的 第一个
元素, 如果没有符合条件的元素, 抛出 NoSuchElementException 异常
3.根据tag名选择元素:find_elements_by_tag_name
from selenium import webdriver wd = webdriver.Chrome() wd.get('http://cdn1.python3.vip/files/selenium/sample1.html') # 根据 tag name 选择元素,返回的是 一个列表 # 里面 都是 tag 名为 div 的元素对应的 WebElement对象 elements = wd.find_elements_by_tag_name('div') # 取出列表中的每个 WebElement对象,打印出其text属性的值 # text属性就是该 WebElement对象对应的元素在网页中的文本内容 for element in elements: print(element.text)
4.根据WebElement对象选择元素
WebElement对象 也可以调用 find_elements_by_xxx
, find_element_by_xxx
之类的方法
WebDriver 对象 选择元素的范围是 整个 web页面, 而
WebElement 对象 选择元素的范围是 该元素的内部。
from selenium import webdriver # 创建 WebDriver 实例对象,指明使用chrome浏览器驱动 wd = webdriver.Chrome() # WebDriver 实例对象的get方法 可以让浏览器打开指定网址 wd.get('http://cdn1.python3.vip/files/selenium/sample1.html') element = wd.find_element_by_id('container') # 限制 选择元素的范围是 id 为 container 元素的内部。 spans = element.find_elements_by_tag_name('span') for span in spans: print(span.text) 执行结果: 内层11 内层12 内层21
异常报错:NoSuchElementException
的意思就是在当前的网页上 找不到该元素, 就是找不到 id 为 1 的元素。
2.等待界面元素出现
implicitly_wait:
当发现元素没有找到的时候, 并不 立即返回 找不到元素的错误。而是周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,
或者超出指定最大等待时长,这时才 抛出异常(如果是 find_elements
之类的方法, 则是返回空列表)
from selenium import webdriver # 创建一个浏览器对象:调用Chromedriver服务,来生成一个浏览器 driver = webdriver.Chrome() # 设置最大等待时间 driver.implicitly_wait(10) # 访问一个url driver.get('https://www.baidu.com/') # 搜索流程的实现 # 输入搜索内容 element = driver.find_element_by_id('kw') element.send_keys('自动化测试') # 点击百度一下按钮 driver.find_element_by_id('su').click() # id为1的元素,就是第一个搜索结果 result = driver.find_element_by_id('1') print(result.text)
3.操控元素的基本方法:
1.点击元素:调用元素WebElement对象的 click方法
2.输入字符串:调用元素WebElement对象的send_keys方法
3.获取元素包含的信息:
1.获取元素的文本内容:通过WebElement对象的 text
属性,可以获取元素 展示在界面上的
文本内容
element = wd.find_element_by_id('animal') print(element.text)
2.获取元素属性:通过WebElement对象的 get_attribute
方法来获取元素的属性值
result = driver.find_element_by_id('3001') print(result.get_attribute('cmatchid'))
3.获取整个元素对应的HTML
要获取整个元素对应的HTML文本内容,可以使用 element.get_attribute('outerHTML')
只是想获取某个元素 内部
的HTML文本内容,可以使用 element.get_attribute('innerHTML')
4.获取输入框里面的文字:
对于input输入框的元素,要获取里面的输入文本,用text属性是不行的,这时可以使用 element.get_attribute('value')
5.获取元素的文本内容2:
有时候,元素的文本内容没有展示在界面上,或者没有完全完全展示在界面上。 这时,用WebElement对象的text属性,获取文本内容,就会有问题。
出现这种情况,可以尝试使用 element.get_attribute('innerText')
,或者 element.get_attribute('textContent')
4.CSS选择器
通过 CSS Selector 选择单个元素的方法是:find_element_by_css_selector(CSS Selector参数)
选择所有元素的方法是:find_elements_by_css_selector(CSS Selector参数)
1.根据tag名选择元素:直接写上tag名即可
比如 要选择 所有的tag名为div的元素,就可以是这样
elements = wd.find_elements_by_css_selector('div')
等价于
elements = wd.find_elements_by_tag_name('div')
2.根据id属性选择元素:在id号前面加上一个井号: #id值
from selenium import webdriver # 创建一个浏览器对象:调用Chromedriver服务,来生成一个浏览器 driver = webdriver.Chrome() # 设置最大等待时间 driver.implicitly_wait(10) driver.get('http://cdn1.python3.vip/files/selenium/sample1.html') elements = driver.find_elements_by_css_selector('#searchtext') for element in elements: print(element.text) driver.quit()
3.根据class属性选择元素:在 class 值 前面加上一个点: .class值
from selenium import webdriver # 创建一个浏览器对象:调用Chromedriver服务,来生成一个浏览器 driver = webdriver.Chrome() # 设置最大等待时间 driver.implicitly_wait(10) driver.get('http://cdn1.python3.vip/files/selenium/sample1.html') #.animal意思是寻找class属性为为animal,'.'的意思是'值等于' elements = driver.find_elements_by_css_selector('.animal') for element in elements: print(element.text) driver.quit() 执行结果: 狮子 老虎 山羊
4.选择子元素和后代元素
1.子元素:直接包含的元素,中间没有其他层次的元素
CSS Selector 选择子元素的语法是这样的:元素1 > 元素2
中间用一个大于号 (我们可以理解为箭头号)
注意,最终选择的元素是 元素2, 并且要求这个 元素2 是 元素1 的直接子元素
也支持更多层级的选择, 比如:元素1 > 元素2 > 元素3 > 元素4
就是选择 元素1
里面的子元素 元素2
里面的子元素 元素3
里面的子元素 元素4
, 最终选择的元素是 元素4
elements = driver.find_elements_by_css_selector('#container > div' ) 执行结果: --------------------- 内层11 内层12 --------------------- 内层21
2.后代元素:虽然不是直接子元素,但是他还在父元素内部。直接子元素同时也是后代元素
CSS Selector 选择后代元素的语法是这样的:元素1 元素2
中间是一个或者多个空格隔开
最终选择的元素是 元素2 , 并且要求这个 元素2 是 元素1 的后代元素。
也支持更多层级的选择, 比如:元素1 元素2 元素3 元素4
最终选择的元素是 元素4
elements = driver.find_elements_by_css_selector('#container div ' ) 执行结果: --------------------- 内层11 内层12 --------------------- 内层11 --------------------- 内层12 --------------------- 内层21 --------------------- 内层21
注意:直接子元素和后代元素筛选可以组合使用
elements = driver.find_elements_by_css_selector('#container div > span' ) 执行结果: --------------------- 内层11 --------------------- 内层12 --------------------- 内层21
5.根据属性选择:用一个方括号 []
# 选择 属性href值为 http://www.miitbeian.gov.cn 的元素。 elements = driver.find_elements_by_css_selector('[href="http://www.miitbeian.gov.cn"] ') 执行结果: <a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a>
前面可以加上标签名的限制,比如 div[class='SKnet']
表示 选择所有 标签名为div,且class属性值为SKnet的元素。
根据属性选择,还可以不指定属性值,比如 [href]
, 表示选择 所有 具有 属性名 为href 的元素,不管它们的值是什么。
1.选择 属性值 包含
某个字符串 的元素
#选择a节点,里面的href属性包含了 miitbeian 字符串 a[href*="miitbeian"]
2.选择 属性值 以某个字符串 开头
的元素
#选择a节点,里面的href属性以 http 开头 a[href^="http"]
3.选择 属性值 以某个字符串 结尾
的元素
#选择a节点,里面的href属性以 gov.cn 结尾 a[href$="gov.cn"]
6.验证CSS Selector
CSS Selector 是浏览器直接支持的,可以在浏览器 开发者工具栏 中验证。
比如我们使用Chrome浏览器打开,按F12 打开 开发者工具栏,点击 Elements 标签后, 同时按 Ctrl 键 和 F 键, 就会出现下图箭头处的 搜索框
我们可以在里面输入任何 CSS Selector 表达式 ,如果能选择到元素, 右边的的红色方框里面就会显示出类似 2 of 3
这样的内容。
of 后面的数字表示这样的表达式 总共选择到几个元素
of 前面的数字表示当前黄色高亮显示的是 其中第几个元素
7.选择语法联合使用
CSS selector 表达式 可以这样写:div.footer1 > span.copyright
就是 选择 一个class 属性值为 copyright 的 span 节点, 并且要求其 必须是 class 属性值为 footer1 的 div节点 的子节点
8.组选择:css选择器可以 使用 逗号
,称之为 组选择
同时选择所有tag名为div的元素 和
id为BYHY的元素,就可以像这样写:div,#BYHY
组选择的优先级比较低,计算靠后,所以如果要选择所有 id 为 t1 里面的 span 和 p 元素
只能这样写:#t1 > span , #t1 > p
9.按次序选择子节点
1.按照父元素选择:
1.选择父元素的第n个子节点:nth-child
选择第2个子元素,并且是span类型,可以这样写 span:nth-child(2)
2.选择父元素的倒数第n个子节点:nth-last-child
选择第倒数第1个子元素,并且是p元素:p:nth-last-child(1)
3.选择父元素的第几个某类型的子节点:nth-of-type
选择的是 第2个子元素,并且是span类型,可以这样写 span:nth-child(2)
4.选择父元素的倒数第几个某类型的子节点:nth-last-of-type
5.奇数节点和偶数节点:
选择的是父元素的偶数节点
,使用 nth-child(even)
选择的是父元素的 奇数节点
,使用 nth-child(odd)
选择的是父元素的 某类型偶数节点
,使用 nth-of-type(even)
选择的是父元素的 某类型奇数节点
,使用 nth-of-type(odd)
2.按照兄弟节点选择
1.相邻兄弟节点选择:表示元素 紧跟关系的 是 加号
选择 h3 后面紧跟着的兄弟节点
span,可以这样写 h3 + span
2.后续所有兄弟节点的选择:使用~
选择 h3 后面所有的兄弟节点
span,可以这样写 h3 ~ span