Selenium页面跳转后的元素定位-switch_to.window()
背景:
在使用Selenium获取网页数据时常常会因为页面跳转导致,后续的页面数据无法正常获取。究极原因,都是因为此时的页面对象还是上一个页面,使用当前页面的定位条件当然会报错(因为上一个页面根本不存在这些定位条件)。因此我们可以通过switch_to.window()进行页面的切换。
使用方法
switch_to.window()存在以下几种用法,下面是详细示例讲解:
URL:http://www.gjgwy.net/zkzx/gjgwy/345695.html(公考资料网)
driver.switch_to.window(driver.window_handles[-1]) 定位到最新打开窗口
driver.switch_to.window(driver.window_handles[-2]) 定位到倒数第二个窗口
driver.switch_to.window(driver.window_handles[0]) 定位最开始的页面
1、driver.switch_to.window(driver.window_handles[-1]) 定位到最新打开窗口
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
url='http://www.gjgwy.net/zkzx/gjgwy/345695.html'
# 初始实例化-谷歌浏览器
driver=webdriver.Chrome()
#获取网址信息
driver.get(url)
#判断是否有弹窗,存在弹窗则关闭,没有继续执行即可
try:
driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
print("没有弹窗,继续执行")
# 点击浙江省份,查看浙江省的公考信息,实现页面跳转,打开新的页面。
driver.find_element(By.XPATH, '/html/body/div[4]/div/div[2]/a[2]').click()
time.sleep(2)
# 定位到新开页面
driver.switch_to.window(driver.window_handles[-1])
time.sleep(2)
# 判断是否存在弹窗,存在就获取弹窗,然后关闭;
#若网页刷新速度很慢,弹窗未出,就已经拿到元素信息,就不需要关闭弹窗;
try:
driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
print("没有弹窗,继续执行")
next_page =driver.find_element(By.XPATH,'/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]')
print(next_page.text)
time.sleep(1000)
# 关闭页面
driver.close()
此时next_page获取的值即为打开的第二个页面上的元素值,而非第一个页面的。
*next_page=【职位表】2022年辽宁公务员考试职位表*
倘若把切换窗口的代码注释掉,则会上报错误提示不存在的定位信息,如下:
# driver.switch_to.window(driver.window_handles[-1])
D:\workplace\venv\Scripts\python.exe D:\workplace\venv\Scripts\tietie.py
Traceback (most recent call last):
File "D:\workplace\venv\Scripts\tietie.py", line 19, in <module>
next_page=driver.find_element(By.XPATH,'/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\workplace\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 861, in find_element
return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\workplace\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 444, in execute
self.error_handler.check_response(response)
File "D:\workplace\venv\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 249, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]"}
(Session info: chrome=105.0.5195.102)
Stacktrace:
Backtrace:
Ordinal0 [0x0029DF13+2219795]
Ordinal0 [0x00232841+1779777]
Ordinal0 [0x0014423D+803389]
Ordinal0 [0x00173025+995365]
Ordinal0 [0x001731EB+995819]
Ordinal0 [0x001A0F52+1183570]
Ordinal0 [0x0018E844+1108036]
Ordinal0 [0x0019F192+1175954]
Ordinal0 [0x0018E616+1107478]
Ordinal0 [0x00167F89+950153]
Ordinal0 [0x00168F56+954198]
GetHandleVerifier [0x00592CB2+3040210]
GetHandleVerifier [0x00582BB4+2974420]
GetHandleVerifier [0x00336A0A+565546]
GetHandleVerifier [0x00335680+560544]
Ordinal0 [0x00239A5C+1808988]
Ordinal0 [0x0023E3A8+1827752]
Ordinal0 [0x0023E495+1827989]
Ordinal0 [0x002480A4+1867940]
BaseThreadInitThunk [0x7728FEF9+25]
RtlGetAppContainerNamedObjectPath [0x77447BBE+286]
RtlGetAppContainerNamedObjectPath [0x77447B8E+238]
(No symbol) [0x00000000]
2、driver.switch_to.window(driver.window_handles[-2]) 定位到倒数第二个窗口
此时我们在上面的基础上,在跳转一个页面,来实现打开三个窗口的情况。
当然此时,不用driver.switch_to.window(driver.window_handles[-1]),这条指令,此时的页面指向也是第二个页面,如下,但是为了展示[-2]的作用,在这里先把页面定位到最新的窗口,然后再通过命令定位到倒数第二个页面。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
url='http://www.gjgwy.net/zkzx/gjgwy/345695.html'
# 初始实例化-谷歌浏览器
driver=webdriver.Chrome()
#获取网址信息
driver.get(url)
try:
driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
print("没有弹窗,继续执行")
# 点击浙江省份,查看浙江省的公考信息,实现页面跳转,打开新的页面。
driver.find_element(By.XPATH, '/html/body/div[4]/div/div[2]/a[2]').click()
# 定位到新开页面
driver.switch_to.window(driver.window_handles[-1])
time.sleep(5)
# 判断是否存在弹窗,存在就获取弹窗,然后关闭;
#若网页刷新速度很慢,弹窗未出,就已经拿到元素信息,就不需要关闭弹窗;
try:
driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
print("没有弹窗,继续执行")
time.sleep(2)
# 跳转到第三个页面
driver.find_element(By.XPATH, '/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]').click()
# 定位到最新的第三个页面上
driver.switch_to.window(driver.window_handles[-1])
# 输出最新页面上的信息
e=driver.find_element(By.XPATH,'/html/body/div[10]/div[1]/div[1]/div[2]')
print(e.text)
# 通过命令定位到倒数第二页面
driver.switch_to.window(driver.window_handles[-2])
# 输出倒数第二个页面的信息
a=driver.find_element(By.XPATH,'/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]')
print(a.text)
time.sleep(1000)
# 关闭页面
driver.close()
输出结果为:
#第三个页面的信息
2022年辽宁省考试录用公务员公告及职位表现已发布,报名时间为2022年2月18日9时至2月22日24时,笔试时间为2022年3月26日、27日。
点击下载:2022年辽宁省考试录用公务员职位表(提取码:2h97)
2022年辽宁公务员考试职位表
上一篇: 2022年河南公务员考试网站及政策咨询电话
下一篇: 2022年辽宁公务员考试报考指南
#倒数第二个页面的信息
【职位表】2022年辽宁公务员考试职位表
3、driver.switch_to.window(driver.window_handles[0]) 定位最开始的页面
还是沿用上面的,三个页面状态,直接定位到第一个页面上的信息。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
url='http://www.gjgwy.net/zkzx/gjgwy/345695.html'
# 初始实例化-谷歌浏览器
driver=webdriver.Chrome()
#获取网址信息
driver.get(url)
#存在弹窗即可关闭,不存在继续执行
try:
driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
print("没有弹窗,继续执行")
# 点击浙江省份,查看浙江省的公考信息,实现页面跳转,打开新的页面。
driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/a[2]').click()
time.sleep(2)
# 定位到新开页面
driver.switch_to.window(driver.window_handles[-1])
time.sleep(5)
# 判断是否存在弹窗,存在就获取弹窗,然后关闭;
#若网页刷新速度很慢,弹窗未出,就已经拿到元素信息,就不需要关闭弹窗;
try:
driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
print("没有弹窗,继续执行")
# 跳转到第三个页面
driver.find_element(By.XPATH,'/html/body/table[1]/tbody/tr[1]/td[2]/div/div/ul/li[2]').click()
# 定位到最新的第三个页面上
driver.switch_to.window(driver.window_handles[-1])
# 输出最新页面上的信息
e=driver.find_element(By.XPATH,'/html/body/div[10]/div[1]/div[1]/div[2]')
print(e.text)
# 通过命令定位到最开始的窗口
driver.switch_to.window(driver.window_handles[0])
# 若存在弹窗,则关掉
try:
driver.find_element(By.XPATH, '//*[@id="close_alert"]').click()
except:
print("没有弹窗,继续执行")
# 输出最开始窗口的信息
a=driver.find_element(By.XPATH,'/html/body/div[4]/div/div[2]/a[2]')
print(a.text)
time.sleep(1000)
# 关闭页面
driver.close()
输出结果为:文章来源:https://www.toymoban.com/news/detail-405884.html
D:\workplace\venv\Scripts\python.exe D:\workplace\venv\Scripts\tietie.py
#最后页面的信息
2022年辽宁省考试录用公务员公告及职位表现已发布,报名时间为2022年2月18日9时至2月22日24时,笔试时间为2022年3月26日、27日。
点击下载:2022年辽宁省考试录用公务员职位表(提取码:2h97)
2022年辽宁公务员考试职位表
上一篇: 2022年河南公务员考试网站及政策咨询电话
下一篇: 2022年辽宁公务员考试报考指南
#最开始页面信息
辽宁
总结
在执行测试过程中会存在两个细节但是影响进程的问题:
1、进入一个新页面,有可能存在弹窗的情况,如果存在弹窗,那么当前页面就会定位在弹窗上,那一定不是你想要的元素,因此,我们可以关闭它,之后再继续执行。
2、执行过程中发现,有的时候,代码,元素条件都没有问题,但是就是报错,这是有可能网速的问题,我们要学会善用time.sleep这个语句,预留充足的时间可以继续执行。文章来源地址https://www.toymoban.com/news/detail-405884.html
到了这里,关于Selenium页面跳转后的元素定位-switch_to.window()使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!