文章目录
selenium常用命令整理(自用)
selenium安装(python)
- 安装命令
pip install selenium
- 安装完成selenium库后,还需要下载对应浏览器的驱动,可以 点击这里 下载chrome浏览器对应的驱动(其他浏览器的驱动大家可自行百度获取)
- 如果我们是Windows平台的电脑,就下载 chromedriver_win32.zip
- 把下载到的ZIP文件解压到一个方便记忆的位置,例如
D:/webdriver.exe
(后期代码会用到这个位置)
selenium常用代码
调用浏览器访问网站
from selenium import webdriver # 导入模块
wd = webdriver.Chrome(r'd:\webdriver.exe') # 创建 WebDriver 对象,指明使用chrome浏览器驱动
wd.get('https://www.baidu.com') # 调用 WebDriver 对象的get方法 可以让浏览器打开指定网址
python 执行完自动化代码,如果想关闭浏览器窗口可以调用WebDriver对象的 quit 方法,像这样 wd.quit()
关闭浏览器:driver.close()与driver.quit()的区别
driver.close()
关闭当前窗口driver.quit()
关闭所有窗口
选择元素(定位元素)
selenium的使用思路就是–>先找到元素,然后才能操作元素
wd.find_element_by_id("id对一个的值")
根据元素的id
属性定位元素
from selenium import webdriver
# 创建 WebDriver 对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome(r'd:\chromedriver.exe')
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://www.baidu.com')
# 根据id选择元素,返回的就是该元素对应的WebElement对象
element = wd.find_element_by_id('kw')
# 通过该 WebElement 对象,就可以对页面元素进行操作了
# 比如输入字符串到 这个 输入框里
element.send_keys('想要输入的文字\n')
# 上面使用了 \n 来启动搜索,其实还可以调用这个对象的 click 方法去点击 百度一下 这个元素。
wd.find_elements_by_class_name("name对应的值")
根据class
属性选择元素
– 注意:这里使用的是elements
得到的是一个列表,如果没有数据返回一个空列表
– 如果使用wd.find_element_by_class_name("name对应的值")
,即使用element
则得到的是第一元素
,没有数据的话,程序会报错!
from selenium import webdriver
# 创建 WebDriver 实例对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome(r'd:\chromedriver.exe')
# WebDriver 实例对象的get方法 可以让浏览器打开指定网址
wd.get('http://f.python3.vip/webauto/sample1.html')
# 根据 class name 选择元素,返回的是 一个列表
# 里面 都是class 属性值为 animal的元素对应的 WebElement对象
elements = wd.find_elements_by_class_name('animal')
# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
print(element.text)
# `element.text` 通过 WebElement 对象的 text属性 可以获取该元素 在网页中的文本内容。
wd.find_elements_by_tag_name("tag对应的值")
根据class
属性选择元素(tag标签的意思,一般是html<>
开头的标签)
from selenium import webdriver
wd = webdriver.Chrome(r'd:\chromedriver.exe')
wd.get('http://f.python3.vip/webauto/sample1.html')
# 根据 tag name 选择元素,返回的是 一个列表
# 里面 都是 tag 名为 div 的元素对应的 WebElement对象
elements = wd.find_elements_by_tag_name('div')
# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
print(element.text)
find_element 和 find_elements 的区别
- 使用
find_elements
选择的是符合条件的 所有 元素, 如果没有符合条件的元素, 返回空列表 - 使用
find_element
选择的是符合条件的 第一个 元素, 如果没有符合条件的元素, 抛出NoSuchElementException
异常 - WebDriver 对象 选择元素的范围是 整个 web页面, 而
WebElement
对象 选择元素的范围是 该元素的内部。
等待界面元素的出现
由于代码执行的速度和浏览器访问的速度存在先后差异,所以很多时候会导致程序执行报错
-
针对这个问题,Selenium提供了一个解决方案:
wd.implicitly_wait(等待的时间)
–当发现元素没有找到的时候, 并不 立即返回 找不到元素的错误。而是周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,或者超出指定最大等待时长,这时才 抛出异常(如果是 find_elements 之类的方法, 则是返回空列表)。
-
如果我们 加入如下代码
wd.implicitly_wait(10)
那么后续所有的find_element
或者find_elements
之类的方法调用 都会采用上面的策略: -
如果找不到元素, 每隔
半秒钟
再去界面上查看一次, 直到找到该元素, 或者 过了10秒 最大时长。 -
这样,我们的百度搜索的例子的最终代码如下
from selenium import webdriver
wd = webdriver.Chrome()
# 设置最大等待时长为 10秒
wd.implicitly_wait(10) # 等待元素出现
wd.get('https://www.baidu.com')
element = wd.find_element_by_id('kw')
element.send_keys('想搜索的内容\n')
element = wd.find_element_by_id('1')
print (element.text)
添加这行代码之后就可以解决前面提出的那给问题了
操控元素
操控元素通常包括:
点击元素
输入字符串
获取元素包含的信息
点击
- 点击元素通过调用元素WebElement对象的 click方法来实现,点击的是该元素的
中心点
位置 - 输入框
– 首先,可以使用 WebElement 对象的 clear 方法
,把输入框中已经有的内容清理掉
– 然后调用元素 WebElement 对象的 send_keys 方法
,输入需要的内容
element = wd.find_element_by_id("input1")
element.clear() # 清除输入框已有的字符串
element.send_keys('要输入的内容') # 输入新字符串
获取元素信息
- 通过
WebElement
对象的text
属性,可以获取元素 展示在界面上的 文本内容,如下:
element = wd.find_element_by_id('animal')
print(element.text)
-
通过
WebElement
对象的get_attribute
方法来获取元素的属性值, -
element.get_attribute('class')
获取元素属性class的值,如下:
element = wd.find_element_by_id('input_name')
print(element.get_attribute('class'))
element.get_attribute('outerHTML')
获取整个元素对应的HTML,如果只是想获取某个元素 内部 的HTML文本内容,可以使用element.get_attribute('innerHTML')
element.get_attribute('value')
获取输入框里面的文字,对于input
输入框的元素,要获取里面的输入文本,用text
属性是不行的,这时可以使用
element.get_attribute('value')
,如
element = wd.find_element_by_id("input1")
print(element.get_attribute('value')) # 获取输入框中的文本
通过
WebElement
对象的text
属性,可以获取元素展示在界面上的
文本内容。
但是,有时候,元素的文本内容没有展示在界面上,或者没有完全完全展示在界面上。 这时,用WebElement对象的text属性
,获取文本内容,就会有问题。
出现这种情况,可以尝试使用element.get_attribute('innerText')
或者element.get_attribute('textContent')
frame切换
很多时候在一个html文档中的一些内容是用iframe嵌套在html中的另一个html文档,这个时候要控制里面的元素就需要先把
操作范围切换
到被嵌入的文档中
wd.switch_to.frame(frame_reference)
,使用WebDriver
对象的switch_to
属性进行切换,其中frame_reference
可以是 frame 元素的属性 name 或者 ID 的值,如
–wd.switch_to.frame('frame1')
或者
–wd.switch_to.frame('innerFrame')
也可以填写frame 所对应的 WebElement 对象。如
wd.switch_to.frame(wd.find_element_by_tag_name("iframe"))
from selenium import webdriver
wd = webdriver.Chrome(r'd:\chromedriver.exe')
wd.get('http://f.python3.vip/webauto/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
– 例如,在上面 代码 操作完 frame里面的元素后, 需要 点击 主html 里面的按钮,就可以这样写
from selenium import webdriver
wd = webdriver.Chrome(r'd:\chromedriver.exe')
wd.get('http://f.python3.vip/webauto/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()
窗口切换
很多时候,我们在操作浏览器的时候经常会出现
链接跳转
的情况,这个时候就需要进行窗口切换
wd.switch_to.window(handle)
,使用Webdriver
对象的switch_to
属性的 window 方法可以实现窗口切换,其中handle
是窗口的句柄
–WebDriver
对象有window_handles
属性,这是一个列表对象, 里面包括了当前浏览器里面所有的窗口句柄。 如
for handle in wd.window_handles:
# 先切换到该窗口
wd.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if 'Bing' in wd.title:
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
break
切换回主窗口
同样的,如果我们在新窗口 操作结束后, 还要回到原来的窗口,该怎么办?
我们可以仍然使用上面的方法,依次切入窗口,然后根据 标题栏 之类的属性值判断。
还有一个更省事的方法:
因为我们一开始就在 原来的窗口里面,我们知道 进入新窗口操作完后,还要回来,可以事先 保存该老窗口的 句柄
,使用如下方法
# mainWindow变量保存当前窗口的句柄
mainWindow = wd.current_window_handle
- 切换到新窗口操作完后,就可以直接像下面这样,将 driver 对应的对象返回到原来的窗口
#通过前面保存的老窗口的句柄,自己切换到老窗口
wd.switch_to.window(mainWindow)
选择框
常见的选择框包括: radio框、checkbox框、select框
radio框
- radio框选择选项,直接用
WebElement
的click
方法,模拟用户点击就可以了。如
<div id="s_radio">
<input type="radio" name="teacher" value="小江老师">小江老师<br>
<input type="radio" name="teacher" value="小雷老师">小雷老师<br>
<input type="radio" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
对应的代码如下
# 获取当前选中的元素
element = wd.find_element_by_css_selector(
'#s_radio input[checked=checked]')
print('当前选中的是: ' + element.get_attribute('value'))
# 点选 小雷老师
wd.find_element_by_css_selector(
'#s_radio input[value="小雷老师"]').click()
checkbox框
- 对
checkbox
进行选择,也是直接用WebElement
的click
方法,模拟用户点击选择。
– 需要注意的是,要选中checkbox的一个选项
,必须先获取当前该复选框的状态
,如果该选项已经勾选了,就不能再点击。否则反而会取消选择。 - 比如, 我们要在下面的html中:选中 小雷老师
<div id="s_checkbox">
<input type="checkbox" name="teacher" value="小江老师">小江老师<br>
<input type="checkbox" name="teacher" value="小雷老师">小雷老师<br>
<input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
- 我们的思路可以是这样:
– 先把 已经选中的选项全部点击一下,确保都是未选状态
– 再点击 小雷老师
示例代码
#先把 已经选中的选项全部点击一下
elements = wd.find_elements_by_css_selector(
'#s_checkbox input[checked="checked"]')
for element in elements:
element.click()
#再点击 小雷老师
wd.find_element_by_css_selector(
"#s_checkbox input[value='小雷老师']").click()
select框
- radio框及
checkbox
框都是input
元素,只是里面的type
不同而已。
– select框 则是一个新的select标签,大家可以对照浏览器网页内容查看一下
– 对于Select 选择框, Selenium 专门提供了一个Select类
进行操作。
– Select类 提供了如下的方法
–select_by_value
– 根据选项的value属性值
,选择元素。 - 比如,下面的HTML,
<option value="foo">Bar</option>
就可以根据 foo
这个值选择该选项,
s.select_by_value('foo')
select_by_index
根据选项的 次序 (从1开始),选择元素- select_by_visible_text
根据选项的 可见文本 ,选择元素。 - 比如,下面的HTML,
<option value="foo">Bar</option>
– 就可以根据 Bar 这个内容,选择该选项
s.select_by_visible_text('Bar')
deselect_by_value
– 根据选项的value属性值, 去除 选中元素
deselect_by_index
– 根据选项的次序,去除 选中元素
deselect_by_visible_text
– 根据选项的可见文本,去除 选中元素
deselect_all
去除
选中所有元素
Select单选框
对于 select单选框,操作比较简单:
不管原来选的是什么,直接用Select方法选择即可。
例如,选择示例里面的小雷老师,示例代码如下
# 导入Select类
from selenium.webdriver.support.ui import Select
#创建Select对象
select = Select(wd.find_element_by_id("ss_single"))
#通过 Select 对象选中小雷老师
select.select_by_visible_text("小雷老师")
Select多选框
- 对于select多选框,要选中某几个选项,要注意去掉原来已经选中的选项。
– 例如,我们选择示例多选框中的 小雷老师 和 小凯老师
– 可以用select类 的deselect_all方法,清除所有 已经选中 的选项。
– 然后再通过 select_by_visible_text方法 选择 小雷老师 和 小凯老师。
示例代码如下:
# 导入Select类
from selenium.webdriver.support.ui import Select
# 创建Select对象
select = Select(wd.find_element_by_id("ss_multi"))
# 清除所有 已经选中 的选项
select.deselect_all()
# 选择小雷老师 和 小凯老师
select.select_by_visible_text("小雷老师")
select.select_by_visible_text("小凯老师")
参考文章:http://www.python3.vip/doc/tutorial/selenium/skills_1/