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

posted @ 2021-01-30 20:14  小太阳Sinimy  阅读(617)  评论(0编辑  收藏  举报