当前位置:   article > 正文

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

import selenium

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
谷歌浏览器webdriver下载地址3
谷歌浏览器下载之前先在地址栏输入chrome://version看一下自己的版本再下载对应的
2.启动浏览器:

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

同理:

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

如果需要后台运行:

option = webdriver.ChromeOptions()
option.add_argument('--headless')
driver = webdriver.Chrome(executable_path="webdriver\chrome/chromedriver",chrome_options=option)
  • 1
  • 2
  • 3

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)
  • 1
  • 2

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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()

# 控制浏览器滚动

scol_len = random.randrange(0, 10000, 1000)
js = "var q=document.documentElement.scrollTop=%s" % scol_len
driver.execute_script(js)


driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

8.鼠标操作

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

from selenium.webdriver import ActionChains
  • 1

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

ActionChains(driver)
  • 1

调用 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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

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

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

text:获取搜索条目的文本信息。
  • 1
  • 2
  • 3
  • 4
  • 5
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

运行结果如下:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/629305
推荐阅读
相关标签
  

闽ICP备14008679号