zoukankan      html  css  js  c++  java
  • selenium2自动化测试学习笔记(三)

    今天是学习selenium的第三天,今天的主题是自动登录126邮箱。

    今天总结碰到的坑有三个:

    1、frame内元素抓取,使用driver.switch_to.frame(frameId)方法切换锁定frame

    2、等待页面渲染完毕定位输入,chrome下使用sleep(秒)等待

    3、 driver的element内置方法会有失灵情况,采用driver.execute_script(js字符串)方法执行

    初始代码,代码中的usernamepassword替换成自己的账户密码即可

     1 from selenium import webdriver
     2 
     3 #自动打开邮箱主页登录
     4 driver = webdriver.Firefox()
     5 #driver = webdriver.Chrome()
     6 #driver = webdriver.Ie()
     7 dr.get("http://mail.126.com")
     8 idInput = dr.find_element_by_xpath('//input[@name="email"]')
     9 pwdInput = dr.find_element_by_xpath('//input[@name="password"]')
    10 idInput.clear()
    11 idInput.send_keys("username")
    12 pwdInput.clear()
    13 pwdInput.send_keys("password")
    14 
    15 dr.find_element_by_id('dologin').click()
    16 
    17 dr.quit()
    View Code

    搞了半天,怎么都获取不到,然后抓取本页面的所有input,循环打印出来,发现确实找不到登录框。

    inputs = driver.find_elements_by_xpath("//input")
        print( len(inputs) )
        for input in inputs:
            print('input id is ',input.get_attribute("id"),
                  '| input name is ',input.get_attribute("name") )

    眼瞎的后面才发现是嵌套在iframe中的,这就好办了,网上搜索了下定位方法

    #driver.switch_to.frame("x-URS-iframe")#定位到登录frame
    print('begin定位到x-URS-iframe')
    driver.switch_to.frame("x-URS-iframe")
    print('end定位到x-URS-iframe')
    

     接下来的代码都一样,但是在email框中send_keys始终无法输入成功,password却可以,莫名其妙,没搞懂。

    此时换成执行js方法

    dologin = driver.find_element_by_id("dologin")
        email = driver.find_element_by_name("email")
        password = driver.find_element_by_name("password")
     
        print('email is_displayed ',email.is_displayed() )
        print('email is_enabled  ',email.is_enabled() )
        email.clear()
        #email.send_keys('kiokyw')#火狐此方法不行
    
        #调用js 输入
        email_id = email.get_attribute("id")
        js = "document.getElementById('"+email_id+"').value='username'"
        print(js)
        driver.execute_script(js)
    

      执行成功,再输入password,并点击登录按钮

     password.clear()
        password.send_keys('password')
    
        print( 'email class = ', email.get_attribute('class') )
        print( 'email value = ', email.get_attribute('value') )
        print( 'password value = ', password.get_attribute('value') )
    
        
        js = "document.getElementById('dologin').click()"
        print(js)
        driver.execute_script(js)
        #dologin.click()#IE下此方法不行
        print('登录成功')
    

      最后是切回主frame,否则还在原来的frame中,获取不到新页面的元素

    #切回主frame
        driver.switch_to.default_content()
    
        #当前url
        now_url = driver.current_url
        print(now_url)
    
        #获取当前登录用户名
        user = driver.find_element_by_id('spnUid').text
        print(user)
    

      最后是完整代码

      1 from selenium import webdriver
      2 from selenium.webdriver.common.by import By
      3 from selenium.webdriver.support.ui import WebDriverWait
      4 from selenium.webdriver.support import expected_conditions as EC
      5 from time import ctime
      6 from time import sleep
      7 
      8 driver = webdriver.Firefox()
      9 #driver = webdriver.Chrome()
     10 #driver = webdriver.Ie()
     11 
     12 #设置隐式等待为10秒
     13 driver.implicitly_wait(10)
     14 
     15 url = 'http://www.126.com'
     16 driver.get(url)
     17 print("title is ",driver.title)
     18 
     19 #element = WebDriverWait( driver,5, 0.5).until(
     20 #    EC.presence_of_element_located((By.NAME,'wd'))
     21 #    )
     22 
     23 '''
     24 try:
     25     idInput = driver.find_elements_by_xpath('//a')
     26     #等同
     27     #idInput = driver.find_elements_by_css_selector('a')
     28     print(len(idInput))
     29     for a in idInput:
     30         print(a.get_attribute('id') )
     31 except:
     32     print("test error")
     33 
     34 try:
     35     
     36     element = WebDriverWait( driver,10, 0.5).until(
     37        EC.presence_of_element_located((By.ID,'dologin'))
     38     )
     39     idInput = driver.find_elements_by_css_selector('input')
     40     print(len(idInput))
     41     for a in idInput:
     42         print(a.get_attribute('id') )
     43 except:
     44     print("test error")
     45 '''
     46 #定位到iframe
     47 try:
     48     sleep(10) #chrome下需要等待
     49     print( ctime(),'| url=',driver.current_url )
     50     #driver.switch_to.frame("x-URS-iframe")#定位到登录frame
     51     print('begin定位到x-URS-iframe')
     52     driver.switch_to.frame("x-URS-iframe")
     53     print('end定位到x-URS-iframe')
     54     
     55 
     56     inputs = driver.find_elements_by_xpath("//input")
     57     print( len(inputs) )
     58     for input in inputs:
     59         print('input id is ',input.get_attribute("id"),
     60               '| input name is ',input.get_attribute("name") )
     61         
     62     
     63     dologin = driver.find_element_by_id("dologin")
     64     email = driver.find_element_by_name("email")
     65     password = driver.find_element_by_name("password")
     66  
     67     print('email is_displayed ',email.is_displayed() )
     68     print('email is_enabled  ',email.is_enabled() )
     69     email.clear()
     70     #email.send_keys('kiokyw')#火狐此方法不行
     71 
     72     #调用js 输入成功
     73     
     74     email_id = email.get_attribute("id")
     75     js = "document.getElementById('"+email_id+"').value='kiokyw'"
     76     print(js)
     77     driver.execute_script(js)
     78    
     79     
     80     password.clear()
     81     password.send_keys('Yy19861121')
     82 
     83     print( 'email class = ', email.get_attribute('class') )
     84     print( 'email value = ', email.get_attribute('value') )
     85     print( 'password value = ', password.get_attribute('value') )
     86 
     87     
     88     js = "document.getElementById('dologin').click()"
     89     print(js)
     90     driver.execute_script(js)
     91     #dologin.click()#IE下此方法不行
     92     print('登录成功')
     93 
     94 
     95     #切回主frame
     96     driver.switch_to.default_content()
     97 
     98     #当前url
     99     now_url = driver.current_url
    100     print(now_url)
    101 
    102     #获取当前登录用户名
    103     user = driver.find_element_by_id('spnUid').text
    104     print(user)
    105     
    106 except  BaseException as msg:
    107     print(msg)
    108 
    109 print("关闭浏览器")
    110 driver.quit()

    以上代码太长了,再另附一份谷歌登录163邮箱的代码,重点是需要等待渲染

     1 from selenium import webdriver
     2 from time import sleep
     3 
     4 #自动打开邮箱主页登录
     5 #dr= webdriver.Firefox()
     6 dr= webdriver.Chrome()
     7 #dr = webdriver.Ie()
     8 dr.get("http://mail.163.com")
     9 sleep(2)
    10 dr.switch_to.frame("x-URS-iframe")
    11 idInput = dr.find_element_by_xpath('//input[@name="email"]')
    12 pwdInput = dr.find_element_by_xpath('//input[@name="password"]')
    13 idInput.clear()
    14 idInput.send_keys("username")
    15 pwdInput.clear()
    16 pwdInput.send_keys("password")
    17 
    18 dr.find_element_by_id('dologin').click()
    19 
    20 dr.quit()
  • 相关阅读:
    (二分查找 拓展) leetcode 69. Sqrt(x)
    (二分查找 拓展) leetcode 162. Find Peak Element && lintcode 75. Find Peak Element
    (链表) lintcode 219. Insert Node in Sorted Linked List
    (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
    (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
    (字符串 数组 递归 双指针) leetcode 344. Reverse String
    (二叉树 DFS 递归) leetcode 112. Path Sum
    (二叉树 DFS 递归) leetcode 101. Symmetric Tree
    (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal
    (二叉树 递归 DFS) leetcode 100. Same Tree
  • 原文地址:https://www.cnblogs.com/yaomaomao/p/8568348.html
Copyright © 2011-2022 走看看