Web自动化【selenium】基础知识
selenium自动化基础知识点
目录
- selenium自动化基础知识点
- 一、Selenium是什么?
- 二、使用步骤
- 1.引入库
- 2.下载对应的浏览器驱动
- 3.基本使用
- 三、元素定位
- 1、特点
- 2、八大元素定位方法
- 3、分类及使用【xpath】:
- 1. 绝对路径定位
- 2. 相对路径定位
- 一、通过元素本身属性定位:
- 二、通过关系定位(父级、兄弟级):
- 四、Dom元素 and 窗口操作
- 1.Dom元素操作:
- 2.常用窗口操作:
- 五、等待操作
- 1.强制等待:
- 2.隐式等待:
- 3. 显示等待(等待[WebDriverWait]+条件[expected_conditions])
- expected_conditions[EC]类其他常用方法 :
- expected_conditions[EC]中不常用的条件方法:
- 六、浏览器窗口切换操作
- 切换窗口的两种方式:第一种:
- 切换窗口的两种方式:第二种:
- 七、iframe-即html嵌套iframe切换操作
- 八、JS弹窗处理---- Alert弹窗
- 九、下拉框选项处理
- 1.经典select - option下拉框
- 2.非select下拉框---例如:div+p
- 十、鼠标操作
- 1、操作示例
- 2、鼠标操作方法合集
- 十一、按键操作--Keys类
- 十二、JS操作---JavaScript脚本操作页面元素
- 十三、文件操作
一、Selenium是什么?
selenium是用来进行页面元素定位的第三方库,可使用xpath,元素数据,绝对相对路径进行元素定位及鼠标点击事件等等,用来进行web自动化测试的工具,可以直接运行在浏览器中,像用户自己手动点击操作一样
二、使用步骤
1.引入库
pip install selenium # 使用pip命令下载selenium第三方库from selenium import webdriver # 导入selenium库
2.下载对应的浏览器驱动
下载浏览器驱动时注意需要下载与浏览器对应的驱动版本,下载完成后将驱动放置python环境的安装路径下:C:\Users\Administrator\AppData\Local\Programs\Python\Python39
谷歌驱动下载地址:https://registry.npmmirror.com/binary.html?path=chromedriver/
火狐驱动下载地址:https://liushilive.github.io/github_selenium_drivers/md/Firefox.html
3.基本使用
from selenium import webdirverdriver = webdriver.Chrome() # 声明谷歌浏览器驱动
# 示例1:打开百度
driver.get("https://www.baidu.com")
# 示例2:获取当前窗口的title
print(dirver.title)
# 示例3:获取当前窗口的url
print(dirver.current_url)
# 示例4:最大化窗口
dirver.maximize_window()
# 示例5:刷新页面
dirver.refresh()
# 示例6:下一页,上一页
dirver.forward() dirver.back()
# 示例7:关闭当前窗口/关闭浏览器
# 区别:当只有一个窗口时,关闭窗口,后台驱动也会关闭
dirver.close()/dirver.quit()
三、元素定位
1、特点
1、万能定位方式
2、支持文本内容进行定位
3、支持元素的多个属性进行定位
4、支持通过元素层级关系进行定位
2、八大元素定位方法
8大定位操作xmind笔记连接:https://hnqlpvx3ef.feishu.cn/mindnotes/bmncnZMK43mqhxFhwtWXQJs62Ig
ID = "id" # id属性XPATH = "xpath" # xpath定位LINK_TEXT = "link text" # a元素的文本内容PARTIAL_LINK_TEXT = "partial link text" # a元素包含的文本内容NAME = "name" # name属性TAG_NAME = "tag name" # 标签名CLASS_NAME = "class name" # class属性CSS_SELECTOR = "css selector" # css选择器定位
3、分类及使用【xpath】:
1. 绝对路径定位
1.1、 F12中点击页面元素复制位置即可
1.2 、提现父子,兄弟关系
1.3、 过于依赖页面元素,不稳定【前端经常更改页面元素关系,绝对定位不能够稳定版本使用】
2. 相对路径定位
2.1、特点: 1、不考虑位置,不考虑层级2、在这个html页面找,只要表达式能匹配到就可以3、ctrl+f校验表达式是否正确
2.2 代码示例:
一、通过元素本身属性定位:
1、标签名定位:语法: //标签名2、标签名+单个属性语法://标签名[@属性名="属性值"]3、标签名+文本:语法://标签名[text(),"文本值"]4、标签名+contains()函数匹配部分属性值或文本内容定位语法://标签名[@属性名 或 text() = , "指定部分文本或属性值"]5、标签名+多个属性组合定位,可使用逻辑语句and or not语法://标签名[@属性名1 = "值1" and @属性名2 = "值2"]
二、通过关系定位(父级、兄弟级):
1、层级定位(通过区域内层级关系找到元素):语法://标签名1[@属性名1 = "值1"]/标签名2[@属性名2 = "值1"]2、轴定位(通过子孙元素查找父级、祖先级元素;通过兄弟元素查找指定元素):语法://标签名称[@属性名1 = "值1"]/轴名称::标签名称1[[@属性名2 = "值2"]//轴:在当前节点下所有子孙节点去找元素/轴:在当前之后的所有节点去找元素(递归所有兄弟节点)轴名称:ancestor:祖先节点包括父节点parent: 父节点following:当前节点【之后】的所有节点preceding:当前节点【之前】的所有节点following-sibling: 当前节点【之后】的所有兄弟节点preceding-sibling: 当前节点【之前】的所有兄弟节点
四、Dom元素 and 窗口操作
1.Dom元素操作:
元素状态
1、元素存在:页面存在 存在:在html当中,可以找到这个元素。 但它不一定可见。
2、元素可见:页面不可见 可见:元素在页面当中占据了一定的大小。高和宽>0
3、元素可用:按钮置灰(不可用)
元素操作链接地址:http://t.csdn.cn/Kgb0r
2.常用窗口操作:
项目 | Value |
---|---|
maximize_window() | 放大当前窗口,不需要传参 |
minimize_window() | 最小化特定窗口 |
.back() | 上一页 |
.forward() | 下一页 |
.close() | 关闭当前窗口 |
.quit() | 推出驱动程序并关闭所有窗口 |
.switch_to.(…) | 包含所有可切换焦点的对象,具体可切换对象如下: |
element = driver.switch_to.active_element
alert = driver.switch_to.alert
driver.switch_to.default_content()
driver.switch_to.frame(‘frame_name’)
driver.switch_to.frame(1)
driver.switch_to.frame(driver.find_elements_by_tag_name(“iframe”)[0])
driver.switch_to.parent_frame()
driver.switch_to.window(‘main’)
更多窗口操作详见:WebDriver类中查看
五、等待操作
1.强制等待:
# 强制等待就是使用time包中的sleep()函数让程序在调用到此方法时停止或睡眠暂停指定时间
import time# 单位:s
time.sleep(5)
2.隐式等待:
from selenium import webdriverdriver = webdriver.Chrome()
# 语法格式:{单位:s}
driver.implicitly_wait(5)
# 特点:
隐式等待整个会话只执行一次,后面每次元素查找都会进行等待操作,
在设置的时间内找到元素就进入下部代码操作,元素未找到就会报错;
# 缺点:
成效比较单一,无法适用于较复杂场景
3. 显示等待(等待[WebDriverWait]+条件[expected_conditions])
# WebDriverWait()参数说明
1.timeout:最长超时时间,默认以秒为单位
2.poll_frequency:轮询频率,检测的间隔步长,默认为0.5s,这里会每隔 0.5 秒调用一次 method 的临时函数
3.ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。# 显示调用需要和until()结合使用
# 公共部分:
# 导包
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 写法一{分开编写}:
wait = WebDriverWait(driver=driver, timeout=10) # 传入dirver 并设置超时时间为10s
element_loator = (By.XPATH, '//span[@id="kw"]') # 使用元组方式存储元素查找方式及查找表达式
element = wait.until(EC.visibility_of_element_located(locator=element_locator))# 写法二{组合编写}:
element = WebDriverWait(driver=driver,timeout=10).until(EC.visibility_of_element_located(By.XPATH, '//span[@id="kw"]'))# visibility_of_element_located :条件为等待单个元素出现
expected_conditions[EC]类其他常用方法 :
条件 | 解释 |
---|---|
visibility_of_element_located | 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0 |
visibility_of_all_elements_located | 判断多个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0 |
visibility_of | 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element即可 |
frame_to_be_available_and_switch_to_it | 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False |
alert_is_present | 判断页面上是否存在alert |
element_to_be_selected | 判断某个元素是否被选中了,一般用在下拉列表 |
element_to_be_clickable | 判断某个元素中是否可见并且是enable的,这样的话才叫clickable |
presence_of_element_located | 判断某个元素是否被加到了dom树里,【并不代表该元素一定可见】 |
presence_of_all_elements_located | 等待所有元素存在dom树中【并不代表该元素一定可见】 |
expected_conditions[EC]中不常用的条件方法:
条件 | 解释 |
---|---|
title_is | 判断当前页面的title是否完全等于(==)预期字符串,返回是布尔值 |
title_contains | 判断当前页面的title是否包含预期字符串,返回布尔值 |
text_to_be_present_in_element | 判断某个元素中的text是否包含了预期的字符串 |
text_to_be_present_in_element_value | 判断某个元素中的value属性是否包含了预期的字符串 |
invisibility_of_element_located | 判断某个元素中是否不存在于dom树或不可见 |
staleness_of | 等某个元素从dom树中移除,注意,这个方法也是返回True或False |
element_selection_state_to_be | 判断某个元素的选中状态是否符合预期 |
element_located_selection_state_to_be | 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator |
六、浏览器窗口切换操作
前言:为什么要做窗口的切换?
当对浏览器进行操作点击,或百度搜索时,会跳出新的窗口,而selenium代码层面并未切换到新的弹窗中,如果不做切换操作,则后续需要在新的弹窗中做元素定位等操作则无法定位获取。所以需要进行窗口切换的操作,转换到需要操作的新窗口,从而进行后续步骤。。。
切换窗口的两种方式:第一种:
步骤:
1.触发打开新窗口的操作
2.强制等待下 sleep(1) //一般情况下需要等待1-3秒
3.获取所有打开的窗口:driver.switch_to.window(win_handle_list [-1])
------获取到的数据为列表形式,一般新打开的窗口可以理解为追加到列表后
4. 切换到指定窗口
代码演示如下:
"""此处以百度点击搜索按钮后的浏览器状态为例:"""
# 导包
from selenium improt webdriver
from selenium.webdriuver.common.by import By
from selenium.webdriver.support.wait import webDriverWait # 导入等待和条件包ES
from selenium.webdriver.support import expected_conditions as ES"""前置"""
# 打开浏览器进入百度首页,最大化浏览器
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maxmize_window()
# 找到输入框"kw"输入查找内容并点击"su"搜索按钮,页面显示csdn官网
driver.find_element(By.id, "kw").sendkeys("csdn")
driver.find_element(By.id, "su").click()"""1.触发打开csdn官网新窗口操作"""
# 等待
webDriverWait(driver,10).unitl(EC.visibility_of_any_elements_located(By.XPATH, '//a[contains(text(), "- 专业开发者社区")]'))
# 点击触发新窗口
driver.find_element(By.XPATH, '//a[contains(text(), "- 专业开发者社区")]').click()
sleep(1)
"""2.获取所有打开的窗口,并切换到新窗口"""
win_handle_list = driver.window_handles # 获取所有窗口
driver.switch_to.window(win_handle_list [-1]) # 使用swich_to.window(win_handle_list [下标])切换窗口# 切换到新窗口后即可进入后续操作
切换窗口的两种方式:第二种:
显性等待当中有一个条件是关于新窗口的:EC.new_window_is_opened(参数【现在已有的窗口句柄列表】)
返回为Boolean类型,在触发新窗口后判断是否有新窗口有则返回True 否则返回False
步骤:
0.先获取已有的窗口句柄列表:win_list = driver.windows_handles
1.触发打开新窗口的操作
2.WebDriverWait(driver,10).unitl(EC.new_window_is_opened(win_lsit)) 等待条件判断是否有新窗口
3.获取所有打开的窗口:driver.switch_to.window(win_handle_list [-1])
------获取到的数据为列表形式,一般新打开的窗口可以理解为追加到列表后
4. 切换到指定窗口
代码演示如下:
"""前置---同上""""""0.获取已有的窗口句柄列表"""
win_list = dirver.window_handles"""1.触发打开csdn官网新窗口操作"""
# 等待
webDriverWait(driver,10).unitl(EC.visibility_of_any_elements_located(By.XPATH, '//a[contains(text(), "- 专业开发者社区")]'))
# 点击触发新窗口
driver.find_element(By.XPATH, '//a[contains(text(), "- 专业开发者社区")]').click()
sleep(1)"""2.webDriverWait判断是否有新窗口打开"""
# 返回True表示有新窗口打开
WebDriverWait(driver, 10).unitl(EC.new_window_is_opened(win_lsit))
"""3.获取所有打开的窗口,并切换到新窗口"""
win_handle_list = driver.window_handles # 获取所有窗口
driver.switch_to.window(win_handle_list [-1]) # 使用swich_to.window(win_handle_list [下标])切换窗口# 切换到新窗口后即可进入后续操作
七、iframe-即html嵌套iframe切换操作
前言:在页面中前端因为需要分模块设计前端切面展示,一般会使用到iframe来进行html标签嵌套设计,在使用元素定位时,如果要获取嵌套中的html下的标签是无法定位到的,需要切换到指定iframe嵌套标签下才能进行后续操作;如果不切换运行自动化代码会报错找不到标签
1.如何识别元素是否在iframe当中:浏览器使用F12查看即可,如下图:
例如QQ邮箱的登录首页,检查页面元素可发现,登录按钮的标签在iframe中嵌套
代码示例iframe切换操作:
"""
方法一:切换使用driver.switch_to.frame()方法来完成iframe切换操作,其中的参数表达有3中方式,具体如下:1. iframe的下标2. iframe的name属性值3. iframe的webelement对象【driver.find_element(By.XPATH,"表达式")】By.id/tagname/name 都可退出:1. driver.switch_to.defalut_content() :返回主页面,即浏览器最初打开的页面特殊:如果有iframe嵌套使用的话,则需要层级switch_to到需要操作的iframe中例如:iframeA当中,嵌套iframeB如果要切换到B,那就再driver.switch_to如果要从B回到A,driver.switch_to.parent_frame()方法二:使用等待+EC条件完成iframe切换等待时间内指定iframe加载出来则切换到指定iframeWebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(iframe的下标/iframe的name属性/iframe的WebElement对象[driver.find_elment(iframe的定位策略, 定位表达式)] ))"""
# 示例:
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://mail.qq.com/")
"""方法一:"""
# name属性切换到指定iframe
driver.switch_to.frame("login_frame")# webelement对象切换到指定iframe
driver.swtich_to.frame(driver.find_element(By.NAME, "login_frame"))# 下标切换到指定的iframe【一般页面中不会有太多的iframe,所以也可以使用下标来进行切换】
driver.swtich_to.frame(1)"""方法二:"""
# 下标切换到指定的iframe
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(1))
# webelement切换到指定的iframe
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME, "login_frame")))
# name切换到指定的iframe
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("login_frame"))
八、JS弹窗处理---- Alert弹窗
前言:为何要处理js弹窗?js弹窗出现后,页面将无法操作,只有点掉alert弹窗才能继续操作页面元素
JS弹窗示例:https://www.w3school.com.cn/js/js_popup.asp
- 对js弹窗处理有指定的处理类 Alert
- 在switch_to中也有对应的方法.alert其实现原理就是实例化Alert对象,所以直接引用alert也可进行操作
- 处理弹窗的3种方法:
accept():确定
dismiss():取消
send_keys():输入内容
代码示例:
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert# 以w3school中的alert弹窗为例
driver = webdriver.Chrome()
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_js_alert")
driver.switch_to.frame("iframeResult")
sleep(0.5)
driver.find_element(By.XPATH, '//button[@text(), "试一试"]').click()# js弹窗跳出后实例化alert对象,并进行操作Alert(driver).accept() # 点击弹窗的确认按钮
Alert(driver).dismiss() # 点击弹窗的取消按钮
Alert(driver).send_keys("内容") # 在弹窗中输入指定内容
九、下拉框选项处理
1.经典select - option下拉框
- 下拉框示例w3school:https://www.w3school.com.cn/tiy/t.asp?f=eg_html_elements_select
- 处理下拉框的类 :Select 【导包:from selenium.webdriver.support import Select】
- 选择下拉框中值的3种方式:
select_by_value :option的value属性值
select_by_index:option所处的下标,从0开始
select_by_visible_text:option的文本内容
代码示例:
"""此处以w3school中的下拉框为例:https://www.w3school.com.cn/tiy/t.asp?f=eg_html_elements_select"""
# 导包
from selenium import webdriver
from selenium.common.by import By
from selenium.webdriver.support import Select# 1.找到需要操作的select元素对象
driver = webdriver.Chrome()
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_html_elements_select")
sel = driver.find_element(By.TAG_NAME, "select")# 2.实例化Select对象
s = Select(sel)# 3.选值
s.select_by_value("fiat") #option的value属性值
s.select_by_index(1)#option所处的下标,从0开始
s.select_by_visible_text("Audi")#option的文本内容
2.非select下拉框—例如:div+p
非select下拉框选择时,就按正常获取元素一步步操作,没有捷径,以百度首页中的高级搜索为例:
import time
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By"""
2、div+p标签
百度-高级搜索
1) 触发下拉列表出现
2)再在下拉列表当中选择
"""driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
wait = WebDriverWait(driver,15)# 右上角 - 设置元素 - 点击
driver.find_element_by_id("s-usersetting-top").click()
sleep(1)
# 在显示的下拉列表当中,选择高级搜索
loc = (By.XPATH, '//a[text()="高级搜索"]')# 如果元素可见了,返回元素对象。如果元素不可见,返回False
element = wait.until(EC.visibility_of_element_located(loc))
element.click()
sleep(1)# 1、触发下拉列表出现
loc = (By.XPATH, '//div[@class="c-select adv-ft-select"]')
element = wait.until(EC.visibility_of_element_located(loc))
element.click()
sleep(1)
# 2、选值
loc = (By.XPATH, '//p[text()="微软 Word (.doc)"]')
element = wait.until(EC.visibility_of_element_located(loc))
element.click()time.sleep(7)
driver.quit()
十、鼠标操作
1、操作示例
前言:使用selenium中的ActionChains类对鼠标进行点击,悬停,长按拖拽,释放等操作
1. 导包,下方两种方式均可:
from selenium.webdriver import ActionChains
from selenium.webdriver.common.action_chains import ActionChains
2. 使用方式:
ActionChains的执行原理,当调用ActionChains方法时,不会立即执行鼠标操作,而是将所有鼠标操作存在列表队列中,当调用perform()方法时,按照队列中的顺序依次调用执行鼠标操作方法
3.具体使用步骤及代码示例如下:
"""
具体使用步骤1.实例化ActionChains类:2.调用鼠标操作的方法3.最后执行鼠标操作方法:perform()下方代码以菜鸟教程中的jsDOM事件案例为例子:https://www.runoob.com/js/js-htmldom-events.html
"""
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.get("https://www.runoob.com/htmldom/htmldom-events.html")
driver.maximize_window()
wait = WebDriverWait(driver,15)
locator = (By.XPATH,"//div[text()="Mouse Over Me"]")
element = wait.unitl(EC.visibility_of_element_located(locator))# 1.实例化
actionc = ActionChains(element)
# 2.调用鼠标操作方法
actionc.move_to_element(element)
actionc.pause(1)
actionc.click(element)
# 3. 调用执行方法
actionc.perform()"""
还可以使用链式调用,也可以进行鼠标操作
ActionChains(element).move_to_element(element).pause(1).click(element).perform()
"""
2、鼠标操作方法合集
方法 | 注释 | 使用 |
---|---|---|
click(on_element=None) | 鼠标单击操作 | |
click_and_hold(on_element=None) | 点击鼠标左键,不松开 | |
context_click(on_element=None) | 点击鼠标右键 | |
double_click(on_element=None) | 双击鼠标左键 | |
drag_and_drop(source, target) | 拖拽到某个元素然后松开 | socurce:被拖拽元素;target:目标元素 |
key_down(value, element=None) | 按下某个键盘上的键 | 与Keys类结合使用 |
key_up(value, element=None) | 松开某个键 | 与Keys类结合使用 |
move_by_offset(xoffset, yoffset) | 鼠标从当前位置移动到某个坐标 | 两个参数分别代表x,y轴坐标 |
move_to_element(to_element) | 鼠标移动到某个元素 | 参数为移动到的元素对象 |
move_to_element_with_offset(to_element, xoffset, yoffset) | 在某个元素位置松开鼠标左键 | |
release(on_element=None) | 在某个元素位置松开鼠标左键 | |
send_keys(*keys_to_send) | 发送某个键到当前焦点的元素 | |
send_keys_to_element(element, *keys_to_send) | 发送某个键到指定元素 | |
perform() | 执行链中的所有动作 |
以上为鼠标操作的一些方法,具体使用方法可参考本链接:https://www.cnblogs.com/lxbmaomao/p/10389786.html
十一、按键操作–Keys类
Keys类中包含了所有键盘操作,需要使用时,调用对应的变量名即可,使用前需要先进行导包:
from selenium.webdriver.common.keys import Keys
"""
以下为常用的Keys类中的按键,其他按键可在Keys类中查看调用方式send_keys(Keys.BACK_SPACE) 删除键BackSpace,每次删除1个字符send_keys(Keys.SPACE) 空格键Spacesend_keys(Keys.TAB) 制表键Tabsend_keys(Keys.ESPACE) 回退键Escsend_keys(Keys.ENTER) 回车键Entersend_keys(Keys.CONTROL,‘a’) 全选Ctrl+Asend_keys(Keys.CONTROL,‘c’) 复制CTRL+Csend_keys(Keys.CONTROL,‘x’) 剪切CTRL+Xsend_keys(Keys.CONTROL,‘v’) 粘贴Ctrl+Vsend_keys(Keys.F1) 键盘F1send_keys(Keys.F12) 键盘F12
"""# 代码示例:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
# 以百度搜索回车按键为例driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 找到百度输入框,输入需要查找的内容并点击Enter
driver.find_element(By.id,"kw").send_keys("搜索内容", Keys.ENTER)
十二、JS操作—JavaScript脚本操作页面元素
前言:为什么要使用JS操作页面元素?当使用webdriver的element对象无法操作页面元素时,也可以使用js来操作页面元素,webdriver中有一个方法可以用来执行js脚本语句:driver.execute_script(“js脚本,可写多个使用;隔开”)
- WebDriver提供了两个执行JS代码的方法:
execute_script(script, *args)
execute_async_script(script, *args)
两个方法分别为同步执行和异步执行,参数:script表示需要执行的js脚本语言;*args表示需要传递给js的参数- 注意传参使用方式
当有参数需要传递给js脚本时,其中的JS书写方式略有不同,需要传参的地方使用arguments[下标]来表示参数
传入参数类似于存储在列表中,按顺序下标进行传参提取
例如:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
wait = WebDriverWait(driver,15)# 使用selenium找到的元素对象,传递给js代码
ele_input = driver.find_element_by_id("kw")
ele_button = driver.find_element_by_id("su")# js代码中使用arguments来接收参数。可以理解是个列表,通过下标取值。从0开始,根据参数的位置。
js_code = 'arguments[0].value = "搜索内容";' \'arguments[1].click()'driver.execute_script(js_code,ele_input,ele_button)
更多JS相关脚本操作页面元素可参考菜鸟教程-JavaScript操作:https://www.runoob.com/js/js-htmldom-events.html
十三、文件操作
- 前言:当有文件上传操作的页面时,需要将本地的文件传递给元素使用时就需要使用到文件操作;
- 导包:
- pip install pywinauto【用于window】
from pywinauto.keyboard import send_keys- pip install pyautogui【使用(跨平台、windows、linux、mac、文件路径不能有中文、不支持多文件上传)】
import pyautogui- 注意:在上传文件时,必须等待文件弹出框出现才可进行选择文件上传操作
# 两种上传文件的使用方式
# 1. window
from pywinauto.keyboard import send_keys
# 例如百度首页中的摄像机元素,点击后需要上传图片,定位并点击到元素后弹出文件夹框
# 选择文件
send_keys("文件路径")
send_keys('{ENTER}') # 回车按钮# 2.使用pyautogui 通用文件上传包
import pyautogui
# 例如百度首页中的摄像机元素,点击后需要上传图片,定位并点击到元素后弹出文件夹框
# 选择文件上传
pyautogui.typewrite(r'D:\fk88.png') # 选择文件
pyautogui.press(keys='enter',presses=3) # 确认上传【参数:keys:按键;persses:重复按几次; interval=0.0:时间间隔(浮动,可选)】
Web自动化【selenium】基础知识相关推荐
- web 自动化测试 selenium基础到应用(目录)
第一章 自动化测试前提及整体介绍 1-1功能测试和自动化测试的区别 1-2自动化测试流程有哪些 1-3自动化测试用例和手工用例的区别 1-4 自动化测试用例编写 1-5 selenium的优势以及 ...
- Selenium Web 自动化 - Selenium常用API
Selenium Web 自动化 - Selenium常用API 2016-08-01 目录 1 对浏览器操作 1.1 用webdriver打开一个浏览器 1.2 最大化浏览器&关闭浏 ...
- Selenium基础知识 自动登录QQ空间
Selenium基础知识 自动登录QQ空间 from selenium import webdriver import timedef auto_login():driver = webdriver. ...
- 好程序员web前端教程分享web前端入门基础知识
好程序员web前端教程分享web前端入门基础知识,作为合格的Web前端工程师必须得掌握HTML.CSS和JavaScript.只懂其中一两个还不行,必须对这三门语言都要熟悉.下面我们一起来看一看吧! ...
- 网页编程从入门到精通 杨凡_干货 | web前端入门基础知识
一名合格的web前端工程师必须得掌握HTML.CSS和JavaScript. 只懂其中一个或两个还不行,你必须对这三门语言都很熟悉. 也不是说必须对这三门语言都非常精通,但你至少要能够运用它们完成大多 ...
- web前端开发基础知识_前端开发是什么?学前端开发需要学什么语言?你想成为程序员吗?...
Web前端是什么 前端的本质就是通过一定的程序代码来实现用户界面的ui 交互.可以认为用户在终端所看到的和所操作的都属于前端,也就是说分为渲染页面和处理用户操作两块. 前端开发是创建Web页面或app ...
- web前端开发基础知识_薪资30K+的web前端怎么做到的?
好的web前端年薪会有多少?首先,我们要知道怎么才能成为一个所认为的"好的web前端",其次,自己能值多少价值? 用户体验为王,是互联网时代的座右铭.人们在享受互联网带来的便捷的同 ...
- Web自动化selenium技术快速实现爬虫
selenium是大家众所周知的web自动化测试框架,主要用来完成web网站项目的自动化测试,但其实如果要实现一个web爬虫,去某些网站爬取数据,其实用selenium来实现也很方便. 比如,我们现在 ...
- 移动web开发入门—基础知识、自适应布局、调试
之前没做过移动端web开发,最近接手的一个小项目是做微信公众号,需要考虑手机适配.UI给出的设计稿是一般是基于iphone手机做的(15年之后是基于ipone6),我们的UI是基于iphone6来做的 ...
- selenium基础知识大全(转)
自动化测试基础 1.软件测试分类 根据项目流程:单元测试(编码).集成测试(设计).系统测试(需求).验收测试 根据代码是否可见:白盒测试.黑盒测试.灰盒测试 功能测试:逻辑功能测试.界面测试.易用性 ...
最新文章
- 人工智能军事对抗技术发展趋势
- PowerShell 学习笔记——运行命令
- 一条正确的Java职业生涯规划,顺利拿到offer
- You have not accepted the license agreements of the following SDK components
- 从pg_hba.conf文件谈谈postgresql的连接认证
- 《团队激励与沟通》第 8 讲——团队合作技巧 重点部分总结
- python36 mysql_python-day36(初识MySQL数据库)
- android程序表白,几条曲线构建Android表白程序
- 【转】QTableView 小结
- dup和dup2详解
- Nmap命令参数介绍
- 生信技能树 WES分析教程学习(1)conda安装软件,配置环境
- 广搜算法之翻转棋子游戏
- 集成运算放大器之微分电路搭建
- Java后台给PDF加水印并且合并多个PDF文件
- 小程序AppId-当前开发者未绑定此AppId,请到小程序管理后台操作后重试
- 我的编程之路点滴记录(二)
- 计算器程序java开方运算_模拟计算器java程序
- 16比9尺寸是多少厘米_16比9(16比9分辨率大全)
- Fluke 726 高精度多功能过程校准器具体参数