首先,感謝MrCandy的【selenium學習筆記一】python + selenium定位頁面元素的辦法。一文,在該文章中找到了解決我當前遇到問題的方法。
遇到的問題描述:
簡單的的編寫一個登錄的腳本,但是在定位頁面元素的地方出現了問題。我使用driver.find_element_by_id("loginForm").click()方法來定位‘登錄’按鈕元素,但其實該id對應的不僅僅是登錄這個按鈕所代表的區域,而是包括登錄名、密碼已經登錄按鈕在內的一整個區域,所示使用find_element_by_id來定位並播放時不能夠正常進入,並報出”AttributeError: 'FirefoxWebElement' object has no attribute 'ckick'“錯誤,沒辦法,因為當時快下班了所以想了一個比較取巧的辦法,那就是在輸入登錄密碼后做一個‘回車’的鍵盤輸入,已達到登錄的目的,如“driver.find_element_by_id("password").send_keys(Keys.ENTER)”
今天是周末就想着來公司看看,畢竟這么普及的一個工具不應該沒有應對我這種問題的辦法,所以很湊巧的我看到了上面連接中的這篇文章。
下面我將復制該文章的部分內容,若要查看完整內容,請點擊原文地址查看
Python:
1)查找元素的ID。
from selenium import webdriver
browser = webdriver.Firefox()
browser.find_element_by_id("Element's id")
2)通過元素的name來定位。
browser.find_element_by_name("Element's name")
3)通過所應用的樣式表名className。
browser.find_element_by_class_name("class name")
4)通過CSS應用特征。
find_element_by_css_selector("a[id='id']")
5)通過鏈接的文本。
browser.find_element_link_name("link name")
6)通過XPATH定位。
browser.find_element_by_xpath("//***[*='**']")
看完上面這些,對我的代碼進行了幾種改進,實驗結果證明上面方法都是可行有效的。
下面是對幾種定位方法的演示,演示訪問的地址位移動網站地址。
from selenium import webdriver import time import re #做一個等待的通用方法 def sleep(sec=3): time.sleep(sec) driver = webdriver.Firefox() driver.get("http://m.mail.10086.cn") sleep() driver.find_element_by_name("UserName").send_keys("longname") sleep() driver.find_element_by_css_selector(".textBox_pw").send_keys("password") #使用class定位方式 sleep() driver.find_element_by_id("loginBtn").click() sleep(10) line = driver.current_url matchObj = re.match(r'(^.*?.cn).*$',line,re.M|re.I) print(matchObj.group(1)) #輸出當前的瀏覽器地址(不包含詳細地址和參數) driver.find_element_by_xpath(".//*[@id='logout']/a/i").click() sleep() driver.find_element_by_link_text("重新登錄").click() sleep() driver.quit()
順便在這里提出一個現在遇到的還沒有得到解決的問題,那就是我再使用selenium的時候,IE和谷歌瀏覽器在寫好腳本后能夠正常在firefox運行但是不能在這兩個瀏覽器運行的問題,驅動我都已經放在path路徑下面了,但是在打開瀏覽器時還是會報錯。希望有經驗的博友可以為我解答。
