1. 程式人生 > >通過ID定位,ID變化導致selenium無法定位到元素

通過ID定位,ID變化導致selenium無法定位到元素

最近在學習用selenium2基於python3做自動化測試,寫了一個小指令碼,完成360雲盤的登入功能;

通過頁面元素的ID定位賬號輸入框和密碼輸入框;

# coding = utf-8

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://c56.yunpan.360.cn/")

driver.find_element_by_id("quc_account_55212773").clear()
driver.find_element_by_id("quc_account_55212773").send_keys("xxxx")  #賬號名
driver.find_element_by_id("quc_password_55212774").clear()
driver.find_element_by_id("quc_password_55212774").send_keys("xxxx")   #密碼
driver.find_element_by_xpath('/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[5]/input').click()

執行後報錯selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element;

無法定位到元素,經過查詢發現,每次開啟360雲盤網頁,賬號輸入框ID和密碼輸入框ID都是不同的,因此無法通過ID定位;

修改指令碼,通過xpath定位:

# coding = utf-8

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://c56.yunpan.360.cn/")

driver.find_element_by_xpath("/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[1]/span/input").clear()
driver.find_element_by_xpath("/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[1]/span/input").send_keys("XXXX")
driver.find_element_by_xpath("/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[2]/span/input").clear()
driver.find_element_by_xpath("/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[2]/span/input").send_keys("XXX")
driver.find_element_by_xpath('/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[5]/input').click()

再次執行指令碼,可以進行登入,問題解決。

通過上面的例子,我們可以看到xpath 的定位方式非常靈活和強大的,但是它的缺陷也非常明顯:

1、效能差,定位元素的效能要比其它大多數方式差;

2、不夠健壯,xpath會隨著頁面元素佈局的改變而改變;

3. 相容性不好,在不同的瀏覽器下對xpath 的實現是不一樣的。

    另外,CSS 定位語法比xpath 更為簡潔,定位方式更多靈活多樣;不過對CSS 理解起來要比xpath 較難;但不管是從效能還是定位更復雜的元素上,CSS 優於xpath,筆者更推薦使用CSS定位頁面元素。

    自動化測試的元素定位一直是困擾自動化測試新手的一個障礙,因為我們在自動化實施過程中會碰到各式各樣的物件元素。雖然xpath 和CSS 可以定位到複雜且比較難定位的元素,但相比較用id 和name 來說增加了維護成本和學習成本,相比較來說id/name 的定位方式更直觀和可維護,有新的成員加入的自動化時也增加了人員的學習成本。所以,測試人員在實施自動化測試時一定要做好溝通,規範前端開發人員對元素新增id/name 屬性,或者自己有修改HTML 程式碼的許可權。