python-selenium开发(1:基础用法)

selenium 是一个 web 的自动化测试工具,它可以通过id/css/class/xpath等定位到具体的网页元素并进行一系列操作,从而实现自动化测试!

安装:pip install selenium

使用:
1.import selenium
2.from selenium import xxx

1.安装webdriver
使用selenium首先需要安装webdriver,来连接到浏览器,并进行交互,从而实现脚本控制浏览器!
我在谷歌浏览器和火狐浏览器都装了:

火狐浏览器webdriver下载地址
谷歌浏览器webdriver下载地址1
谷歌浏览器webdriver下载地址2
谷歌浏览器下载之前先在地址栏输入**chrome://version/**看一下自己的版本再下载对应的
2.启动浏览器:

from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')

同理:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')

3.定位网页元素
网页元素的定位是自动化测试的核心,也是最容易踩坑的地方,这个地方需要格外注意一下!通常的定位网页元素的方法有以下几种:

1.id定位:find_element_by_id()
2.name定位:find_element_by_name()
3.class定位:find_element_by_class_name()
4.link定位:find_element_by_link_text()
5.partial link text定位:find_element_by_partial_link_text()
6.tag定位:find_element_by_tag_name()
7.xpath定位:find_element_by_xpath()
8.css定位:find_element_by_css_selector()

有的class name是有多个class组合的复合类,中间以空格隔开,使用find_element_by_class_name()就会定位失败,这时可以用"."代替空格。
还可以用find_elements_by_xx定位一组元素

4.selenium设置等待时间
有的时候网页内容在缓存或者网页切换延迟等,会导致下一次定位元素失败,因此需要设置等待时间。
1.强制等待:

import time
time.sleep(x)

2.显示等待
显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver, 5,0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')
driver.quit()

WebDriverWait类是由WebDirver
提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5,
ignored_exceptions=None)

  1. driver :浏览器驱动。
  2. timeout :最长超时时间,默认以秒为单位。
  3. poll_frequency :检测的间隔(步长)时间,默认为0.5s。
  4. ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。

WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。
1.until(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。
2. until_not(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。 在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

3.隐式等待

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import ctime
driver = webdriver.Firefox()
# 设置隐式等待为10秒
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
try:
    print(ctime())  driver.find_element_by_id("kw22").send_keys('selenium')
except NoSuchElementException as e:
    print(e)
finally:
    print(ctime())
    driver.quit()

WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。
implicitly_wait() 默认参数的单位为秒,本例中设置等待时长为10秒。
首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。
其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。
假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。
隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。

5.控制浏览器操作

函数 作用
driver.set_windows_size() 设置浏览器大小 (参数为像素点)
driver.back() 回退页面
driver.forward() 前进页面
driver.refresh() 刷新页面
driver.maximize_window() 页面最大化
driver.minimize_window() 页面最小化
from selenium import webdriver
driver = webdriver.Firefox()

#访问百度首页
first_url= 'http://www.baidu.com'
print("now access %s" %(first_url))
driver.get(first_url)
driver.maximize_window()
#访问新闻页面
second_url='http://news.baidu.com'
print("now access %s" %(second_url))
driver.get(second_url)

#返回(后退)到百度首页
print("back to  %s "%(first_url))
driver.back()

#前进到新闻页
print("forward to  %s"%(second_url))
driver.forward()

driver.quit()

7.操作网页元素

方法 作用
click() 单击元素
clear() 清除文本(如果可以)
send_keys (value) 模拟按键操作
get_attribute(name) 获取元素属性值
is_displayed() 设置该元素是否用户可见
submit() 提交表单
size 返回元素的尺寸
location 返回元素坐标
text 获取元素的文本
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#刷新浏览器
browser.refresh()

#提交表单
search_text = driver.find_element_by_id('kw')
search_text.send_keys('selenium')
search_text.submit()

# 获得输入框的尺寸
size = driver.find_element_by_id('kw').size
print(size)
loca=driver.find_element_by_id('kw').location
print(loca)

more_x = loca.get('x') #元素的x坐标
more_y = loca.get('y') #元素的y坐标
more_w = size.get('width')  #元素的宽
more_h = size.get('height') #元素的高

# 返回百度页面底部备案信息
text = driver.find_element_by_id("cp").text
print(text)

# 返回元素的属性值, 可以是 id、 name、 type 或其他任意属性
attribute = driver.find_element_by_id("kw").get_attribute('type')
print(attribute)

# 返回元素的结果是否可见, 返回结果为 True 或 False
result = driver.find_element_by_id("kw").is_displayed()
print(result)

driver.quit()

8.鼠标操作

在 WebDriver 中, 将关于鼠标操作的方法封装在 ActionChains 类提供。

from selenium.webdriver import ActionChains

导入提供鼠标操作的 ActionChains 类。

ActionChains(driver)

调用 ActionChains()类, 将浏览器驱动 driver 作为参数传入。
常用函数:

函数 作用
double_click() 双击
drag_and_drop(source, target) 拖拽到某个元素然后松开
move_to_element(above) 鼠标移动到某个元素上悬停
context_click() 模拟鼠标右键操作, 在调用时需要指定元素定位(右击)
perform() 执行所有 ActionChains 中存储的行为, 可以理解成是对整个操作的提交动作。
click(on_element=None) 单击鼠标左键
move_by_offset(xoffset, yoffset) 鼠标从当前位置移动到某个坐标
drag_and_drop_by_offset(source, xoffset, yoffset) 拖拽到某个坐标然后松开
key_down(value, element=None) 按下某个键盘上的键
key_up(value, element=None) 松开某个键
release(on_element=None) 在某个元素位置松开鼠标左键
send_keys_to_element(element, *keys_to_send) 发送某个键到指定元素
move_to_element_with_offset(to_element, xoffset, yoffset) 移动到距某个元素(左上角坐标)多少距离的位置
from selenium import webdriver
# 引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")

# 定位到要悬停的元素
above = driver.find_element_by_link_text("设置")
# 对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(above).perform()

9.键盘操作

函数 作用
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘 F1
from selenium import webdriver
# 引入 Keys 模块
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

# 输入框输入内容
driver.find_element_by_id("kw").send_keys("seleniumm")

# 删除多输入的一个 m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)


# 输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys("教程")

# ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')

# ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')

# ctrl+v 粘贴内容到输入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')

# 通过回车键来代替单击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
driver.quit()

10.获取断言信息
拿实际结果与预期进行比较,这个比较的称之为断言,通常通过获取title 、URL和text等信息进行断言。

title:用于获得当前页面的标题。

current_url:用户获得当前页面的URL。

text:获取搜索条目的文本信息。
from selenium import webdriver
from time import sleep


driver = webdriver.Firefox()
driver.get("https://www.baidu.com")

print('Before search================')

# 打印当前页面title
title = driver.title
print(title)

# 打印当前页面URL
now_url = driver.current_url
print(now_url)

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)

print('After search================')

# 再次打印当前页面title
title = driver.title
print(title)

# 打印当前页面URL
now_url = driver.current_url
print(now_url)

# 获取结果数目
user = driver.find_element_by_class_name('nums').text
print(user)

driver.quit()

运行结果如下:

Before search================
百度一下,你就知道
https://www.baidu.com/
After search================
selenium_百度搜索
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx...
搜索工具
百度为您找到相关结果约5,380,000

猜你喜欢

转载自blog.csdn.net/liulanba/article/details/115294919
今日推荐