關於web自動化定位元素失敗的分析

問題分析

  1. 首先-明確範圍 -- web自動化測試前端

  2. 其次-明確條件 -- 元素定位都正確web

  3. 而後-明確現象 -- 元素定位會失敗瀏覽器

  4. 最後-得出結論服務器

    1. 判判定位的元素屬性信息是否正確(已經肯定正確),可是業務邏輯是否正確須要肯定網絡

    2. 受到網絡/服務器/瀏覽器影響,頁面加載過慢會形成定位失敗,須要經過元素等待處理框架

    3. 目標元素是否直接可見/是否須要鼠標動做才能顯現出來iphone

    4. 默認瀏覽器大小的頁面加載範圍太小形成部分元素遮擋,須要啓動瀏覽器後最大化窗口ide

    5. 受前端動態加載技術影響,頁面動態加載數據有時須要監聽滾動條動做(長頁面翻頁),須要操做滾動條測試

    6. 頁面操做過程當中的窗口彈框alert也會影響頁面定位和操做,須要先處理alertspa

    7. 頁面部分超連接點擊後會在新窗口中打開,目標元素在新窗口中時,須要進行窗口切換

    8. 收到前端頁面框架影響,頁面內容可能會在frame子頁中,須要frame切換

 

 

問題總結

因爲這個問題回答清楚須要不少Selenium的API經常使用操做,因此針對這個問題的回答要特別注意代碼實現

  1. 業務邏輯

    # 注意業務邏輯的前後順序 -- 打開首頁就直接登陸操做
    # 2.輸入網址
    # 驅動對象調用get("協議://URL")
    driver.get("http://www.xxx.com")

    # 3.業務操做
    # 登錄操做 輸入用戶名/密碼/驗證碼
    driver.find_element_by_id("username").send_keys("xxxxxx")
    driver.find_element_by_id("password").send_keys("123456")
    driver.find_element_by_id("verify_code").send_keys("8888")
    driver.find_element_by_name("sbtbutton").click()
  1. 元素等待


    # 硬等待
    # 使用sleep,暫停程序執行
    time.sleep(3)
    driver.find_element_by_id("q").send_keys("iphone")

    # 隱式等待 -- 設置一次 -- 針對全局--全部元素定位
    # selenium.common.exceptions.NoSuchElementException
    # 調用-使用瀏覽器驅動對象調用 參數-等待時長秒
    driver.implicitly_wait(10)
    driver.find_element_by_id("q").send_keys("iphone")

    # 顯式等待 -- 針對指定的元素定位 -- 定位失敗是的拋出異常
    # selenium.common.exceptions.TimeoutException
    # 實例化一個WebDriverWait類的對象, WebDriverWait類的對象調用until
    wait = WebDriverWait(driver, timeout=10, poll_frequency=1)
    userA_element = wait.until(lambda d: d.find_element_by_id("q"))
    userA_element.send_keys("iphone")
  1. 鼠標動做


    # 實例化一個動做鏈對象
    # 動做鏈對象調用動做方法--move_to_element(目標元素對象)
    # 動做鏈對象調用perfom()
    ActionChains(driver).move_to_element(driver.find_element_by_class_name("u-g-cart")).perform()
  1. 最大化窗口


    # 1.打開瀏覽器
    # 實例化瀏覽器驅動對象
    # obj = 類名()
    driver = webdriver.Chrome()
    # 瀏覽器窗口最大化
    driver.maximize_window()
  1. 操做滾動條


    # 操做滾動條
    driver.execute_script("window.scrollTo(0,100000)")
    # 點擊回到頂部
    driver.find_element_by_class_name("ico-slidebar4").click()
  1. 處理alert


    # 關閉彈出框
    driver.switch_to.alert.dismiss()
  1. 窗口切換


    # 切換窗口 -- 通常規律默認最後一個就是新窗口句柄
    driver.switch_to.window(driver.window_handles[-1])
  1. frame切換

    # frame切換  主頁--子頁
    driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
    # 點擊去購物車結算
    driver.find_element_by_link_text("去購物車結算").click()
    # frame切換 子頁--主頁
    driver.switch_to.default_content()
相關文章
相關標籤/搜索