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()方法:
- from time import sleep
- msg_24g = self.browser.find_element_by_xpath("/html/body/div[7]/div/div[2]")
- while msg_24g.is_displayed():
- 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()好像也可以實現這個功能。