from selenium import webdriver
Chrome浏览器
driver = webdriver.Chrome()
### 定位页面元素
#### 打开指定页面
使用 `selenium` 定位页面元素的前提是你已经了解基本的页面布局及各种标签含义,当然如果之前没有接触过,现在我也可以带你简单的了解一下。
以我们熟知的 CSDN 为例,我们进入首页,按 **【F12】** 进入开发者工具。红框中显示的就是页面的代码,我们要做的就是从代码中定位获取我们需要的元素。
![在这里插入图片描述](https://img-blog.csdnimg.cn/735a00dcc4b04f529a7f88459e1e75b3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARHJlYW3kuLZLaWxsZXI=,size_20,color_FFFFFF,t_70,g_se,x_16)
想要定位并获取页面中的信息,首先要使用 `webdriver` 打开指定页面,再去定位。
from selenium import webdriver
Chrome浏览器
driver = webdriver.Chrome()
driver.get(‘https://www.csdn.net/’)
执行上面语句后会发现,浏览器打开 CSDN 主页后会马上关闭,想要防止浏览器自动关闭,可以添加下面代码。
不自动关闭浏览器
option = webdriver.ChromeOptions()
option.add_experimental_option(“detach”, True)
将option作为参数添加到Chrome中
driver = webdriver.Chrome(chrome_options=option)
这样将上面的代码组合再打开浏览器就不会自动关闭了。
from selenium import webdriver
不自动关闭浏览器
option = webdriver.ChromeOptions()
option.add_experimental_option(“detach”, True)
注意此处添加了chrome_options参数
driver = webdriver.Chrome(chrome_options=option)
driver.get(‘https://www.csdn.net/’)
下面我们再来看看几种常见的页面元素定位方式。
#### id 定位
标签的 `id` 具有唯一性,就像人的身份证,假设有个 `input` 标签如下。
我们可以通过 `id` 定位到它,由于 `id` 的唯一性,我们可以不用管其他的标签的内容。
driver.find_element_by_id(“toolbar-search-input”)
#### name 定位
`name` 指定标签的名称,在页面中可以不唯一。假设有个 `meta` 标签如下
我们可以使用 `find_element_by_name` 定位到 `meta` 标签。
driver.find_element_by_name(“keywords”)
#### class 定位
`class` 指定标签的类名,在页面中可以不唯一。假设有个 `div` 标签如下
我们可以使用 `find_element_by_class_name` 定位到 `div` 标签。
driver.find_element_by_class_name(“toolbar-search-container”)
#### tag 定位
每个 `tag` 往往用来定义一类功能,所以通过 `tag` 来识别某个元素的成功率很低,每个页面一般都用很多相同的 `tag` ,比如:`\<div\>`、`\<input\>` 等。这里还是用上面的 `div` 作为例子。
我们可以使用 `find_element_by_class_name` 定位到 `div` 标签。
driver.find_element_by_tag_name(“div”)
#### xpath 定位
`xpath` 是一种在 `XML` 文档中定位元素的语言,它拥有多种定位方式,下面通过实例我们看一下它的几种使用方式。
...
根据上面的标签需要定位 最后一行 `input` 标签,以下列出了四种方式,`xpath` 定位的方式多样并不唯一,使用时根据情况进行解析即可。
绝对路径(层级关系)定位
driver.find_element_by_xpath(
“/html/body/div/div/div/div[2]/div/div/input[1]”)
利用元素属性定位
driver.find_element_by_xpath(
“//*[@id=‘toolbar-search-input’]”))
层级+元素属性定位
driver.find_element_by_xpath(
“//div[@id=‘csdn-toolbar’]/div/div/div[2]/div/div/input[1]”)
逻辑运算符定位
driver.find_element_by_xpath(
“//*[@id=‘toolbar-search-input’ and @autocomplete=‘off’]”)
#### css 定位
`CSS` 使用选择器来为页面元素绑定属性,它可以较为灵活的选择控件的任意属性,一般定位速度比 `xpath` 要快,但使用起来略有难度。
`CSS` 选择器常见语法:
| 方法 | 例子 | 描述 |
| --- | --- | --- |
| **.class** | `.toolbar-search-container` | 选择 `class = 'toolbar-search-container'` 的所有元素 |
| **#id** | `#toolbar-search-input` | 选择 `id = 'toolbar-search-input'` 的元素 |
| **\*** | `*` | 选择所有元素 |
| **element** | `input` | 选择所有 `<input\>` 元素 |
| **element>element** | `div>input` | 选择父元素为 `<div\>` 的所有 `<input\>` 元素 |
| **element+element** | `div+input` | 选择同一级中在 `<div\>` 之后的所有 `<input\>` 元素 |
| **[attribute=value]** | `type='text'` | 选择 `type = 'text'` 的所有元素 |
举个简单的例子,同样定位上面实例中的 `input` 标签。
driver.find_element_by_css_selector(‘#toolbar-search-input’)
driver.find_element_by_css_selector(‘html>body>div>div>div>div>div>div>input’)
#### link 定位
`link` 专门用来定位文本链接,假如要定位下面这一标签。
我们使用 `find_element_by_link_text` 并指明标签内全部文本即可定位。
driver.find_element_by_link_text(“加入!每日一练”)
#### partial\_link 定位
`partial_link` 翻译过来就是“部分链接”,对于有些文本很长,这时候就可以只指定部分文本即可定位,同样使用刚才的例子。
我们使用 `find_element_by_partial_link_text` 并指明标签内部分文本进行定位。
driver.find_element_by_partial_link_text(“加入”)
### 浏览器控制
#### 修改浏览器窗口大小
from selenium import webdriver
Chrome浏览器
driver = webdriver.Chrome()
driver.get(‘https://www.csdn.net/’)
设置浏览器浏览器的宽高为:600x800
driver.set_window_size(600, 800)
使用 `maximize_window()` 方法可以实现浏览器全屏显示。
from selenium import webdriver
Chrome浏览器
driver = webdriver.Chrome()
driver.get(‘https://www.csdn.net/’)
设置浏览器浏览器的宽高为:600x800
driver.maximize_window()
#### 浏览器前进&后退
`webdriver` 提供 `back` 和 `forward` 方法来实现页面的后退与前进。下面我们 ①进入CSDN首页,②打开CSDN个人主页,③`back` 返回到CSDN首页,④ `forward` 前进到个人主页。
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
访问CSDN首页
driver.get(‘https://www.csdn.net/’)
sleep(2)
#访问CSDN个人主页
driver.get(‘https://blog.csdn.net/qq_43965708’)
sleep(2)
#返回(后退)到CSDN首页
driver.back()
sleep(2)
#前进到个人主页
driver.forward()
![请添加图片描述](https://img-blog.csdnimg.cn/62deac8da29f4f0d822cb7ed25a2221e.gif)
细心的读者会发现第二次 `get()` 打开新页面时,会在原来的页面打开,而不是在新标签中打开。如果想的话也可以在新的标签页中打开新的链接,但需要更改一下代码,执行 `js` 语句来打开新的标签。
在原页面打开
driver.get(‘https://blog.csdn.net/qq_43965708’)
新标签中打开
js = “window.open(‘https://blog.csdn.net/qq_43965708’)”
driver.execute_script(js)
#### 浏览器刷新
在一些特殊情况下我们可能需要刷新页面来获取最新的页面数据,这时我们可以使用 `refresh()` 来刷新当前页面。
刷新页面
driver.refresh()
#### 浏览器窗口切换
在很多时候我们都需要用到窗口切换,比如:当我们点击注册按钮时,它一般会打开一个新的标签页,但实际上代码并没有切换到最新页面中,这时你如果要定位注册页面的标签就会发现定位不到,这时就需要将实际窗口切换到最新打开的那个窗口。我们先获取当前各个窗口的句柄,这些信息的保存顺序是按照**时间**来的,最新打开的窗口放在数组的**末尾**,这时我们就可以定位到最新打开的那个窗口了。
获取打开的多个窗口句柄
windows = driver.window_handles
切换到当前最新打开的窗口
driver.switch_to.window(windows[-1])
#### 常见操作
webdriver中的常见操作有:
| 方法 | 描述 |
| --- | --- |
| `send_keys()` | 模拟输入指定内容 |
| `clear()` | 清除文本内容 |
| `is_displayed()` | 判断该元素是否可见 |
| `get_attribute()` | 获取标签属性值 |
| `size` | 返回元素的尺寸 |
| `text` | 返回元素文本 |
接下来还是用 CSDN 首页为例,需要用到的就是搜素框和搜索按钮。通过下面的例子就可以气息的了解各个操作的用法了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/9dc1e74f9cdf4fc99463d98737520104.png)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(‘https://www.csdn.net/’)
sleep(2)
定位搜索输入框
text_label = driver.find_element_by_xpath(‘//*[@id=“toolbar-search-input”]’)
在搜索框中输入 Dream丶Killer
text_label.send_keys(‘Dream丶Killer’)
sleep(2)
清除搜索框中的内容
text_label.clear()
输出搜索框元素是否可见
print(text_label.is_displayed())
输出placeholder的值
print(text_label.get_attribute(‘placeholder’))
定位搜索按钮
button = driver.find_element_by_xpath(‘//*[@id=“toolbar-search-button”]/span’)
输出按钮的大小
print(button.size)
输出按钮上的文本
print(button.text)
‘’‘输出内容
True
python面试100问
{‘height’: 32, ‘width’: 28}
搜索
‘’’
![请添加图片描述](https://img-blog.csdnimg.cn/626604e9e51e473fa017107c14af7290.gif)
### 鼠标控制
在webdriver 中,鼠标操作都封装在ActionChains类中,常见方法如下:
| 方法 | 描述 |
| --- | --- |
| `click()` | 单击左键 |
| `context_click()` | 单击右键 |
| `double_click()` | 双击 |
| `drag_and_drop()` | 拖动 |
| `move_to_element()` | 鼠标悬停 |
| `perform()` | 执行所有ActionChains中存储的动作 |
#### 单击左键
模拟完成单击鼠标左键的操作,一般点击进入子页面等会用到,左键不需要用到ActionChains。
**一、Python所有方向的学习路线**
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
![img](https://img-blog.csdnimg.cn/1d40facda2b84990b8e1743f5487d455.png)
![img](https://img-blog.csdnimg.cn/0fc11d4a31bd431dbf124f67f1749046.png)
**二、Python必备开发工具**
工具都帮大家整理好了,安装就可直接上手!![img](https://img-blog.csdnimg.cn/ff266f529c6a46c4bc28e5f895dec647.gif#pic_center)
**三、最新Python学习笔记**
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
![img](https://img-blog.csdnimg.cn/6d414e9f494742db8bcc3fa312200539.png)
**四、Python视频合集**
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
![img](https://img-blog.csdnimg.cn/a806d9b941c645858c61d161aec43789.png)
**五、实战案例**
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。![img](https://img-blog.csdnimg.cn/a353983317b14d3c8856824a0d6186c1.png)
**六、面试宝典**
![在这里插入图片描述](https://img-blog.csdnimg.cn/97c454a3e5b4439b8600b50011cc8fe4.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/111f5462e7df433b981dc2430bb9ad39.png)
###### **简历模板**![在这里插入图片描述](https://img-blog.csdnimg.cn/646863996ac44da8af500c049bb72fbd.png#pic_center)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**