弹出框有几种类型,一般为alart, iframe, windows(包括可直接识别的div,还有不能能直接识别的),下面我们以百度首页为例,看看这几种弹出框如何识别。
假设现在要在百度首页点击登录按钮
![](https://www.codeprj.com/image/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9Lcmp4cGVpYVpVUDZRaWFiZndxT2gyaWFaaWE5VGN5MUpSbUsxZ0VwSzM0c252aGgzTm5wenN0dGpzVTU4NDlOSE1iUFVPdjB5OUZPdldDQ3ROYmJyNkM4SUEvNjQwP3d4X2ZtdD1qcGVnJnRwPXdlYnAmd3hmcm9tPTUmd3hfbGF6eT0x.png)
等如下窗口弹出来后, 点击qq图标转向qq登录![](https://www.codeprj.com/image/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9Lcmp4cGVpYVpVUDZRaWFiZndxT2gyaWFaaWE5VGN5MUpSbUsya1VnZGdTT1ZkV2liRE9TTXpDTXVoUG5Yd0UxQ3lNbzRsamJ2RkhpYUo4SG9mOGhLWHZnUGRSZy82NDA_d3hfZm10PWpwZWcmdHA9d2VicCZ3eGZyb209NSZ3eF9sYXp5PTE=.png)
然后,页面会跳转到第3方窗口,在里面选择账户密码登录![](https://www.codeprj.com/image/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9Lcmp4cGVpYVpVUDZRaWFiZndxT2gyaWFaaWE5VGN5MUpSbUt6bjZNRzRnNHhkVjR2TU5oNVNvNzhMcXJVYjZkd0JOQmt0T00yR3FsNHNZdlloRE9lSGFUNkEvNjQwP3d4X2ZtdD1qcGVnJnRwPXdlYnAmd3hmcm9tPTUmd3hfbGF6eT0x.png)
然后在如下弹出框里输入用户名和密码
![](https://www.codeprj.com/image/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9Lcmp4cGVpYVpVUDZRaWFiZndxT2gyaWFaaWE5VGN5MUpSbUs5anE5cW12ekZMNU5FY3VMek9QaHAzYTM3UnlpYkFqRkxFb1NMaWJ0YjFVbEd4bDNyeU9OdTZjQS82NDA_d3hfZm10PWpwZWcmdHA9d2VicCZ3eGZyb209NSZ3eF9sYXp5PTE=.png)
我们直接代码看下如何实现,注意,以下下代码仅仅证明可行性,未作任何优化,工程代码应该利用设计模式(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()
|