Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
开始使用
在python3中使用selenium,首先要cmd -> pip3 install selenium 安装selenium库,然后下载相应浏览器(ie,chrome等)的webdrive文件(例:chromedriver.exe),放在某个文件夹里(如D:\webdrive),再将该文件夹的路径加入到环境变量的path里。
如果不添加webdriver的文件路径到环境变量,也可以在实例化浏览器时传入webdriver文件路径的参数。
通过网站的url,我们可以获取一个浏览器实例(旧方法,建议不要使用这种方法):
from selenium import webdriver
# 某个网址
url = "http://www.xxxxxx.com"
browser = webdriver.Chrome(r'D:\chromedriver.exe')# 没有添加path时
browser1 = webdriver.Chrome()# 已经添加path时
browser.get(url)
通过网站的url,我们可以获取一个浏览器实例(20211103新方法,建议使用):
from selenium import webdriver
from selenium.webdriver.common.by import By # 选择元素时使用
from selenium.webdriver.chrome.service import Service
# 某个网址
url = "http://www.xxxxxx.com"
s= Service(r'C:\chromedriver.exe')
browser = webdriver.Chrome(service=s)# 没有添加path时
browser.get(url)
通过browser.maximize_window()
可以最大化窗口
此时,我们可以对browser实例进行各种操作。
使用xpath,name,id等方式定位元素(旧)
browser.find_element_by_xpath()
browser.find_element_by_name()
browser.find_element_by_id()
实例:输入用户名,密码后点击登录过程
# name定位
browser.find_element_by_name("S_TLR_ID").send_keys("账号")
browser.find_element_by_name("S_TLR_PWD_CD").send_keys("密码")
browser.find_element_by_name("imageField").click()
# xpath 定位 (可以按F12在浏览器开发者工具element 使用鼠标点选元素,在元素代码里右键 copy xpath)
browser.find_element_by_xpath('/html/body/table/tbody/tr[3]/td[2]/table[1]/tbody/tr[1]/td[2]/div/input').send_keys("账号")
browser.find_element_by_xpath('/html/body/table/tbody/tr[3]/td[2]/table[1]/tbody/tr[2]/td[2]/div/input').send_keys("密码")
browser.find_element_by_xpath('/html/body/table/tbody/tr[3]/td[2]/table[1]/tbody/tr[3]/td/input').click()
某些输入框可能自带有信息了,可以通过browser.find_element_by_xpath('xpath').clear()
清除掉里面的信息,再send_keys("str")
实例:
browser.find_element_by_xpath('//*[@id="S_BEGIN_DT"]').clear()
.sendkeys("str")
可以在输入框对象里输入信息,.click()
等同于单击该对象。
使用class,tag等方式定位元素(旧)
browser.find_elements_by_class_name()
browser.find_element_by_class_name()
browser.find_elements_by_tag_name()
使用find_elements_by_class_name 获取元素,返回包含多个webelement对象的列表。如果没有获取到,返回空列表
elements = browser.find_elements_by_class_name('animal')
for e in elements:
print(e.text)
使用find_element_by_class_name 获取元素,返回class第1个元素。如果没有获取到,抛出异常
element = browser.find_element_by_class_name('animal')
print(element.text)
使用find_elements_by_tag_name标签获取(标签就是尖括号里的内容,如<div>
,<span>
这种
elements = browser.find_elements_by_tag_name('span')
for e in elements:
print(e.text)
统一使用find_element()函数定位元素
20211103新方法:统一使用find_element()定位。find_element()函数定义如下:
def find_element(self, by=By.ID, value=None) -> WebElement:
"""
Find an element given a By strategy and locator.
:Usage:
::
element = driver.find_element(By.ID, 'foo')
:rtype: WebElement
"""
因此,我们可以统一使用find_element()函数,并传入参数确定使用xpath,name,id或其他方式定位,不需要使用不同函数定位。实例如下:
from selenium.webdriver.common.by import By # 导入By模块
browser.find_element(by=By.XPATH,value='xpath表达式')
By模块结构如下:
class By(object):
"""
Set of supported locator strategies.
"""
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
从上可知,By包含了XPATH在内的各种定位方式。
切换frame
要定位元素,需要切换到相应的frame里才能定位。
通过名称切换frame
browser.switch_to.frame("leftFrame")
frame的名称在F12在浏览器开发者工具 console处选取确定,也可以查看html代码确定元素在哪个frame中。
切换到最顶层frame
browser.switch_to.default_content()
一般来说,切换frame都是从上向下一级级来进行切换的,这样就能尽量避免报错。
onclick按钮
某些按钮是通过绑定js事件,点击后执行js代码实现的
实例:元素代码为 <a href="javascript:void(0)" onclick="a.Click(46,this)">
这种按钮一般是切换到相应的frame后,直接用selenium执行js代码 模拟点击,browser.execute_script('a.Click(46,this)')
执行onclick= 的语句。
要执行js代码,在浏览器中,可以在F12开发人员工具console控制台,选取好对应的frame后,直接粘贴代码在控制台运行。在selenium中,可以通过browser.execute_script('js')
执行
截图
使用browser.get_screenshot_as_file(path)
可以进行截图,截图默认为当前浏览器界面
实例:
browser.get_screenshot_as_file(f"C:\\Users\\karinlee\\Desktop\\screenshot_yd\\picturename.png")
延时加载
在我们进行网页操作的时候, 有的元素内容不是可以立即出现的, 可能会等待一段时间。
Selenium 的 Webdriver 对象 提供 implicitly_wait
方法,接受一个参数, 用来指定 最大等待时长。
如果我们 加入如下代码wd.implicitly_wait(10)
那么后续所有的 find_element 或者 find_elements 之类的方法调用 都会采用上面的策略:
如果找不到元素, 每隔 半秒钟 再去界面上查看一次, 直到找到该元素, 或者 过了10秒 最大时长。当发现元素没有找到的时候, 并不 立即返回 找不到元素的错误。而是周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,或者超出指定最大等待时长,这时才 抛出异常(如果是 find_elements 之类的方法, 则是返回空列表)。
键盘按键输入
首先,加载模块
from selenium.webdriver.common.keys import Keys
然后可以使用如下方式
browser.find_element(by=By.XPATH,value='xpath表达式').send_keys(Keys.ENTER)
等效于在该元素上按下回车键。