zoukankan      html  css  js  c++  java
  • python selenium-webdriver 定位frame中的元素 (十三)

    定位元素时经常会出现定位不到元素,这时候我们需要观察标签的上下文,一般情况下这些定位不到的元素存放在了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邮箱为例子写了一下。

  • 相关阅读:
    JS垃圾回收机制
    Flex布局
    HTTP请求
    css基本布局方式
    阮一峰《ECMAScript 6 入门》读书笔记——模版标签
    阮一峰《ECMAScript 6 入门》读书笔记——变量解构赋值
    阮一峰《ECMAScript 6 入门》读书笔记——let与const
    闭包(Closure)
    CSS浮动布局带来的高度塌陷以及其解决办法
    CSS网页的布局
  • 原文地址:https://www.cnblogs.com/mengyu/p/7160904.html
Copyright © 2011-2022 走看看