弹出框有几种类型,一般为alart, iframe, windows(包括可直接识别的div,还有不能能直接识别的),下面我们以百度首页为例,看看这几种弹出框如何识别。
假设现在要在百度首页点击登录按钮
等如下窗口弹出来后, 点击qq图标转向qq登录
然后,页面会跳转到第3方窗口,在里面选择账户密码登录
然后在如下弹出框里输入用户名和密码
我们直接代码看下如何实现,注意,以下下代码仅仅证明可行性,未作任何优化,工程代码应该利用设计模式(PageObject)/分离元素和操作/封装重用类/定义错误处理。
import time from selenium import webdriver #打开首页,点击登录按钮 d = webdriver.Chrome() d.get("http://www.baidu.com") d.find_element_by_xpath(".//*[@id='u1']/a[@name='tj_login']").click() #jquery操作页面元素,点击qq账户登录。 #1. 这是弹出框问题的终极解决办法,一律用jquey直接操作页面元素,然后通过脚本执行 js_script ='''$("#pass_phoenix_btn .phoenix-btn-item")[0].click()''' time.sleep(2) d.execute_script(js_script) time.sleep(2) #切换到qq登录页面,并打印出当前页面以验证正确性。 #2. switch_to.window允许你跟弹出页面window交互。 for handle in d.window_handles: d.switch_to.window(handle) time.sleep(3) print(d.current_url) #分析页面元素,看出最终的账户登录是个iframe,找到这个iframe的id,切入到这个iframe,继续执行操作。 #3. iframe也可以用switch_to.frame直接操作。 element = d.find_element_by_xpath(".//*[@id='combine_page']/div[1]") d.switch_to.frame(element.find_element_by_id('ptlogin_iframe')) d.find_element_by_xpath(".//*[@id='switcher_plogin']").click()