首先描述一下问题:
自动化QQ邮箱登录,账户密码输入后跳转到验证界面,此时需要定位元素却怎么也定位不到:
账户密码输入有问题的请参考:无法定位元素的问题
代码如下:
browser = webdriver.Firefox()
browser.get("https://mail.qq.com/")
browser.switch_to.frame("login_frame")
browser.find_element_by_class_name("inputstyle").clear()
browser.find_element_by_class_name("inputstyle").send_keys("xxxx")
browser.find_element_by_class_name("inputstyle.password").clear()
browser.find_element_by_class_name("inputstyle.password").send_keys("xxxx")
browser.find_element_by_id("login_button").click()
browser.find_element_by_class_name("login_button").click()
# browser.switch_to.default_content() # 回到默认的iframe
# 等待资源加载
time.sleep(3)
# 等待图片加载出来
browser.find_element_by_id('tcaptcha_drag_button').click()
页面元素如下:
但是报错:NoSuchElementException
再仔细查找一下,发现最靠近该元素的iframe是另一个
修改代码,先回到默认iframe,再到新的iframe:
browser = webdriver.Firefox()
browser.get("https://mail.qq.com/")
browser.switch_to.frame("login_frame")
browser.find_element_by_class_name("inputstyle").clear()
browser.find_element_by_class_name("inputstyle").send_keys("xxxx")
browser.find_element_by_class_name("inputstyle.password").clear()
browser.find_element_by_class_name("inputstyle.password").send_keys("xxxx")
browser.find_element_by_id("login_button").click()
browser.find_element_by_class_name("login_button").click()
browser.switch_to.default_content() # 回到默认的iframe
# 等待资源加载
time.sleep(3)
browser.switch_to.frame("tcaptcha_iframe")
browser.find_element_by_id('tcaptcha_drag_button').click()
就会报错:NoSuchFrameException
这会都要炸掉了!歇一会硬着头皮查一下iframe:
首先看一下iframe:
iframe 标签规定了一个内联框架。
一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。
平行嵌套:
层级嵌套:
这一看就明白了:tcaptcha_iframe嵌套在login_frame中,因此上面的代码不用回到默认iframe,直接再进一层就好了:
browser = webdriver.Firefox()
browser.get("https://mail.qq.com/")
browser.switch_to.frame("login_frame")
browser.find_element_by_class_name("inputstyle").clear()
browser.find_element_by_class_name("inputstyle").send_keys("xxxx")
browser.find_element_by_class_name("inputstyle.password").clear()
browser.find_element_by_class_name("inputstyle.password").send_keys("xxxx")
browser.find_element_by_id("login_button").click()
browser.find_element_by_class_name("login_button").click()
#browser.switch_to.default_content() # 回到默认的iframe
# 等待资源加载
time.sleep(3)
browser.switch_to.frame("tcaptcha_iframe")
browser.find_element_by_id('tcaptcha_drag_button').click()
运行成功!开始下一步!