认识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切换没有找到合适的练习对象且不太常用,就不做演示了。
扫码关注公众号‘自动化测试研习社’
一起变强