访问URL
访问URL可通过driver.get()
方式
# 打开百度页面
driver.get("https://www.baidu.com/")
前进、后退、刷新
提供了back()
forward()
refresh()
方法,可实现浏览器网页之间的后退和前进
# 页面回退
driver.back()
# 页面前进
driver.forward()
# 页面刷新
driver.refresh()
控制浏览器窗口大小
selenium可将浏览器设置成想要的大小、位置等
# 设置大小,参数为数字,表示窗口像素大小
driver.set_window_size(520, 520)
# 设置窗口坐标
driver.set_window_position(30,30)
# 可同时设置窗口大小、位置等
driver.set_window_rect(40,80,400,800)
# 控制浏览器窗口最大化
driver.maximize_window()
#获取窗口大小
driver.get_window_size()
#获取当前窗口坐标
driver.get_window_position()
# 同时获取位置和窗口大小
driver.get_window_rect()
获取页面title、url
有时可通过获取页面URL、title等来判断目标页面是否被正常打开,webdriver同样也提供了对应的方法
#获取当前页面的URL
print(driver.current_url)
#获取当前页面的标题
print(driver.title)
打开、关闭标签页
# 打开新的标签页
js = 'window.open("https://www.baidu.com")'
driver.execute_script(js)
# 通过切换句柄(后面有介绍),达到切换标签页
# 获取当前页面句柄
print(driver.current_window_handle)
# 获取浏览器所有标签页句柄
windows = driver.window_handles
print(windows)
# 切换标签页
driver.switch_to.window(windows[-1])
# 关闭当前标签页
driver.close()
???? ATTENTION:
- 打开新的标签页只能通过
js
来操作 - 通过切换句柄的方式可达到切换标签页的作用
滚动页面
由于selenium并未提供直接控制浏览器滚动的方法,所以需要通过driver.execute_script()
来执行js,以此达到滚动浏览器的目的
scrollBy(x,y)
参数说明:
-
X:必传,为正则向右滑动,为负则向左滑动
-
Y:必传,为正则向下滑动,为负则向上滑动
-
X、Y均为像素值
driver.execute_script("window.scrollBy(0,1000)")
scrollTo(x,y)
参数说明:
- x:必传,为正则向右滑动,为负则向左滑动
- y:必传,为正则向下滑动,为负则向上滑动
- X、Y均为像素值
driver.execute_script("window.scrollTo(0,1000)")
document.documentElement.scrollTop
获取当前滚动高度
# 获取当前滚动高度
scrolTop = driver.execute_script("document.documentElement.scrollTop")
设置滚动高度
# 设置滚动高度
driver.execute_script("document.documentElement.scrollTop=1000")
网页frame与多窗口处理
多窗口处理
出现场景:打开链接,跳转新窗口,针对这种情况,若想在新窗口进行操作,就需要切换窗口
解决方案:获取窗口的唯一标识句柄标识,切换句柄就可达到切换窗口的目的
处理流程:
-
driver.current_window_handle
获取当前窗口的句柄 -
driver.window_handles
获取所有的窗口句柄 -
driver.switch_to_window
跳转至对应窗口
依旧以百度首页为例:点击登录->立即注册,跳转注册页面,输入用户名等
def test_window(self):
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_link_text("登录").click()
# 获取所有窗口列表
print(self.driver.window_handles)
# 打印当前窗口
print(self.driver.current_window_handle)
self.driver.find_element_by_link_text("立即注册").click()
# 获取所有窗口列表
print(self.driver.window_handles)
# 打印当前窗口
print(self.driver.current_window_handle)
self.driver.find_element_by_name("userName").send_keys("username")
sleep(5)
不切换句柄,打印的结果如下:
['CDwindow-66A675AF3A2FC4E84E31B1F02477EB7D']
CDwindow-66A675AF3A2FC4E84E31B1F02477EB7D
['CDwindow-66A675AF3A2FC4E84E31B1F02477EB7D', 'CDwindow-6B1868BBED3EB49AEDCD1B16275ACC15']
CDwindow-66A675AF3A2FC4E84E31B1F02477EB7D
从打印结果可以看出,点击立即注册之后跳转了新页面,但是当前页面依旧停留在CDwindow-66A675AF3A2FC4E84E31B1F02477EB7D
这个页面,所以新页面的输入用户名操作是无效的
加上切换句柄操作后,在新页面-注册页面输入用户名成功
def test_window(self):
self.driver.get("https://www.baidu.com/")
self.driver.find_element_by_link_text("登录").click()
# 获取所有窗口列表
print(self.driver.window_handles)
# 打印当前窗口
print(self.driver.current_window_handle)
self.driver.find_element_by_link_text("立即注册").click()
# 获取所有窗口列表
windows_all = self.driver.window_handles
# 切换至新窗口(由于目前只有两个窗口,直接切换至列表最后一个窗口即可)
self.driver.switch_to_window(windows_all[-1])
self.driver.find_element_by_name("userName").send_keys("username")
sleep(5)
运行结果如下:
???? ATTENTION:对哪个页面进行操作一定要切换至对应的页面
网页frame
场景:web自动化中,有时定位不到网页元素,有可能这个元素存在于iframe中
关于frame:
-
什么是frame?
- 即HTML框架,在HTML中,框架可以在同一个浏览器中显示不止一个页面
- 基于HTML框架,可分为垂直框架和水平框架(cols、rows)
-
frame分类:可分为frameset、frame、iframe
- frameset和普通标签一样,不影响正常定位
- frame、iframe对selenium定位是一样的,selenium有一组方法对frame进行操作
- frame存在两种:嵌套的和非嵌套的
切换frame方式:
# 根据元素id或者index切换
driver.switch_to.frame()
driver.switch_to_frame()
# 切换到默认的frame
driver.switch_to_default_content()
# 切换到父级frame
driver.switch_to_parent_frame()
处理未嵌套的frame:直接通过frame的ID或索引来切换
driver.switch_to.frame("frame的ID值")
# 无ID时根据索引来处理
# 索引从0开始
driver.switch_to.frame("frame的index值")
处理嵌套的frame:先切换至父节点,再切换至子节点
driver.switch_to.frame("父节点")
driver.switch_to.frame("子节点")
???? ATTENTION:切换frame后要继续对原页面操作的话也需要切换原页面呀