selenium框架解析

seleium框架解析



前言

该文介绍selenium框架基本原理及常用指令


一、selenium驱动浏览器原理

通过selenium脚本---->发送指令---->到浏览器驱动---->驱动操作浏览器
1.启动浏览器驱动,也就是浏览器服务
这行代码,会默认去查找python安装路径下charomedriver.exe文件

driver = webdriver.Chrome()

通过源码,可以看到这两行代码,从而开启浏览器驱动服务

self.service = service
self.service.start()

2.通过脚本与浏览器驱动建立连接,然后再通过脚本发送指令(基于http通信)

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

通过进入gei方法,可以看到get源码如下

    def get(self, url: str) -> None:
        """Loads a web page in the current browser session."""
        self.execute(Command.GET, {"url": url})

然后进入到execute方法,可看到其源码如下

    def execute(self, command, params):
        command_info = self._commands[command]
     self._commands = {
            Command.NEW_SESSION: ("POST", "/session"),
            Command.QUIT: ("DELETE", "/session/$sessionId"),
            Command.W3C_GET_CURRENT_WINDOW_HANDLE: ("GET", "/session/$sessionId/window"),
            Command.W3C_GET_WINDOW_HANDLES: ("GET", "/session/$sessionId/window/handles"),
            Command.GET: ("POST", "/session/$sessionId/url")
            ...

3.总结:
由此可见,实际就是通过selenium脚本基于http请求,发送各种不同指令给到浏览器驱动服务,然后由驱动服务来操作我们对应的浏览器。

二、selenium常用操作

1.四大操作

代码如下(示例):

元素四大操作
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(2)
dir=driver.find_element(By.ID,"kw")
输入
dir.send_keys("测试")
点击
dir.click()
获取文本内容
dir=driver.find_element(By.LINK_TEXT,"新闻")
print(dir.text)
获取元素的属性
print("获取id属性的值:",dir.get_attribute("id"))

2.三大切换

代码如下(示例):

1.切换窗口,当定位元素不在当前窗口,则需要切换窗口

获取浏览器窗口列表 最早打开的窗口放到list的最前面
wins=driver.window_handles
print(wins)
切换最后打开的窗口
driver.switch_to.window(wins[1])

2.切换iframe:当定位的元素在frame/iframe标签中时,则需要切换

#切换iframe 方式一:id
driver.switch_to.frame("id")
#切换iframe 方式二:索引 索引值从0开始
driver.switch_to.frame(1)
#切换iframe 方式三:找到iframe元素
driver.switch_to.frame(driver.find_elements(By.XPATH,"//iframe")[2])
#再定位元素
driver.find_element(By.LINK_TEXT,"选择帐号密码登录").click()
#切换当前iframe/frame的上一级iframe/frame
drive.switch_to.parent_frame()
#切换到最上级iframe
driver.switch_to.default_content()

3.弹窗处理

alert=driver.switch_to.alert
print(alert.text)
# 点击确认
alert.accept()

3.三大等待

代码如下(示例):

1、强制等待 time.sleep(秒数) 停留
2、智能等待(隐式等待) driver.implicitly_wait(秒数) 给页面上所有的元素设置全
局等待时间,只要在设置的时间范围内找到了元素,就会执行下一个代码,最多等待设置的时间
3、显式等待:等待当前需要操作的元素 基于多种条件+等待元素
多种条件:等待元素可见?等待url跳转为xxx?等待新窗口出现?很多场景条件

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support import WebDriverWait

driver=webdriver.Chrome()
#智能等待
driver.implicitly_wait(10)
#强制等待
time.sleep(3)
#显式等待
loc=(By.LINK_TEXT,"ChromeDriver Mirror")
#等待元素存在(等待loc元素15秒,每隔0.5秒查验一次)
#expected_conditions类中,还定义很多显示等待方法,比如等待url跳转或等待元素不可见等,详情可看源码
WebDriverWait(driver,15,0.5).until(EC.presence_of_element_located(loc))

4.下拉框操作

代码如下(示例):

"""
实现下拉框的操作
from selenium.webdriver.support.select import Select
"""
from selenium.webdriver.support.select import Select
import time
from selenium.webdriver.common.by import By
from selenium import webdriver

driver=webdriver.Chrome()
# 定位下拉框
el1=driver.find_element(By.ID,"banji")
select=Select(el1)
# 展示下拉框所有选项内容显示
print("展示下拉框所有选项内容",select.options)
time.sleep(2)
# 实现选择下拉框选项选择 有三种方式 索引 value 选项内容
select.select_by_index(1)
time.sleep(2)
#这里是通过下拉框属性中的value值进行选择
select.select_by_value("22")
time.sleep(2)
select.select_by_visible_text("下拉框选项内容")
time.sleep(2)
driver.close()

5.时间控件操作

代码如下(示例):

1.可以直接使用xpath进行定位,但是这种定位限制较多。
2.通过js将元素只读属性去掉,然后通过send_keys输入时间。

# js = "document.getElementById('txtBeginDate').removeAttribute('readonly')"  # 1.原生js,移除属性
# js = "$('input[id=txtBeginDate]').removeAttr('readonly')"  # 2.jQuery,移除属性
# js = "$('input[id=txtBeginDate]').attr('readonly',false)"  # 3.jQuery,设置为false
js = "$('input[id=txtBeginDate]').attr('readonly','')"  # 4.jQuery,设置为空(同3)
driver.execute_script(js)
driver.find_element_by_id('txtBeginDate').send_keys('2016-08-24')

3.还可以通过execute_script操作js将只读属性去掉然后输入日期。

el_data=driver.find_element(By.ID,"train_date")
# 去掉readonly属性‐‐‐》通过js操作元素driver.execute_script()
# arguments会把execute_script后面的第二个或者第三个或者到第n个参数到放在arguments中
js="var el=arguments[0];el.removeAttribute('readonly');"
# 执行js脚本,去掉readonly属性
driver.execute_script(js,el_data)
# 清除日期控件默认值
el_data.clear()
time.sleep(2)
# 日期控件输入设置的日期
el_data.send_keys('2021‐10‐01')
print("时间控件设置的日期:",el_data.get_attribute("value"))

6.滚动条操作

代码如下(示例):

什么情况下,需要把元素放到可见区域我才可以操作呢?
懒加载/慢加载 必须把元素移动可见区域,才会实现加载 ----》滚动条操作

loc=(By.XPATH,"//div[@id='7']/h3/a")
# 显示等待 presence_of_element_located不一定元素可见,只要存在即可
WebDriverWait(driver,15).until(EC.presence_of_element_located(loc))
el2=driver.find_element(*loc)
time.sleep(2)
# el2.click()
# 实现滚动条从顶部到底部
driver.execute_script("scrollTo(0,document.body.scrollHeight)")
time.sleep(2)
# 实现滚动条从浏览器底部到顶部
driver.execute_script("scrollTo(document.body.scrollHeight,0)")
time.sleep(2)
# 操作哪个元素,滚动条移动到元素附近(元素与页面的顶部对齐,元素与页面的底部对
齐)
js2="arguments[0].scrollIntoView(false);"
driver.execute_script(js2,el2)
time.sleep(2)

7.文件操作

一般清空输入框,然后直接输入文件地址即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值