【python自学笔记】selenium常用的一些命令合集

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框选择选项,直接用 WebElementclick 方法,模拟用户点击就可以了。如
<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 进行选择,也是直接用 WebElementclick 方法,模拟用户点击选择。
    – 需要注意的是,要选中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/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值