Selenium系列(3)- 浏览器操作_句柄 selenium操作浏览器方式~

访问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)

运行结果如下:

Selenium系列(3)- 浏览器操作_标签页_02

???? 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后要继续对原页面操作的话也需要切换原页面呀

幸运交给锦鲤,你只管努力就好