Selenium學習之路-0

1.
錯誤:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:”name”,”selector”:”title”}
說明:
當遇到Selenium定位不到元素時出現(報:NoSuchElementException)
分析:
1.Frame/Iframe原因定位不到元素(這個是最常見的原因,由於frame中鑲嵌iframe導致定位元素失敗,首先需要理解的是iframe相當於對本頁面的一個重定向操作,因此當遇到iframe時其實是已經跳轉到另一個頁面,對當前頁面的定位當然也就無效)。 解決辦法:
#先定位到iframe
iframe = self.driver.find_element_by_xpath(‘//*[@id=”iframe_box”]/div[2]/iframe’)
#再將定位對象傳給switch_to_frame()方法
self.driver.switch_to.frame(iframe)
接下來按照正常的頁面定位就ok,完美解決。
2.Xpath描述錯誤原因:如果你是用xpath定位而你得頁面沒有使用iframe的時候, 你可能需要重新檢查一下你的xpath是否有錯誤,由於Xpath層級太複雜,容易犯錯,手寫xpath一定要格外小心,不過我們瀏覽器有自帶的獲取xpath 的方法,比如QQ瀏覽器F12進入調試模式,找到要定位的代碼右鍵COPY就可以看到copyXpath的選項,其它瀏覽器獲取xpath方式可以百度一下用起來很方便。
3.頁面還沒有加載出來,就對頁面上的元素進行操作也會導致獲取不到元素定位,解決辦法
import time
time.sleep(3)
加入等待時間,這種方式屬於強制等待,用起來不靈活,其它的等待方式還有隱性等待implicitly_wait(X)顯性等待WebDriverWait。關於它們的區別參考http://www.jb51.net/article/92684.htm 這裏不再多說。
4.動態id定位不到元素:
解決方案:
如果發現是動態id,直接用xpath定位或其他方式定位。
定位動態id鏈接:
http://blog.csdn.net/huilan_same/article/details/52594354

5.二次定位,如彈出框登錄
# coding=utf-8
'''
Created on 2016-7-20
@author: Jennifer
Project:登錄百度賬號
'''
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")

time.sleep(3)

#點擊登錄:有些name爲tj_login的元素爲不可見的,點擊可見的那個登錄按鈕即可。
#否則會報:ElementNotVisibleException
element0=driver.find_elements_by_name("tj_login")
for ele0 in element0:
    if ele0.is_displayed():
        ele0.click()

#在登錄彈出框,需先定位到登錄彈出框
#否則會報:NoSuchElementException
element1=driver.find_element_by_class_name("tang-content")
element11=element1.find_element_by_id("TANGRAM__PSP_8__userName")
element11.clear()
element11.send_keys("登錄名")

element2=element1.find_element_by_id("TANGRAM__PSP_8__password")
element2.clear()
element2.send_keys("密碼")

element3=element1.find_element_by_id("TANGRAM__PSP_8__submit")
element3.click()
element3.submit()

try:
    assert "登錄名" in driver.page_source
except AssertionError:
    print "登錄失敗"
else:
    print "登錄成功"
    time.sleep(3)
finally:
    print "測試記錄:已測試"
driver.close()
 如百度登錄彈出框登錄百度賬號,需先定位到百度彈出框,然後再定位到用戶名密碼登錄。
     6.不可見元素定位
     如上百度登錄代碼,通過名稱爲tj_login查找的登錄元素,有些是不可見的,所以加一個循環判斷,找到可見元素(is_displayed())點擊登錄即可。

2.
錯誤:DeprecationWarning: use driver.switch_to.frame instead
warnings.warn(“use driver.switch_to.frame instead”, DeprecationWarning)

原因:這類型的警告大多屬於版本更新時,所使用的方法過時的原因,可以在該方法的說明處查找替換的方法
(https://img-blog.csdn.net/20170918170840447?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzIyMDE5MTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

解決:這樣的警告說明switch_to_frame方法已經被拆分 ,將它改成switch_to.frame,完美解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章