python+selenium学习

学习网站:白月黑羽

python编辑工具vscode:插件

selenium安装:win+r 输入pip install selenium

自动化测试还需要一个浏览器驱动:chromedriver,可以官网下载: ChromeDriver - WebDriver for Chrome - Downloads

下面是编辑测试:

1. 导入库并创建一个“遥控器”wd

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

wd = webdriver.Chrome(service=Service(r'D:\tools\chromedriver.exe'))

2. get方法打开一个网站

wd.get('https://www.baidu.com')

selenium定位元素的方法

定位单个元素:

 定位一组元素:

1.根据HTML页面中id属性来选择元素

选择元素前需要导入一个库:上面这些方法在已经不建议使用了,而是另外一种写法,其实都是大同小异。

 

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

# 创建 WebDriver 对象
wd = webdriver.Chrome()

# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://www.bing.com')

# 根据id选择元素,返回的就是该元素对应的WebElement对象
element = wd.find_element(By.ID, 'sb_form_q')

# 通过该 WebElement对象,就可以对页面元素进行操作了
# 比如输入字符串到 这个 输入框里
element.send_keys('csdn\n')

2,根据class_name来选择元素

   通过 WebElement 对象的 text属性 可以获取该元素 在网页中的文本内容,所以下面的代码,可以打印出 element 对应 网页元素的文本

Selenium 的 Webdriver 对象 有个方法叫 implicitly_wait ,可以称之为 隐式等待 ,或者 全局等待 。该方法接受一个参数, 用来指定 最大等待时长。

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

#创建一个webdriver对象
wd = webdriver.Chrome()
#设置最大等待时间:find_element时最长等待时间
wd.implicitly_wait(5)

#访问B站
wd.get('https://www.bilibili.com/')

#根据class_name来选择元素:选择的是一个输入框
element = wd.find_element(By.CLASS_NAME, 'nav-search-input')

#向输入框中输入‘考研’   ‘\n’相当于是回车的意思
element.send_keys('考研\n')

#搜索也可以这样:定位搜索图标+点击
search = wd.find_element(By.CLASS_NAME, 'nav-search-btn')
search.click()

3,根据tag名选择元素(选出来的可能会有多个)

我们可以通过指定 参数为 By.TAG_NAME ,选择所有的tag名为 div的元素,返回的是一个列表

4. 根据name值来定位元素:

和a标签有关的定位 

 link text定位:使用a标签对之间的文本信息做定位。——>find_element_by_link_text()(常用)

partial link text定位:使用a标签对之间的部分文本信息做定位。——find_element_by_partial_link_text() (少用)

xpath定位

这2个元素定位方法更强大xpath,css_select(几乎可以准确定位任何元素)更复杂(有门槛)根据元素的xpath路径来完成定位。需要懂xpath语法。——find_element_by_xpath(“xpath路径”)

css定位

根据元素的CSS选择器来完成定位。需要懂CSS选择器。—find_element_by_css_selector(“CSS选择器”)

 

获取元素的属性

通过wd.find_element对象的方法:get_attribute('class')来获取对象的属性值

element = wd.find_element(By.ID, 'input_name')
print(element.get_attribute('class'))
from selenium import webdriver
from selenium.webdriver.common.by import By

wd = webdriver.Chrome()
wd.implicitly_wait(10)

wd.get('https://www.bilibili.com/')

#CSS_SELECTOR 选择class属性:在前面加上一个‘.’
# element = wd.find_element(By.CSS_SELECTOR, '.nav-search-input')
# element.send_keys('考研\n')

elements = wd.find_elements(By.CSS_SELECTOR, '.channel-link')
for element in elements:
    print(element.get_attribute('href'))
wd.quit()

获取整个元素对应的HTML信息

# 根据属性选择元素
element = wd.find_element(By.CSS_SELECTOR, '[href="http://www.miitbeian.gov.cn"]')

# 打印出元素对应的html
print(element.get_attribute('outerHTML'))
print(element.get_attribute('innerHTML'))
wd.quit()


CSS Selector选择web页面的元素

CSS是用来对web页面进行渲染的,因此必然涉及到web页面上某一元素的选择,比如页面某些内容显示效果,可以讲 CSS Selector 语法 天生就是浏览器用来选择元素的,selenium自然就可以使用它用在自动化中,去选择要操作的元素了。

选择单个元素的方法:

find_element(By.CSS_SELECTOR, CSS Selector参数)

选择多个元素的方法:返回一个列表

find_elements(By.CSS_SELECTOR, CSS Selector参数)

选择方法和之前通过ID,CLASS_NAME,TAG_NAME 是一样的

CSS_SELECTOR方法选择class:在1处那加个‘.’

#CSS_SELECTOR 选择class属性:在前面加上一个‘.’
element = wd.find_element(By.CSS_SELECTOR, '.nav-search-input' ) #----1
element.send_keys('考研\n')

elements = wd.find_elements(By.CSS_SELECTOR, '.channel-link')
for element in elements:
    print(element.get_attribute('href'))
wd.quit()

CSS_SELECTOR方法选择ID:在前面加个‘#’

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

#创建一个webdriver对象
wd = webdriver.Chrome()
wd.implicitly_wait(10)

wd.get('https://www.bing.com')

#使用CSS_SELECTOR根据ID选择元素:在前面加个‘#’
element = wd.find_element(By.CSS_SELECTOR, '#sb_form_q')
element.send_keys('matepad11\n')

CSS_SELECTOR方法选择TAG名:直接在‘’中输入tag标签名字

elements = wd.find_elements(By.CSS_SELECTOR, 'div')
<a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a>

 css 选择器支持通过任何属性来选择元素,语法是用一个方括号 [] 。

比如要选择上面的a元素,就可以使用 [href="http://www.miitbeian.gov.cn"] 。

这个表达式的意思是,选择 属性href值为 http://www.miitbeian.gov.cn 的元素。

要选择a节点,里面的href属性包含了 miitbeian 字符串,就可以这样写

a[href*="miitbeian"]

要选择a节点,里面的href属性以 http 开头 ,就可以这样写

a[href^="http"]

要选择a节点,里面的href属性以 gov.cn 结尾 ,就可以这样写

a[href$="gov.cn"]

CSS 选择器 可以指定 选择的元素要 同时具有多个属性的限制,像这样

 div[class=misc][ctype=gun]

CSS_SELECTOR可以使用次序筛选:父节点的第几个

span:nth-child(2)  span元素并且是在父节点的第二个位置

p:nth-last-child(1)  P元素并且是倒数第一个

里面可以是数字也可以是“odd”奇数;“even”偶数

***选择第一个span类型的元素: span:nth-of-type(1)       span:nth-last-of-type(1)

#CSS_SELECTOR选择: nth-child(n) 

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

#创建一个webdriver对象
wd = webdriver.Chrome()
wd.implicitly_wait(5)

#访问网站
wd.get('https://cdn2.byhy.net/files/selenium/sample1b.html')

spans = wd.find_elements(By.CSS_SELECTOR, 'span:nth-child(2)')
for span in spans:
    print(span.get_attribute('innerHTML'))
wd.quit()

Frame窗口切换

一个HTML文档中可能内嵌其他的HTML文档,但是CSS_SELECTOR选择时只是针对当前的HTML文档,因此需要进行窗口的切换:

切入:wd.switch_to.frame(name  or  id)

切出:wd.switch_to.default_content()

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

wd = webdriver.Chrome()

wd.get('https://cdn2.byhy.net/files/selenium/sample2.html')


# 先根据name属性值 'innerFrame',切换到iframe中
wd.switch_to.frame('innerFrame')

# 根据 class name 选择元素,返回的是 一个列表
elements = wd.find_elements(By.CLASS_NAME, 'plant')

for element in elements:
    print(element.text)

# 切换回 最外部的 HTML 中
wd.switch_to.default_content()

# 然后再 选择操作 外部的 HTML 中 的元素
wd.find_element_by_id('outerbutton').click()

wd.quit()

 窗口的切换

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

wd = webdriver.Chrome()
wd.implicitly_wait(5)

wd.get('https://cdn2.byhy.net/files/selenium/sample3.html')

# 点击打开新窗口的链接
link = wd.find_element(By.TAG_NAME, "a")
link.click()

# wd.title属性是当前窗口的标题栏 文本
print(wd.title)
mainHandle = wd.current_window_handle
for handle in wd.window_handles:
    wd.switch_to.window(handle)
    if 'Bing' in wd.title:
        break
print(wd.title)
wd.switch_to.window(mainHandle)
print(wd.title)
wd.quit()

选择框

常见的选择框包括: radio框、checkbox框、select框

radio框选择选项,直接用WebElement的click方法,模拟用户点击就可以了。

对checkbox进行选择,也是直接用 WebElement 的 click 方法,模拟用户点击选择。

需要注意的是,要选中checkbox的一个选项,必须 先获取当前该复选框的状态 ,如果该选项已经勾选了,就不能再点击。否则反而会取消选择。

# 先把 已经选中的选项全部点击一下
elements = wd.find_elements(By.CSS_SELECTOR, 
  '#s_checkbox input[checked="checked"]')

for element in elements:
    element.click()

select框 则是一个新的select标签,大家可以对照浏览器网页内容查看一下,对于Select 选择框, Selenium 专门提供了一个 select类 进行操作。

鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽:ActionChains

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

driver = webdriver.Chrome()
driver.implicitly_wait(5)

driver.get('https://www.baidu.com/')

from selenium.webdriver.common.action_chains import ActionChains

ac = ActionChains(driver)

# 鼠标移动到 元素上
ac.move_to_element(
    driver.find_element(By.CSS_SELECTOR, '[name="tj_briicon"]')
).perform()

窗口冻结

 setTimeout(function(){debugger}, 5000)

 debugger可以冻结页面,settimeout是设定多长时间后单位ms

Alert 弹出框,目的就是显示通知信息,只需用户看完信息后,点击 OK(确定) 就可以了。

driver.switch_to.alert.accept()

driver.switch_to.alert.text  获取通知内容,字符串类型

driver.switch_to.alert.dismiss()  取消对话框

Prompt 弹出框 是需要用户输入一些信息,提交上去。

driver.switch_to.alert.send_keys()

# --- prompt ---
driver.find_element(By.ID, 'b3').click()

# 获取 alert 对象
alert = driver.switch_to.alert

# 打印 弹出框 提示信息
print(alert.text)

# 输入信息,并且点击 OK 按钮 提交
alert.send_keys('web自动化 - selenium')
alert.accept()

窗口的大小:

driver.get_window_size()

改变窗口大小

driver.set_window_size(x, y)

窗口标题+URL 

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(4)

driver.get("https://www.163.com")

print(driver.title)
print(driver.current_url)
driver.quit()

  截屏

使用 WebDriver 的 get_screenshot_as_file方法来截屏并保存为图片

from selenium import  webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(5)

# 打开网站
driver.get('https://www.baidu.com/')

# 截屏保存为图片文件
driver.get_screenshot_as_file('1.png')
#有一点不好,它不支持相对路径+文件名的方式,
Saves a screenshot of the current window to a PNG image file. Returns
           False if there is any IOError, else returns True. Use full paths in
           your filename.

手机模式

from selenium import webdriver

mobile_emulation = { "deviceName": "Nexus 5" }

chrome_options = webdriver.ChromeOptions()

chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)

driver = webdriver.Chrome( desired_capabilities = chrome_options.to_capabilities())

driver.get('http://www.baidu.com')

input()
driver.quit()

上传文件

网站页面上传文件的功能,是通过 type 属性 为 file 的 HTML input 元素实现的。

<input type="file" multiple="multiple">

# 先定位到上传文件的 input 元素
ele = wd.find_element(By.CSS_SELECTOR, 'input[type=file]')

# 再调用 WebElement 对象的 send_keys 方法
ele.send_keys(r'h:\g02.png')

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值