Selenium09--Webdriver的高级操作(三)JS操作&三种切换

认识JavaScript(JS)

  • JavaScript是运行在浏览器上的脚本语言,简称JS。

  • JavaScript和java没有任何关系,只是语法类似。

  • JS本身和selenium无关。

  • 通过selenium执行JS代码可以让我们的操作更加丰富,理论上一个HTML的所有行为都可以通过JS来控制

  • selenium中常用JS的基础语法和DOM操作

学习地址:https://www.w3school.com.cn/js/js_htmldom.asp

console窗口执行JS代码

在网页中按F12,打开console窗口就可以执行JS代码了。

几个常用方法:

  • alert():弹出一个alert对话框,只有确定

  • confirm():弹出一个alert对话框,有确定和取消

  • prompt('请输入公众号名字'):弹出一个alert对话框,有文本框、确定和取消

  • window.open():打开网页

window.open('https://cn.bing.com/')--打开必应

  • return document.title

在console窗口中直接执行document.tile即可,代码中想要获取title需要加上return

定位元素

  • 定位方法:

getElementById:通过id的值定位

getElementsByClassName:通过class的值定位

getElementsByName:通过元素的名字定位

getElementsByTagName:通过元素的标签定位

querySelector:通过css选择器定位(1个)

querySelectorAll:通过css选择器定位(多个)

  • 用法

document.方法

操作元素

  • 清空原来的内容,写入新的内容

元素.value=值

  • 点击元素

元素.click()

点击必应上的‘国际版’按钮

  • 修改元素属性

用法:元素.属性名=新的属性值

比如常用的,修改密码栏的属性为‘text’,使密码可见

document.getElementById('password').type='text'

  • 移除元素的某个属性

元素.removeAttribute(属性名)

移除‘打开新窗口’的属性:

ele.removeAttribute('target')

  • 滚动条操作

window.scrollTo(x,y)

document.body.scrollWidth:页面宽度

document.body.scrollHeight:页面高度

selenium中执行JS代码

在豆瓣官网上练习下上述方法

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
#1.打开豆瓣官网
driver.get('https://www.douban.com/')
sleep(2)
#2.返回网页的title和url
title = 'return document.title'#return不能少
url = 'return document.URL'
print('网页标题:'+driver.execute_script(title))
print('网页地址:'+driver.execute_script(url))
#3.滑动到网页右下角
x = 'return document.body.scrollWidth'
X = driver.execute_script(x)#获取网页最大宽度
y = 'return document.body.scrollHeight'
Y = driver.execute_script(y)#获取网页最大高度
driver.execute_script(f'window.scrollTo({X},{Y})')
sleep(2)
#4.找到搜索框,并滑动到按钮可见
ele1 = driver.find_element_by_css_selector("#anony-nav input[name='q']")
driver.execute_script('arguments[0].scrollIntoView()',ele1)
#此处的arguments[0]等于ele1
sleep(2)
#5.修改搜索框的placeholder属性
#先找到搜索框
ele2 = 'ele=document.querySelector("#anony-nav>div.anony-srh>form>span.inp>input[type=text]")'
#修改placeholder的值
js1 = 'ele.placeholder="自动化测试研习社"'
driver.execute_script(ele2)
driver.execute_script(js1)
sleep(2)
#6.移除属性
#直接移除搜索框的placeholder属性
driver.execute_script("ele.removeAttribute('placeholder')")

总结下:

1.JS代码最好先在console窗写好(有自动补齐),再复制到代码里

2.selenium中执行JS代码用execute_script方法

3.获取document属性时不要忘了加return

三种切换

window切换

当打开多个窗口时,会经常需要来回切换窗口

一般情况下,想切换到新打开的窗口,直接获取当前所有窗口列表,选择最后一个即可

from time import sleep
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
#点击‘贴吧’按钮,打开新窗口
driver.find_element_by_css_selector('#s-top-left>a:nth-child(4)').click()
sleep(3)#这用sleep不可靠,可能会打开很慢,之后文章介绍稳定的等待(显示等待)
handles = driver.window_handles
driver.switch_to.window(handles[-1])#切换到新打开的贴吧页
driver.switch_to.window(handles[0])#切换回首页

上述方法在大多数情况下可用

但有时候会出现新打开的窗口不是最后一个元素的情况,就需要我们用其他方式找一下新窗口。

from time import sleep
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
#记住之前打开的窗口
old_handles = driver.window_handles
#点击‘贴吧’按钮,打开新窗口
driver.find_element_by_css_selector('#s-top-left>a:nth-child(4)').click()
sleep(3)#这用sleep不可靠,可能会打开很慢,之后文章介绍稳定的等待(显示等待)
new_handles = driver.window_handles
#遍历新的窗口列表
for win in new_handles[::-1]:#一般都是倒数的,所以从后面遍历
    if win not in old_handles:#不在旧列表中,则是新的
        driver.switch_to.window(win)
        break

alert切换

用法1:

driver.switch_to_alert.方法

方法有三种:

  • accept() #确定

  • dismiss() #取消

  • send_keys() #输入内容

用法2:

导入Alert模块

from selenium.webdriver.common.alert import Alert

Alert(driver).方法

frame切换

用法:

driver.switch_to.frame(reference)

reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象

通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位

  • index从0开始

  • WebElement对象,即用find_element系列方法所取得的对象


alert切换和frame切换没有找到合适的练习对象且不太常用,就不做演示了。

扫码关注公众号‘自动化测试研习社’

一起变强

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值