Python 结合 Selenium 网页自动化【看过来】

一、ChromeDriver下载与安装

什么是ChromeDriver:

ChromeDriver是一个用于自动化控制和与Google Chrome浏览器进行交互的驱动程序。它是Chrome浏览器的一个开源项目,由Chrome开发团队开发和维护。

ChromeDriver允许开发人员使用编程语言(如Python、Java、C#等)编写脚本,以控制Chrome浏览器的行为。通过ChromeDriver,您可以模拟用户在浏览器中执行的各种操作,例如打开网页、填写表单、点击按钮、滚动页面等。这使得自动化测试和网页数据爬取变得更加简单和高效。

ChromeDriver与特定版本的Chrome浏览器相对应,因此在使用ChromeDriver之前,您需要确保安装与您当前使用的Chrome浏览器版本相匹配的ChromeDriver版本。这样可以确保ChromeDriver能够与浏览器正确地进行通信和控制。

ChromeDriver在自动化测试、网页爬虫、网页截图、性能测试等领域被广泛使用。它为开发人员提供了一种方便的方式来控制和管理Chrome浏览器,以实现各种自动化任务。

需要注意的是,安装和使用ChromeDriver需要一定的技术知识和编程经验。但一旦掌握了基本的使用方法,您就可以充分利用ChromeDriver的功能,提高开发和测试效率。

下载与安装:

查看自己Chrome浏览器版本:

下载对应版本的ChromeDriver

淘宝镜像:https://registry.npmmirror.com/binary.html?path=chromedriver/ 
官方镜像:https://sites.google.com/a/chromium.org/chromedriver/downloads

安装 chromeDriver

环境变量配置

二、selenium-python安装

pip install -U selenium 
-U 就是指定下载最新版本的selenium

控制浏览器

from selenium import webdriver
import time

# 打开浏览器
driver = webdriver.Chrome()
# 访问百度首页
driver.get('https://www.baidu.com/')
# 睡眠10s
time.sleep(10)
# 退出
driver.quit()

浏览器出现 “chrome正受到自动测试软件的控制”

三、浏览器基本操作

1.打开指定的网址

# 访问百度首页 
driver.get('https://www.baidu.com/')

2.获取当前页面的url

currentUrl = driver.current_url 
print(currentUrl)

3.返回按钮 相对于浏览器后退的 ←

driver.back()

4. 前进按钮 相对于浏览器前进的 →

driver.forward()

5. 刷新页面 类似于按下F5

driver.refresh()

6. 获取当前页面的title

title = driver.title

7. 窗口大小操作

# 常用的窗口操作有设置窗口大小、最大化窗口、最小化窗口、全屏窗口
#  7.1 设置窗口大小
driver.set_window_size(1920,1080)
#  7.2 最大化窗口
driver.maximize_window()
#  7.3 最小化窗口
driver.minimize_window()
#  7.4 全屏窗口 类似于按下F11
driver.fullscreen_window()

8. 退出

driver.quit()

四、元素常用操作

1. send_keys()

# send_keys()方法用于给输入框输入内容。
# 访问百度首页
driver.get('https://www.baidu.com/')
# 定位搜索框
element = driver.find_element(By.ID,'kw')
# 输入值
element.send_keys('csdn官网')

2. click()

click()方法模拟鼠标左键单击操作。
# 定位搜索框
button = driver.find_element(By.ID,'su')
# 点击搜索按钮
button.click()

3. text()

text用于获取元素可见文本,常用于获取指定元素显示的文本内容以对比结果是否符合预期。
element = driver.find_element(By.CSS_SELECTOR, '.title-content-title')
print(element.text)    # 获取文本内容并打印

4. clear()

clear()方法用于清空输入框中的内容,在测试中常用于修改表单场景。
# 定位搜索框
element = driver.find_element(By.ID,'kw')
# 输入值
element.send_keys('csdn官网')
time.sleep(2)
element.clear()

5. get_attribute()

get_attribute()用于获取元素的属性值,常用于修改表单时获取后台反显内容。
# 定位搜索框
element = driver.find_element(By.ID,'kw')
# 输入值
element.send_keys('csdn官网')
print(element.get_attribute('name'))
print(element.get_attribute('value'))

6.is_enabled()

is_enabled()用于判断元素是否启用编辑状态,如果元素是可编辑的,则返回true,如果元素不可编辑,则返回false。
不可编辑的元素进行输入内容或选择内容将不成功
element.is_enabled()

7.is_displayed()

is_displayed()用于判断元素是否显示在页面上,有些元素在DOM中能够找到,但不一定显示在页面上,所谓显示在页面上,即可见,有宽度的,如果元素可见,返回true,
如果不可见,返回false,如果使用click()操作不可见元素时,将抛出异常
element.is_displayed()

8.isSelected()

isSelected()用于判断单选框或复选框的状态是否被选中,如果选中返回true,否则返回false
element.isSelected()

9.submit()

submit()方法用于提交一些没有按钮可点击的输入框,比如我们在进行一些搜索时,输入文字后没有点击搜索的按钮,而是直接敲击enter键完成搜索,则可以使用submit()方法模拟此操作
element.submit()

10.find_element 和 find_elements

定位单个元素:find_element(by模块,'属性值')

定位多个元素:find_elements(by模块,'属性值')

find_element方法和find_elements方法的区别:

find_element只返回一个选中的标签,即有多个满足条件的标签值返回第一个。

find_elements返回的是一个列表,可以满足多个满足条件的标签,注意返回的是列表,让要对其中的标签进行操作需要指定列表元素的下标。

异常:

五、定位元素

driver.find_element_by_id()                 # 通过id属性定位(唯一);常用
driver.find_element_by_xpath()              # 通过xpath表达式定位;常用
driver.find_element_by_class_name()         # 通过类名定位;常用
driver.find_element_by_name()               # 通过name属性定位
driver.find_element_by_tag_name()           # 通过标签名定位
driver.find_element_by_css_selector()       # 通过css选择器定位
driver.find_element_by_link_text()          # 通过链接标签的text类容定位
driver.find_element_by_partial_link_text()  # 通过匹配链接标签的text类容定位

定位(By模块定位)

selenium是通过模拟人对浏览器进行操作,既然是模拟人进行操作,那么就需要选择对页面上的哪一个标签进行操作。例如想让Selenium对页面上的登录按钮进行点击,就需要先让Selenium定位到这个按钮,在进行点击操作。

selenium的by模块提供了八种定位方式:

通过from selenium.webdriver.common.by import By导入By模块。

from selenium.webdriver.common.by import By

By.ID                     # 标签的id属性值进行定位使用
By.NAME                   # 通过标签的name属性值进行定位使用
By.CLASS_NAME             # 通过标签的class属性值进行定位使用
By.LINK_TEXT              # 通过标签的标签中文本值进行定位使用
By.PARTIAL_LINK_TEXT      # 通过标签的标签中的部分文本值进行定位使用
By.TAG_NAME               # 通过标签的标签名进行定位使用
By.XPATH                  # 通过标签的xpath路径进行定位使用
By.CSS_SELECTOR           # 通过标签的css选择器进行定位使用

1.通过ID属性定位: By.ID

通过开发者模式选择可知 百度首页的input框 id为 kw

# 定位搜索框
elment = driver.find_element(By.ID,'kw')
# 输入值
elment.send_keys('csdn官网')

运行后可出现如下效果:

由此我们可以 通过find_element找寻到搜索按钮的 id

# 定位搜索框
button = driver.find_element(By.ID,'su')
# 点击搜索按钮
button.click()

完整例子代码如下:

1.打开浏览器

2.访问百度首页

3.根据ID定位搜索框

4.在输入框输入“csdn官网”

5.根据ID定位搜索按钮

6.点击触发搜索按钮

from selenium import webdriver
from selenium.webdriver.common.by import By

# 打开浏览器
driver = webdriver.Chrome()
# 访问百度首页
driver.get('https://www.baidu.com/')

# 定位搜索框
elment = driver.find_element(By.ID,'kw')
# 输入值
elment.send_keys('csdn官网')
# 定位搜索框
button = driver.find_element(By.ID,'su')
# 点击搜索按钮
button.click()

# 退出
driver.quit()

2.通过name属性定位: By.NAME

通过开发者模式选择可知 百度首页的input框 name为 wd

# 定位搜索框
elment = driver.find_element(By.NAME,'wd')

3.通过class_name属性定位: By.CLASS_NAME

通过开发者模式选择可知 百度首页的input框 name为 wd

# 定位搜索框
elment = driver.find_element(By.NAME,'s_ipt')
# 不能使用复核class_name

4.通过tag name定位: By.TAG_NAME

#tag name,即元素标签名称,如input、p、a、button、span等
elment = driver.find_element(By.TAG_NAME,'input')

5.通过link text定位: By.LINK_TEXT

#此定位方式使用完整匹配可见元素进行匹配,仅适用于链接元素定位.
#即<a href="www.xxx.com“>xxx这样的标签元素,其他元素不能使用.
#如百度首页的新闻、贴吧等链接元素可使用此方式进行定位.
elment = driver.find_element(By.LINK_TEXT,'新闻')

6.通过partial link text定位: By.PARTIAL_LINK_TEXT

#此定位方式于link text一样,都只能作用于链接元素,也使用可见文本进行匹配.
#不同之处在于,link text表示可见文本必须于指定的文本完全一致,才能匹配成功.
#而partial link text只要可见文本中包含指定的文本,则匹配成功.
elment = driver.find_element(By.PARTIAL_LINK_TEXT,'闻')

7.通过css selector定位: By.CSS_SELECTOR

css定位:

选择器

例子

描述

.class

.home

选择class="home" 的所有元素

#id

#kw

选择id=“kw”的所有元素

element

p(html语法中的标签)

选择所有

元素

element,element

div,p

选择所有

元素 与

元素

element element

div p

选择元素内部的所有

元素

element > element

div > p

选择父元素为的所有

元素

element + element

div + p

选择紧接在元素之后的所有

元素

[attribute]

[target]

选择所有带target属性的所有元素

[attribute=value]

[target=blank]

选择target=‘blank’的所有元素

:nth-child(n)

p:nth-child(2)

选择属于其父元素的第二个子元素的每个

元素

element~element

p~ui

选择前面有

元素的每个元素

可以打开浏览器F12 按CTRL+F 唤醒搜索框,按照语法搜索元素,符合的计数会出现在末尾,切换会对元素展现高亮

操作示例:

elment = driver.find_element(By.CSS_SELECTOR,'#kw')     #ID选择器
elment = driver.find_element(By.CSS_SELECTOR,'.s_ipt')  #.class选择器
elment = driver.find_element(By.CSS_SELECTOR,'div')       #element标签选择器
elment = driver.find_element(By.CSS_SELECTOR,'div,span')  # 逗号“,”同时选择多个
elment = driver.find_element(By.CSS_SELECTOR,'div span')  # 空格 选择指定元素(div) 内部的(跨层级) 某个(span)元素
elment = driver.find_element(By.CSS_SELECTOR,'div>span')  # > 选择指定(span)元素 父元素为某个(div)元素
elment = driver.find_element(By.CSS_SELECTOR,'div+span')  # > 选择紧接在(div)元素 后的某个(span)元素
elment = driver.find_element(By.CSS_SELECTOR,'[href]')    # 选择有href属性的所有元素
elment = driver.find_element(By.CSS_SELECTOR,'input[name="wd"]')  # 选择属性name 为 wd 的所有元素
elment = driver.find_element(By.CSS_SELECTOR,'p:nth-child(2)')  # 选择属于其父元素的第二个子元素的<p>元素
elment = driver.find_element(By.CSS_SELECTOR,'p:nth-child(2)')  # 选择属于其父元素的第二个子元素的<p>元素
elment = driver.find_element(By.CSS_SELECTOR,'p~ui')  # 选择前面有<p>元素的每个<ui>元素

8.通过xpath定位: By.XPATH

Xpath定位与css定位方式类似,XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。


xpath相对路径:
1.查找页面根元素
//
2.查找页面所有input元素
//input
3.查找页面上第N个form元素
//form[1]
4.查找页面上指定第N个form元素内的直接子input元素(只包括form元素的下一级input元素,使用绝对路径表示,单/号):
//form[1]/input
5.查找页面上指定第N个form元素内的直接子input元素(只要包括在form元素下的input元素都算,使用绝对路径表示,双//号):
//form[1]//input
6.查找页面上id为loginForm的form元素:
//form[@id='loginForm']
7.查找页面上具有name属性为username的input元素:
//form[@name='username']
8.查找页面上id为loginForm的form元素下的第一个input元素:
//form[@id='loginForm']/input[1]
9.查找页面具有name属性为contiune并且type属性为button的input元素:
//input[@name='continue'][@type='button']
10.查找页面上id为loginForm的form元素下第4个input元素:
//form[@id='loginForm']/input[4]


xpath绝对路径:


Xpath定位模糊匹配:
1.contains关键字:
//a[contains(@href, ‘logout’)]          #寻找页面中href属性值包含有logout这个单词的所有a元素
2.start-with关键字:
//a[starts-with(@name, ‘start)])        #寻找name属性以start开头的a元素。其中@后面的name可以替换成元素的任意其他属性
3.text关键字:
//*[text()=’确定’]

六、三种等待

强制等待:

强制等待,线程休眠一段时间.

time.sleep(5)

隐式等待:

设置一个等待时间,轮训查找元素是否出现,如果没有出现则抛出异常。

dirver.implicitly_wait(1)
隐式等待是全局的等待,所有的element都生效,特殊场景下若element1需要等待10s,element2需要等待15s,那隐式等待设置3s是不可行的

显式等待:

在代码定义等待条件,当条件发生时才继续执行代码

WebDriverWait’配合until()和until_not()方法,根据判断条件进行等待
程序每隔一段时间(默认为0.5秒)进行条件判断,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最大时间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值