在自动化测试过程中,有些情况下元素定位正常,但是脚本依然报错。这时很大可能是页面做了一些特殊处理,如页面中存在iframe标签等。本节进行表单切换案例实战。
单表单iframe的处理比较简单。如果iframe标签本身有可用的id或name属性,可以直接使用switch_to.iframe()方法去定位,如图2.23所示。
图2.23 单表单iframe标签案例界面
示例如下:
from selenium import webdrvier driver = webdriver.Chrome() driver.get('https://mail.qq.com/cgi-bin/loginpage') time.sleep(2) driver.switch_to.frame('login_frame') # 切换iframe标签 driver.find_element_by_name("email").send_keys('username') driver.find_element_by_name("password").send_keys('password') driver.find_element_by_id("login_button").click() driver.switch_to.default_content() # 退出iframe标签
在有些情况下,iframe标签在整个页面中不止一个,如嵌套的iframe标签,如图2.24所示。
图2.24 嵌套表单iframe标签案例界面
示例如下:
from selenium import webdrvier driver = webdriver.Chrome() driver.get('file:///E:/webdriver_api_demo/frame.html') time.sleep(2) # 先切换到最外层的iframe标签 driver.switch_to.frame('f1') # 再切换到第二个iframe标签 driver.switch_to.frame('f2') # 定位处在第二个iframe标签中的元素 driver.find_element_by_name("email").send_keys('username')
上述案例中,处理思路是:首先要切换到第一个iframe中,然后切换到第二个iframe标签,这样就可以正常定位到元素了。
在有些情况下,iframe标签在HTML页面中处于平行关系,如图2.25所示。
图2.25 平行表单iframe标签案例界面
场景:假设当前处在iframe1标签中,现在要操作的元素在iframe2中。处理思路是:首先从iframe1标签中退出,然后切换到iframe2中去操作元素。
示例如下:
from selenium import webdrvier driver = webdriver.Chrome() driver.get('file:///E:/webdriver_api_demo/frame.html') time.sleep(2) # 默认在iframe1标签 driver.switch_to.frame('osslog_iframe') # 退出iframe1标签 driver.switch_to.default_content() # 切换到iframe2标签 driver.switch_to.frame('actionFrame') # 操作iframe2标签下的元素 driver.find_element_by_name("email").send_keys('username')
注意:无论进入几层iframe标签,执行一次退出操作,即是最外层。
当iframe标签本身id、name属性值是一串动态变化的字符串或iframe本身没有可用的id或name属性时,可以借助层级定位来间接地定位iframe标签,如图2.26所示。
图2.26 iframe本身没有可用id/name属性界面
示例如下:
from selenium import webdrvier driver = webdriver.Chrome() driver.get('https://mail.qq.com/cgi-bin/loginpage') time.sleep(2) # 使用xpath层级定位iframe标签 Xpath = driver.find_element_by_xpath("//div[@id='QMEditorArea']/table/tbody/tr[2]/ td/iframe") driver.switch_to.frame(Xpath) # 切换到iframe标签 driver.find_element_by_name("email").send_keys('username') driver.find_element_by_name("password").send_keys('password') driver.find_element_by_id("login_button").click()
第一步,通过xpath层级定位到iframe标签,将定位对象赋值给Xpath;第二步,通过swtich_to.frame()方法切换到iframe标签。