首页 > 技术文章 > selenium-handle和iframe操作

shukeshu 2021-08-28 14:56 原文

 1 '''
 2     网易云音乐QQ登录
 3     http://music.163.com
 4 '''
 5 from time import sleep
 6 
 7 from selenium import webdriver
 8 
 9 # 创建webdriver
10 from selenium.webdriver.common.by import By
11 
12 driver = webdriver.Chrome()
13 # 访问url
14 driver.get('http://music.163.com')
15 driver.maximize_window()
16 print(driver.window_handles)
17 # 等待是为了让代码的运行成功率更高
18 sleep(2)
19 # 执行登录流程
20 driver.find_element('link text', '登录').click()
21 sleep(1)
22 driver.find_element('link text', '选择其他登录模式').click()
23 driver.find_element('id', 'j-official-terms').click()
24 driver.find_element('link text', 'QQ登录').click()
25 # 句柄的处理
26 '''
27     在计算机世界中,不同的标签页,是通过不同的字符串来区分。可以理解为id,统一称之为句柄
28     通过selenium操作的标签页,在不切换的情况下,只会一直聚焦在第一个页面。
29     如果要操作新的句柄页,切换句柄就可以了。
30     原则:
31         1. 在selenium自动化时,尽可能保持有,且最多仅有两个页面存在。
32         2. 如果页面会自行关闭,就不需要额外执行close(特定业务)
33         3. 如果自动关闭后,仍需要操作其他页面,则需要切换句柄。
34 '''
35 
36 # 切换句柄
37 handles = driver.window_handles  # 获取当前所有的句柄
38 # driver.close()  # 关闭当前句柄页
39 driver.switch_to.window(handles[1])  # 切换到第二个句柄页
40 print(handles)
41 
42 sleep(3)
43 # 操作第二个句柄页
44 # print(driver.title)
45 # driver.find_element('link text', 'QQ登录').click()
46 # handles = driver.window_handles
47 # print(handles)
48 
49 
50 '''
51     iframe是一个窗体,内嵌页面,本身是一个独立的html页面存在。本质上是套娃。
52     对于iframe内的元素如果要操作,是没有办法直接定位的。
53     当你如果遇到死活定位不到的元素,就检查一下是不是一个iframe,如果是,则切换iframe后再操作
54     iframe在切换进去之后,就只可以操作iframe中的内容,iframe以外的内容无法操作。如果要操作原窗体内容,需要重新返回默认窗体
55 '''
56 # 切换iframe:有id就直接传入id即可,没有id,就通过元素定位,传递元素进去
57 frame = driver.find_element('id', 'ptlogin_iframe')
58 driver.switch_to.frame(frame)
59 # 执行QQ快捷登录
60 driver.find_element('id', 'img_out_508419907').click()
61 sleep(2)
62 # 返回默认窗体。
63 # driver.switch_to.default_content()
64 
65 handles = driver.window_handles
66 print(handles)
67 driver.switch_to.window(handles[0])
68 print(driver.title)

 

推荐阅读