Skip to content

EEfocus Add Blog

c19950812 edited this page Oct 16, 2017 · 3 revisions

实现自动化进入与非主站,登录并发表一篇博客,期间遇到的几个问题

三种等待方式:

  • 1、强制等待 sleep(xx)
    • 注:必须等待满规定时间,不灵活
  • 2、隐性等待 implicitly_wait(xx)
    • 注:隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。隐性等待对整个driver的周期都起作用,所以只要设置一次即可。
  • 3、显性等待 WebDriverWait()
    • 注:每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
  • 参考网站

多个窗口之间的切换

  • 个人认为最好用的方法
     handles = self.driver.window_handles        #获取所有窗口句柄
     self.driver.switch_to.window(handles[n-1])  #切换到第n个打开的窗口

主窗口与IFrame之间的相互切换

  • 1、从主文档切换到IFrame中
    driver.switch_to.frame(0)          # 1.用frame的index来定位,第一个是0
    driver.switch_to.frame("frame1")   # 2.用id来定位
    driver.switch_to.frame("myframe")  # 3.用name来定位
    driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))  # 4.用WebElement对象来定位
    driver.switch_to.frame(driver.find_element_by_xpath("//td[@id='cke_contents_content']/iframe")) # 5.用XPath来定位
  • 2、从IFrame切回主文档
    driver.switch_to.default_content()
  • 3、从主文档切入第二层IFrame,需要一层层切入
    driver.switch_to.frame("frame1")  #切入主文档下的第一层Iframe
    driver.switch_to.frame("frame2")  #切入第一层Iframe下的第二层Iframe

代码

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.support.ui import WebDriverWait
import unittest, time, re

class PyCase2(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.eefocus.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
    
    def test_py_case2(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        print (driver.title)
        driver.find_element_by_link_text(u"登录").click()
        driver.find_element_by_id("username").clear()
        driver.find_element_by_id("username").send_keys("2784599891@qq.com")
        driver.find_element_by_id("password").clear()
        driver.find_element_by_id("password").send_keys("123123")
        driver.find_element_by_xpath("//button[@type='submit']").click()
        WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_id("member-profile"))
        driver.find_element_by_id("member-profile").click()
        WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_link_text("博客"))
        driver.find_element_by_link_text(u"博客").click()
        WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_link_text("撰写博客"))
        driver.find_element_by_link_text(u"撰写博客").click()
        
        handles = self.driver.window_handles      #获取所有窗口句柄
        self.driver.switch_to.window(handles[1])  #切换到第二个打开的窗口
        driver.find_element_by_id("subject").clear()
        driver.find_element_by_id("subject").send_keys("test")
        Select(driver.find_element_by_name("category_user")).select_by_visible_text(u"默认")
        Select(driver.find_element_by_name("category_system")).select_by_visible_text(u"模拟与电源")
        
        #方法一
        driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
        #方法二
        #driver.switch_to.frame(driver.find_element_by_xpath("//td[@id='cke_contents_content']/iframe"))   
        driver.find_element_by_tag_name('body').send_keys('test')
        driver.switch_to.default_content()
        driver.find_element_by_class_name("pending").click()
    
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        #self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

Clone this wiki locally