Python3+Selenium3自动化测试-(七)
在实际定位元素的过程中,发现有一种情况让人很是恼火,根据xpath路径定位,感觉像是没错哦,但是执行时就来一个报错信息……为什么呢?
多表单切换
例如我们登录网易邮箱时就会发现,定位登录框时,一个嵌套的页面让定位变得如同相隔千山万水……
此时就需要切换表单来解救了:
惯例惯例~
# coding=utf-8 from selenium import webdriver dr = webdriver.Chrome() dr.get("https://mail.163.com/") dr.switch_to_frame("x-URS-iframe") dr.find_element_by_name("email").clear() dr.find_element_by_name("email").send_keys("username") dr.find_element_by_name("password").clear() dr.find_element_by_name("password").send_keys("password") dr.find_element_by_id("dologin").click() dr.switch_to_default_content() dr.quit()
通过switch_to_frame切换到登录表单中,之后就可以按照之前定位元素的方法定位元素并输入信息了。
当然如果想切换回源页面,可以直接使用 switch_to_default_content() 返回默认的最外层页面中。
多窗口切换
还有的情况就需要仔细甄别了,是不是通过链接打开了一个新的窗口…
来来来,最近时事比较热的新闻来看一看~
# coding=utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC dr = webdriver.Chrome() dr.get("https://www.baidu.com") dr.find_element_by_name("tj_trnews").click() window_0 = dr.current_window_handle try: element = WebDriverWait(dr, 10).until(EC.element_to_be_clickable( (By.XPATH, '//*[@id="pane-news"]/div/ul/li[1]/strong/a'))) element.click() window_1 = dr.current_window_handle windows = dr.window_handles print(window_0, window_1, "\n", windows) dr.switch_to_window(windows[-1]) window_1 = dr.current_window_handle print(window_0, window_1, "\n", windows) time.sleep(5) finally: dr.quit()
通过上述代码执行,可以看出,我为了打开百度新闻的热点新闻中的头条真的真的做出了一系列努力
代码中结合之前学习的显示等待,因为在测试过程执行的过程中发生了百度新闻的页面未完成加载未能找到热点新闻对应的元素的情况,自然也就无法定位给出了报错信息,心想继续使用time.sleep(5)着实是有点low,用上之前学习的显式等待吧。
在执行过程中,模拟鼠标点击热点新闻的第一行之后看到打开了一个新的标签页,但是我们通过 current_window_handle 查看当前窗口的句柄时,发现虽然打开了新的标签页,但是焦点并未聚焦于新的标签页,仍旧停留在原始页面,如果需要在新的页面中执行操作,怎么办?
通过 windows = dr.window_handles 获取所有窗口页面的句柄,再通过 dr.switch_to_window(windows[-1]) 切换到最新的窗口页面,此时再来查看当前的窗口句柄,就发现,已然切换成功了,有成就感~