Web自动化 - 选择操作元素 2

时间:2021-12-18 22:56:36

文章转自 白月黑羽教Python

前面我们看到了根据 id、class属性、tag名 选择元素。

如果我们要选择的 元素 没有id、class 属性, 这时候我们通常可以通过 CSS selector 语法选择元素。

CSS Selector 语法选择元素

HTML中经常要 为 某些元素 指定显示风格,比如 前景文字颜色是红色, 背景颜色是黑色, 字体是微软雅黑等。

那么CSS必须告诉浏览器:要 选择哪些元素 , 来使用这样的显示风格。

CSS Selector 语法就是用来选择元素的。

既然它能选择元素,正好我们web 自动化也要选择元素, 所以selenium规范就把 CSS Selector 也纳入到选择元素的方法中了。

只要 CSS Selector 的语法是正确的, Selenium 就可以选择到该元素。

通过 CSS Selector 选择单个元素的方法是

find_element_by_css_selector(CSS Selector参数)

选择所有元素的方法是

find_elements_by_css_selector(CSS Selector参数)

CSS Selector 选择元素非常灵活强大, 大家可以从下面的例子看出来。

Web自动化 - 选择操作元素 2

本文目录

前面我们看到了根据 id、class属性、tag名 选择元素。

如果我们要选择的 元素 没有id、class 属性, 这时候我们通常可以通过 CSS selector 语法选择元素。

CSS Selector 语法选择元素

HTML中经常要 为 某些元素 指定显示风格,比如 前景文字颜色是红色, 背景颜色是黑色, 字体是微软雅黑等。

那么CSS必须告诉浏览器:要 选择哪些元素 , 来使用这样的显示风格。

CSS Selector 语法就是用来选择元素的。

既然它能选择元素,正好我们web 自动化也要选择元素, 所以selenium规范就把 CSS Selector 也纳入到选择元素的方法中了。

只要 CSS Selector 的语法是正确的, Selenium 就可以选择到该元素。

通过 CSS Selector 选择单个元素的方法是

find_element_by_css_selector(CSS Selector参数)

选择所有元素的方法是

find_elements_by_css_selector(CSS Selector参数)

CSS Selector 选择元素非常灵活强大, 大家可以从下面的例子看出来。

根据 tag名、id、class 选择元素

CSS Selector 同样可以根据tag名、id 和 class 选择元素,

根据 tag名 选择元素的 CSS Selector 语法非常简单,直接就是tag名,

比如 要选择 所有的tag名为div的元素,就可以是这样

elements = driver.find_elements_by_css_selector('div')

等价于

elements = driver.find_elements_by_tag_name('div')

根据id 选择元素的语法是在id号前面加上一个井号: #<id值>

比如 这个网址 http://www.python3.vip/doc/tutorial/python/code/sample1.html

有下面这样的元素:

<input type="text" id='searchtext' />

就可以使用 #searchtext 这样的 CSS Selector 来选择它。

比如,我们想在 id 为 searchtext 的输入框中输入文本 你好 ,完整的Python代码如下

from selenium import webdriver

driver = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')

driver.get('http://www.python3.vip/doc/tutorial/python/code/sample1.html')

element = driver.find_element_by_css_selector('#searchtext')
element.send_keys('你好')

根据class 选择元素的语法是在 class 值 前面加上一个点: .<class值>

比如 这个网址 http://www.python3.vip/doc/tutorial/python/code/sample1.html

要选择所有的class 属性值为 animal的元素 动物 除了这样写

elements = driver.find_elements_by_class_name('animal')

还可以这样写

elements = driver.find_elements_by_css_selector('.animal')

因为是选择 所有的 ,所以用 find_elements 而不是 find_element

选择 子元素 和 后代元素

HTML中, 元素 内部可以包含其他元素, 比如 下面的一个HTML片段

<div id='container'>

    <div id='layer1'>
<div id='inner11'>
<span>内层11</span>
</div>
<div id='inner12'>
<span>内层12</span>
</div>
</div> <div id='layer2'>
<div id='inner21'>
<span>内层21</span>
</div>
</div> </div>

Web自动化 - 选择操作元素 2

本文目录

前面我们看到了根据 id、class属性、tag名 选择元素。

如果我们要选择的 元素 没有id、class 属性, 这时候我们通常可以通过 CSS selector 语法选择元素。

CSS Selector 语法选择元素

HTML中经常要 为 某些元素 指定显示风格,比如 前景文字颜色是红色, 背景颜色是黑色, 字体是微软雅黑等。

那么CSS必须告诉浏览器:要 选择哪些元素 , 来使用这样的显示风格。

CSS Selector 语法就是用来选择元素的。

既然它能选择元素,正好我们web 自动化也要选择元素, 所以selenium规范就把 CSS Selector 也纳入到选择元素的方法中了。

只要 CSS Selector 的语法是正确的, Selenium 就可以选择到该元素。

通过 CSS Selector 选择单个元素的方法是

find_element_by_css_selector(CSS Selector参数)

选择所有元素的方法是

find_elements_by_css_selector(CSS Selector参数)

CSS Selector 选择元素非常灵活强大, 大家可以从下面的例子看出来。

根据 tag名、id、class 选择元素

CSS Selector 同样可以根据tag名、id 和 class 选择元素,

根据 tag名 选择元素的 CSS Selector 语法非常简单,直接就是tag名,

比如 要选择 所有的tag名为div的元素,就可以是这样

elements = driver.find_elements_by_css_selector('div')

等价于

elements = driver.find_elements_by_tag_name('div')

根据id 选择元素的语法是在id号前面加上一个井号: #<id值>

比如 这个网址 http://www.python3.vip/doc/tutorial/python/code/sample1.html

有下面这样的元素:

<input type="text" id='searchtext' />

就可以使用 #searchtext 这样的 CSS Selector 来选择它。

比如,我们想在 id 为 searchtext 的输入框中输入文本 你好 ,完整的Python代码如下

from selenium import webdriver driver = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe') driver.get('http://www.python3.vip/doc/tutorial/python/code/sample1.html') element = driver.find_element_by_css_selector('#searchtext') element.send_keys('你好')

根据class 选择元素的语法是在 class 值 前面加上一个点: .<class值>

比如 这个网址 http://www.python3.vip/doc/tutorial/python/code/sample1.html

要选择所有的class 属性值为 animal的元素 动物 除了这样写

elements = driver.find_elements_by_class_name('animal')

还可以这样写

elements = driver.find_elements_by_css_selector('.animal')

因为是选择 所有的 ,所以用 find_elements 而不是 find_element

选择 子元素 和 后代元素

HTML中, 元素 内部可以包含其他元素, 比如 下面的一个HTML片段

<div id='container'> <div id='layer1'> <div id='inner11'> <span>内层11</span> </div> <div id='inner12'> <span>内层12</span> </div> </div> <div id='layer2'> <div id='inner21'> <span>内层21</span> </div> </div> </div>

id 为 container 的div元素 包含了 id 为 layer1layer2 的两个div元素。 这种包含是直接包含, 中间没有其他的包含层次了。 所以 id 为 layer1layer2 的两个div元素 是 id 为 container 的div元素 的 直接子元素

而 id 为 layer1 的div元素 又包含了 id 为 inner11inner12 的两个div元素。 这种包含关系也是直接子元素 关系

id 为 layer2 的div元素 又包含了 id 为 inner21 这个div元素。 这种包含关系也是直接子元素 关系

而对于 id 为 container 的div元素来说, id 为 inner11inner12inner22 的元素 和 上面的两个span 元素 都不是 它的直接子元素, 因为中间隔了 几层。

虽然不是直接子元素, 但是 它们还是在 container 的内部, 可以称之为它 的 后代元素

后代元素也包括了直接子元素, 比如 id 为 layer1layer2 的两个div元素 是 id 为 container 的div元素 的 直接子元素,同时也是后代子元素

如果 元素1元素2 的 直接子元素, CSS Selector 选择子元素的语法是这样的

元素1 > 元素2

中间用一个大于号 (我们可以理解为箭头号)

最终选择的元素是 元素2

也支持更多层级的选择, 比如

元素1 > 元素2 > 元素3 > 元素4

就是选择 元素1 里面的子元素 元素2 里面的子元素 元素3 里面的子元素 元素4 , 最终选择的元素是 元素4

如果 元素1元素2 的 后代元素, CSS Selector 选择后代元素的语法是这样的

元素1   元素2

中间是一个或者多个空格隔开

最终选择的元素是 元素2

也支持更多层级的选择, 比如

元素1   元素2   元素3  元素4

最终选择的元素是 元素4

混合运用

CSS selector的强大之处 就是上面的方法可以混合使用

比如, 我们要选择 下面的 html 中的元素 <span class='copyright'>版权</span>

<div id='bottom'>
<div class='footer1'>
<span class='copyright'>版权</span>
<span class='date'>发布日期:2018-03-03</span>
</div>
<div class='footer2'>
<span>备案号
<a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a>
</span>
</div>
</div>

CSS selector 表达式就是

div.footer > span.copyright

也可以更简单:

.footer > .copyright

当然 这样也是可以的:

.footer  .copyright

因为子元素同时也是后代元素

验证 CSS Selector

那么我们怎么验证 CSS Selector 的语法是否正确选择了我们要选择的元素呢?

当然可以像下面这样,写出Python代码,运行看看,能否操作成功

element = driver.find_element_by_css_selector('#searchtext')
element.input('输入的文本')

如果成功,说明选择元素的语法是正确的。

但是这样做的问题就是:太麻烦了。

当我们进行自动化开发的时候,有大量选择元素的语句,都要这样一个个的验证,就非常耗时间。

由于 CSS Selector 是浏览器直接支持的,可以在浏览器开发者工具栏中验证。

比如我们使用Chrome浏览器打开 http://www.python3.vip/doc/tutorial/python/code/sample1.html

按F12 打开 开发者工具栏

如果我们要验证 下面的表达式

#bottom > .footer2  a

能否选中 这个元素

<a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a>

可以这样做:

点击 Elements 标签后, 同时按 Ctrl 键 和 F 键, 就会出现下图箭头处的 搜索框

Web自动化 - 选择操作元素 2

我们可以在里面输入任何 CSS Selector 表达式 ,如果能选择到元素, 右边的的红色方框里面就会显示出类似 2 of 3 这样的内容。

of 后面的数字表示这样的表达式 总共选择到几个元素

of 前面的数字表示当前黄色高亮显示的是 其中第几个元素

上图中的 1 of 1 就是指 : CSS selector

#bottom > .footer2  a

在当前网页上共选择到 1 个元素, 目前高亮显示的是第1个。

如果我们输入 .plant 就会发现,可以选择到3个元素

Web自动化 - 选择操作元素 2Web自动化 - 选择操作元素 2

访问 白月黑羽教Python 查看更多教程

Web自动化 - 选择操作元素 2的更多相关文章

  1. Web自动化 - 选择操作元素 1

    文章转自 白月黑羽教Python 所有的 UI (用户界面)操作 的自动化,都需要选择界面元素. 选择界面元素就是:先让程序能找到你要操作的界面元素. 先找到元素,才能操作元素. 选择元素的方法 程序 ...

  2. Appium之选择&sol;操作元素

    Appium是如何选择.操作元素的呢? appium自动化  ------  选择界面 元素 操作元素  ------- ① 点击 ② 输入字符 ③ 拖拽 ④ 获取页面元素的各种属性 根据appium ...

  3. Selenium Web 自动化 - 如何找到元素

    Selenium Web 自动化 - 如何找到元素 2016-07-29 1. 什么是元素? 元素:http://www.w3school.com.cn/html/html_elements.asp ...

  4. web自动化 -- js操作(滑动屏幕、修改页面)

    一.selenium对  js  的操作方法 1.先定义  js 操作   或者  定义  目标元素 2.执行  js  操作:  driver.execute_script(js操作)    或者  ...

  5. Selenium Web 自动化

    1 Selenium Web 自动化 - Selenium(Java)环境搭建 2 Selenium Web 自动化 - 如何找到元素 3 Selenium Web 自动化 - Selenium常用A ...

  6. 【Selenium01篇】python&plus;selenium实现Web自动化:搭建环境,Selenium原理,定位元素以及浏览器常规操作!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 二.话不多说,直接开干,开始搭建自动化测试环境 这里以前在 ...

  7. Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战&plus;框架」

    1.web 基础-html.dom 对象.js 基本语法 Dom 对象里面涉及元素定位以及对元素的修改.因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用.得要掌握前端的基本用法.为什么要 ...

  8. 【Selenium03篇】python&plus;selenium实现Web自动化:元素三类等待,多窗口切换,警告框处理,下拉框选择

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第三篇博 ...

  9. 【python&plus;selenium的web自动化】- 元素的常用操作详解&lpar;一&rpar;

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html ​ 本篇主要内容:1.元素 ...

随机推荐

  1. 设计模式--装饰者设计模式(Decorator)

    装饰者模式又叫包装模式. 通过另一个对象来扩展自己的行为,在不破坏类的封装的情况下,实现松耦合,易扩展的效果.   抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口可以给这些对象动态地添加职责 ...

  2. AWT与Swing的区别

    AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口.AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关 ...

  3. storage和memory

    memory:使用的是值传递,默认使用的是memory,传递的是值 storage:引用传递,传过来的是指针,后面一定要加上internal,private pragma solidity ^; co ...

  4. Apache kylin的基础环境

    一.Apache kylin的基础环境 由于Apache kylin上的OLAP(wiki:OLAP)是构建在hadoop生态环境上的,所以hadoop环境的稳定性和健壮性对kylin的稳定运行至关重 ...

  5. thinkphp去掉url中的&period;html后缀

  6. Linux基础学习(1)--Linux系统简介

    第一章——Linux系统简介 1.UNIX和Linux发展史: 1.1 unix发展史: (1)1965年,美国麻省理工学院(MIT).通用电气公司(GE)及AT&T的贝尔实验室联合开发Mul ...

  7. Docker machine(Docker 虚拟机)

    安装docker [root@lianxi ~]# yum -y install docker 启动docker [root@lianxi ~]# systemctl start docker 下载D ...

  8. C&plus;&plus;&sol;C&num;:类Class与结构体Struct的区别

    C++中: 默认的访问控制.继承访问权限不同:struct时public的,class时 private的: 其它基本一样. C#中: struct是值类型,class是引用类型的: struct S ...

  9. Java 注解 (Annotation)

    Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java 注解是从 Java5 开始添加到 Java 的. 注解语法 ...

  10. 菜鸟vimer成长记——第2&period;3章、insert模式

    大部分的Vim 命令都在非插入模式中执行,不过有些功能在插入模式中会更好实现些. 如果没有输入当前文件不存在的新文本的需求时,建议通过其他模式来操作完成. 目的 掌握inser模式下常用操作的语法和概 ...