定位元素时经常会出现定位不到元素,这时候我们需要观察标签的上下文,一般情况下这些定位不到的元素存放在了frame或者放到窗口了,只要我们切入进去就可以很容易定位到元素。
处理frame时主要使用到switch_to.frame()(切入frame也可以些写成switch_to_frame,不过这个已经用的很少了)和switch_to_default_content()两个方法,一个主要是切入到iframe里面,一个是切换到主文档中,一般情况这两个要配合着用,切进去以后操作完成元素以后,就要在切回到主文档,避免一些其他的错误。
- switch_to.frame() #如果frame 中有name和id属性就直接使用id或者name进行定位,如果没有id和name属性,可以通过find_element_by_xpath(或者其他定位)方法定位到这个iframe元素,然后把这个元素传进去。
#-*- coding:utf-8 -*- '''126邮箱登陆''' import time import unittest 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 class WANGYI(unittest.TestCase): def setUp(self): print('开始测试') self.username = 'yuhuan2006_2548' # 定义账号 self.password = 'xxxxx' #定义密码 self.driver = webdriver.Chrome() self.driver.maximize_window() self.base_url = "http://mail.126.com/" self.driver.get(self.base_url) def test_login(self): '''测试登陆126邮箱''' WebDriverWait(self.driver,10).until( EC.presence_of_element_located((By.ID, "x-URS-iframe"))) self.driver.switch_to.frame("x-URS-iframe") #切换进入frame 在这里也可以写self.driver.switch_to.frame(self.driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')),先定位元素 self.driver.find_element_by_name("email").send_keys(self.username) self.driver.find_element_by_name("password").send_keys(self.password) self.driver.find_element_by_id("dologin").click() WebDriverWait(self.driver,10).until( EC.presence_of_element_located((By.ID, "spnUid"))) #增加等待时间,判断验证信息元素是否显示 verifyLoginSucceed = self.driver.find_element_by_xpath('//*[@id="spnUid"]').text self.assertIn(self.username,verifyLoginSucceed) #验证是否登陆成功 def tearDown(self): self.driver.implicitly_wait(30) self.driver.quit() print('测试结束') if __name__ == '__main__': unittest.main()
正好有人问我126邮箱如何输入账号和密码,开始他以为是由于Input标签的属性导致没有办法输入账号,后来正好有时间了,看了一下126邮箱的你过来,发现这里正是用到了iframe切换,所以在这里总结了一下frame,并且以126邮箱为例子写了一下。