Selenium—获取页面的title,url;使用句柄方式切换窗口

摘要:
获取当前页面的标题。红色框中是页面的标题。获取当前页面的url。红色框中是页面的url。获取方法:driver.current_Url示例:fromseniumimportwebdriver=webdriver。Chrome()驱动程序。explicily_等待(10)#打开百度主页驱动程序。获取('http://baidu.c
获取当前页面的 title

Selenium—获取页面的title,url;使用句柄方式切换窗口第1张

  • 红框内即为页面的 title

  • 获取方法:driver.title

 

获取当前页面的 url

Selenium—获取页面的title,url;使用句柄方式切换窗口第2张

  • 红框内即为页面的 url
  • 获取方法:driver.current_url

示例:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)

# 打开百度首页
driver.get('http://baidu.com')

# 打印当前窗口的 title
print(driver.title)

# 打印当前窗口的 url
print(driver.current_url)

driver.quit()

输出结果如下:

百度一下,你就知道

https://www.baidu.com/
窗口切换

  我们在使用浏览器打开链接时,通常会存在2种情况

    1. 在当前窗口打开,即覆盖
    2. 新建窗口打开,保留原有窗口

示例:

  1. 百度首页搜索:博客园
  2. 打开博客园官网,获取当前页精华帖的标题
  3. 回到百度输入框,并打印出 title

代码如下:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)

# 打开百度首页
driver.get('http://baidu.com')

# 输入 博客园 并点击 回车
driver.find_element_by_id('kw').send_keys('博客园
')

# 找到博客园的官网,并点击;点击后会在新的窗口打开链接
driver.find_element_by_xpath("//h3//a[contains(.,'官网')]/../a[1]").click()

# 打印当前窗口的 title
print(driver.title)

# 打印当前窗口的 url
print(driver.current_url)

# 点击博客园的 精华 贴
driver.find_element_by_css_selector('a[title="编辑精选博文"]').click()

......

输出结果如下:

博客园_百度搜索

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%8D%9A%E5%AE%A2%E5%9B%AD&rsv_pq=fb7d28ae0001abcf&rsv_t=06598quU7hn3kFKgkuBxhCIOyMaWnFVVXEjwlgeJppBhRahvfl8rUTZcZVQ&rqlang=cn&rsv_enter=1&rsv_sug3=3&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=348&rsv_sug4=348

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"a[title="编辑精选博文"]"}
# 报错信息,未定位到该元素

浏览器实现结果

Selenium—获取页面的title,url;使用句柄方式切换窗口第3张

  通过浏览器的实现结果,和代码的运行结果,可以判断出:即使web页面已跳转至新窗口,但是代码逻辑还在原有窗口

  为解决该问题,我们需要引入 句柄 的概念:窗口句柄 ,粗略的理解,每个窗口对应一个句柄,句柄可认为是一个唯一长字符串

获取句柄的方法:

  • 获取当前页面句柄:driver.current_window_handle
  • 获取所有页面句柄:driver.window_handles

通过句柄,我们可以进行窗口的切换:

  • 切换窗口:driver.switch_to.window()

示例:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)

# 打开百度首页
driver.get('http://baidu.com')

# 输入 博客园 并点击 回车
driver.find_element_by_id('kw').send_keys('博客园
')

# 找到博客园的官网,并点击;点击后会在新的窗口打开链接
driver.find_element_by_xpath("//h3//a[contains(.,'官网')]/../a[1]").click()

# 打印出所有的句柄信息
print(driver.window_handles)

driver.quit()

输出结果如下:

['CDwindow-998407BA3D6B34956871D337B6F377FE', 'CDwindow-844FF13AAEE0E14487AD368DEAA7A0AE']

# 从结果中我们可以看出:
# driver.window_handles的数据类型是一个 列表

让我们回到上面的需求:此时我们唯一要做的就是,打开新的窗口后,代码切换至新窗口,并输出结果

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)

# 打开百度首页
driver.get('http://baidu.com')

# 输入 博客园 并点击 回车
driver.find_element_by_id('kw').send_keys('博客园
')

# 找到博客园的官网,并点击;点击后会在新的窗口打开链接
driver.find_element_by_xpath("//h3//a[contains(.,'官网')]/../a[1]").click()

# 打印当前窗口的 title
print('切换前的title:',driver.title)

# 切换至新窗口
# 首先,我们要先获取到一个主句柄,作为灯塔,防止"迷路"
mainWindow = driver.current_window_handle

# 接着我们要获取所有的句柄信息,并赋值给 handles
handles = driver.window_handles

# 使用for循环,遍历所有的handles,以便判断
for handle in handles:
    # 使用driver.switch_to.window()方法,切入句柄所在的窗口
    driver.switch_to.window(handle)

    # 判断 "代码" 是否在当前窗口的title中,如果在,跳出循环
    if "代码" in driver.title:
        break

# 让我们打印一下当前窗口的 title
print('切换后的title:',driver.title)

# 点击博客园的 精华 贴
driver.find_element_by_css_selector('a[title="编辑精选博文"]').click()

# 定位到标题的元素,并赋值给 items
items = driver.find_elements_by_css_selector('div[class="post_item"] h3>a')

for one in items:
    print(one.text)

# 打印完成后,切回主窗口,并打印出当前窗口的 title
driver.switch_to.window(mainWindow)
print('切回主句柄的title:',driver.title)

输出结果如下:

切换前的title: 博客园_百度搜索
切换后的title: 博客园 - 代码改变世界

------------------2019-5-30 前20的精华帖-----------------------------
【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看
【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)
为啥程序会有bug?
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
ERP不规范,同事两行泪
只有程序员才能读懂的西游记
从软件工程的角度解读任正非的新年公开信
通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。
分布式系统关注点——99%的人都能看懂的「熔断」以及最佳实践
神经网络的基本工作原理
哎呀,我老大写Bug啦——记一次MessageQueue的优化
机器学习web服务化实战:一次吐血的服务化之路
Windbg分析高内存占用问题
我是怎么把一个项目带崩的
彼之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践
Linux的内存分页管理
通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
藏在正则表达式里的陷阱
你所不知道的日志异步落库
为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?


切回主句柄的title:博客园_百度搜索

免责声明:文章转载自《Selenium—获取页面的title,url;使用句柄方式切换窗口》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于mirror driver的windows屏幕录像EndNote(一)之基本介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JSON.stringify 语法讲解 随风浪迹天涯 博客园

JSON.stringify 语法讲解 认识javascript也不短的时间了,可是这个用法说实在的,我还是第一次见过,惭愧啊惭愧啊。于是乎,在网上找了写资料,写了些例子 希望能给园子们一些帮助。 作用:这个函数的作用主要是为了系列化对象的。 可能有些人对系列化这个词过敏,我的理解很简单。就是说把原来是对象的类型转换成字符串类型(或者更确切的说是json...

使用Selenium和openCV对HTML5 canvas游戏进行自动化功能测试(一)

上一篇讲了HTML5 canvas游戏的基本工作原理,接下来讲如何进行自动化功能测试。 Selenium是一个跨平台的跨浏览器的对网页进行自动化测试的工具。从Selenium 2.0开始Selenium就和WebDriver合体了。如果你还不了解Selenium怎么用,可以看看官网上的例子。Selenium支持各种语言的binding,方便起见,下面的测试...

Windows系统中CreateFileMapping实现的共享内存及用法

在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模式。 每个进程都有独立的4GB逻辑地址空间,32位的Windows系统允许每一个进程独立访问自己的内存,即独立于其它进程,也即它自己的32位逻辑地址空间。操作...

python---win32gui、win32con、win32api:winAPI操作

python操作winAPI 窗口操作: import sys from PyQt5.QtWidgets import QApplication, QWidget from lianxi import Ui_Form from PyQt5.QtCore import Qt import win32gui #winAPI模块--以便于操作窗口 cla...

MyBatis(五)MyBatis动态SQL

MyBatis 目录 MyBatis(一)MyBatis初识 - 青杉 - 博客园 (cnblogs.com) MyBatis(二)MyBatis标签 - 青杉 - 博客园 (cnblogs.com) MyBatis(三)MyBatis resultMap和注解 - 青杉 - 博客园 (cnblogs.com) MyBatis(四)MyBatis关联(级...

博客园—2D小人物

博客园—2D小人物 人物样式大全 https://huaji8.top/post/live2d-plugin-2.0/ 作者github https://github.com/EYHN/hexo-helper-live2d/blob/master/README.zh-CN.md 怎么使用? 首先我们的目的是想要把这个动态的小人添加到我们的博客园,那首先得注...