1. 程式人生 > >UI自動測試中遇到

UI自動測試中遇到

Python3 test:

錯誤提示:不能定位

Message: unknown error: cannot focus element

 

<input id="usernamehide" placeholder="使用者名稱" value="" name="usernamehide" autocomplete="off" style="border-color: rgb(239, 239, 239); background-image: url("/mc/resources/image/people.png"); color: rgb(153, 153, 153);" type="text">
<input id="userpwd" onpaste="return false" value="密碼" name="userpwd1" placeholder="密碼" autocomplete="off" type="text">

 

在火狐或IE上可以正常執行,但是在Chrome則報錯:

表單原始碼如:

解決:

 

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("https://emall.esgcc.com.cn/mc/mc/public/login")
driver.find_element_by_xpath(".//*[@id='usernamehide']").send_keys("GWSC00016034")
#定位密碼輸入框,解決:unknown error: cannot focus element
e1 = driver.find_element_by_xpath(".//*[@id='userpwd']")
action = ActionChains(driver)
action.move_to_element(e1).click().send_keys("xhsintcdw760").perform()

錯誤提示:元素失效

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

 

錯誤提示如上:這種問題通常是頁面重新整理後,再獲取頁面導致的。

 

解決方法:

對頁面進行一次重新整理,重新獲取元素就能消除錯誤。

import unittest
from models.function import insert_img
from models.driver import driver_app
from page_obj.login_page import Login
from page_obj.edit_CV_page import Edit_CV
from time import sleep

class Edit_cv_test(unittest.TestCase):
    '''編輯使用者簡歷模組'''
    def setUp(self):
        self.driver = driver_app()
        self.login = Login(self.driver)
        self.edit_cv = Edit_CV(self.driver)
        #使用者登入
        self.login.user_login()
    def tearDown(self):
        self.driver.quit()
    def test_edit_sex(self):
        '''編輯使用者性別測試'''
        self.edit_cv.edit_sex()
        #進入編輯簡歷頁面
        self.driver.refresh()   #使用重新整理函式refresh()重新整理頁面
        self.edit_cv.wait_element(*self.edit_cv.edit_cv_enter_loc).click()
        insert_img(self.driver,"編輯使用者性別.jpg")
        #斷言
        self.assertEqual(self.edit_cv.get_user_sex(),"男")
    def test_edit_birthday(self):
        '''編輯使用者出生年月測試'''
        self.edit_cv.edit_user_birthday()
        self.driver.refresh()  #使用refresh()重新整理頁面
        self.edit_cv.wait_element(*self.edit_cv.edit_cv_enter_loc).click()
        insert_img(self.driver,"編輯使用者出生年月.jpg")
        #斷言
        self.assertEqual(self.edit_cv.get_user_birthday(),"1992-07-01")
if __name__ == "__main__":
    unittest.main()

錯誤提示:

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

意思是element是不可見的。所以無法獲取到。這時候就遇到一個難題,怎麼把element變成可見的呢?
這時候,我們就用ActionChains來模擬效果

使用前要先匯入ActionChains類:

from selenium.webdriver.common.action_chains import ActionChains

ActionChains(driver).click(driver.find_element(By.ID,'idxxxx')).perform() #使用perform()才能執行action
這個時候,你會驚奇地發現:下拉選單成功出現了。

這個是滑鼠事件的單擊滑鼠左鍵。
http://www.mamicode.com/info-detail-1981462.html

 

錯誤提示:

解決Selenium報錯:Element is not clickable at point (x, y). Other element would receive the click。

也就是:

元素在座標(1191.5,143)處不可進行點選操作,其他元素或許會收到這個點選操作。

出現彈窗後,實際上這個按鈕是clickable的,所以這樣等待沒用。

簡單的等待方法就是直接採用time.sleep()方法進行延時,但這種方法比較土,等待時間並不精確。

div標籤的display屬性在彈窗期間等於block,表示彈窗可見,而彈窗前和結束後會變為none,彈窗被隱藏。

那麼程式碼就很好寫了,只要等待這個div的display屬性變為none就代表配置結束了,正好可以利用Selenium中的is_displayed()方法:

 

  1. from time import sleep  
  2.   
  3. msg_24g = self.browser.find_element_by_xpath("/html/body/div[7]/div/div[2]")  
  4. while msg_24g.is_displayed():  
  5.       sleep(1)  

定位這整個彈框,然後使用.is_displayed(),就可以了。

def createLectureTopic(self,topicname):

self.wait_element(*self.createTopicButton_loc).click()

nowHandle = self.driver.current_window_handle

self.wait_element(*self.lectureTopic_loc).click()

allHandles = self.driver.window_handles

for i in allHandles:

if i != nowHandle:

self.driver.switch_to.window(i)

# 課程主題

text = str(topicname)+str(time.time())

# js = "var sum=document.get_element_by_id('topic-title-edit');sum.value='" + text + "';"

# self.execute_js(src=js)

self.wait_element(*self.topicName_loc).send_keys(text)

# 開始時間,滑鼠左鍵單擊操作

time.sleep(1)

ActionChains(self.driver).click(self.wait_element(*self.startTime_loc)).perform()

# 處理彈窗,當彈窗可見後,執行選擇時間操作

while self.wait_element(*self.timeControlWindow_loc).is_displayed():

time.sleep(1)

self.wait_element(*self.ensureStartTime_loc).click()

time.sleep(1)

break

# 下一步

return self.wait_element(*self.nextStep_loc).click()

另外expected_conditions裡面有個方法is_visibility()好像也可以實現這個功能。