当点击某个链接,浏览器上出现新窗口时,selenium不会自动在新窗口中定位元素,而是继续在旧页面查找元素,就会定位不到元素报错,这时就需要我们进行窗口切换。本文提供三个方法可解决这一问题。
1、出现新窗口的原因
在首页点击登录按钮,会重新弹出一个新的登录窗口,因为这个链接文本有一个属性叫target="_blank",会打开一个新的页面。把这个属性去掉登录页面就会在当前的页面上了。
2、进行窗口切换switch_to.window
步骤
1)、定位当前浏览器中所有的窗口的名字
driver.window_handles
2)、找出最后一个窗口的名字
driver.window_handles[-1]
3)、用switch_to()方法,把selenium切换到最后一个窗口进行定位。
4)、合起来写
driver.switch_to.window(driver.window_handles[-1])
class TestLogin2:
def test_login2(self,driver):
# 1、打开首页
driver.get('https://svr-6-9010.share.51env.net/')
# 2、打开右上角的登录链接,此时登录页面会在一个新窗口中弹出
driver.find_element_by_link_text('登录').click()
# 3、先定位当前浏览器中,所有窗口的名字,再切换到最后一个窗口
driver.switch_to.window(driver.window_handles[-1])
# 4、输入用户名
driver.find_element_by_id('id_login').send_keys("changcheng1211")
3、把前一个窗口关闭,只打开新弹出的窗口driver.close()
driver.close()
关闭当前浏览器的默认窗口,如果只有一个窗口,就会关闭浏览器。
除非需要窗口切换,一般不用close方法,
关闭浏览器有一个更好的方法
driver.quit()
class TestLogin2:
def test_login2(self,driver):
# 1、打开首页
driver.get('https://svr-6-9010.share.51env.net/')
# 2、打开右上角的登录链接,此时登录页面会在一个新窗口中弹出
driver.find_element_by_link_text('登录').click()
# 关闭上一个窗口
driver.close()
# 3、输入用户名
driver.find_element_by_id('id_login').send_keys("changcheng1211")
4、把重新打开窗口属性删除,不出现新窗口
我们知道因为登录按钮有target="_blank"属性,所以才会出现新窗口。所以我们可以用先用javascript删除target属性,再点击“登录”链接,这时就不会产生新窗口了
首先在页面控制台调试javascript脚本,做试验移除这个属性。
点击控制台,如果有提示框,请输入allow pasting
点击控制台,
输入 document.querySelector('.sign-in-wrap a') 并按回车找到了该元素,
document指的是整个页面的Html,我们在整个文档中找元素,相当于selenium 中的driver
document.querySelector('.sign-in-wrap a') 相当于selenium 中driver.find_elements(By.CSS_SELECTOR,'.sign-in-wrap a')
'.sign-in-wrap a' 表示class为sign-in-wrap下面的a标签内容
去掉target属性,执行命令 document.querySelector('.sign-in-wrap a').removeAttribute('target')
.removeAttribute('target')",通过这种方法,可以删除任意元素的属性。
在重新查一下,可以看到target="_blank"属性已经没有了,此时就不会弹出新的窗口了。
在点击链接前,点击删除属性。就可以了,再点击“登录”链接,这时就不会产生新窗口了 script = "document.querySelector('.sign-in-wrap a').removeAttribute('target')" driver.execute_script(script)
class TestLogin3:
def test_login3(self,driver):
# 1、打开首页
driver.get('https://svr-6-9010.share.51env.net/')
# 2、在点击链接前,点击删除属性。
script = "document.querySelector('.sign-in-wrap a').removeAttribute('target')"
driver.execute_script(script)
# 3、打开右上角的登录链接,此时因为target属性被删除,就不会弹出新窗口了。
driver.find_element_by_link_text('登录').click()
# 4、输入用户名
driver.find_element_by_id('id_login').send_keys("changcheng1211")