點選失敗?Python+Selenium自動化測試的終極解決方案揭秘!

Atstudy技術社群發表於2023-11-27

隨著前臺開發技術的不斷升級,在使用Python+Selenium進行自動化測試時,也會遇到各種各樣的問題,其中最常見的一種就是元素能定位到,但是無法點選或者點選失敗,那麼這篇文章就來講述一下如果遇到元素定位成功但是點選失敗的情況該如何解決。

Selenium中,最常用的元素點選方法是element.click(),根據以往的自動化的測試經驗來說,此方法適用於絕大多數的點選操作,那麼如果遇到點選失敗的情況,我們應該怎麼解決呢?

方法1:設定等待時間。

最常見的元素點選失敗的情況,造成的原因最多的就是元素未載入完成。

舉個例子,點選產品進入產品詳情,再點選加入購物車按鈕,程式碼如下:

self.driver.find_element(By.NAME,"product").click()--點選產品名稱進入產品詳情

self.driver.find_element(By.NAME,"add-to-cart").click()--點選“加入購物車”按鈕執行指令碼時,提示沒有這個元素

原因是點選產品名稱後,伺服器需要有一個反應時間,才能將詳情頁的所有元素都載入出來,這裡點選產品後就立即點選加入購物車,這時候“加入購物車”按鈕還沒有載入出來,所以會提示找不到元素。

解決方法:

1、使用sleep(),設定強制等待時間,強制等待多少秒之後再執行點選操作。此方法比較死板,不管元素是否載入出來,都會等固定的時間,可能會出現等待了固定時間後元素還是未載入出來的情況,也有可能會出現未到固定的時間元素已經載入完成但是還繼續等待的情況。

2、使用隱式等待driver.implicitly_wait(time),此方式設定一個最大等待時間,會一直等待元素出現再點選,如果元素出現,就不再等待了。此方式較sleep()來說比較靈活,但是會出現元素已經出現但是是不可點選的情況,如果遇到這種情況,點選也會報錯,隱式等待只能解決部分問題。

3、使用顯式等待。使用顯式等待,既不會造成等待時間的冗餘,又能保證等待元素可點選了再進行下一步操作,缺點就是比較麻煩。

方法2:模擬鍵盤操作。

如果使用方法一之後,依然未解決問題,我們再試試模擬鍵盤操作來進行點選。舉個例子,我們模擬一下登入場景,如下:

程式碼如下:

def login001(self):

self.driver.get(")

time.sleep(3)

self.driver.find_element(By.NAME,"username").send_keys("使用者名稱")

self.driver.find_element(By.NAME,"password").send_keys("密碼")

self.driver.find_element(By.NAME,"login").click()

執行程式碼後,報錯資訊提示如下內容:

selenium.common.exceptions.ElementClickInterceptedException:Message:element click intercepted:Element<span>...</span>is not clickable at point(647,497).Other element would receive the click:<div data-v-840ce3b2=""class="container">...</div>

出現這種錯誤的原因有可能是在按鈕上面還有其他元素遮擋,導致點選此元素時實際上是點選到了該元素上層的元素,導致點選無效,出現這種情況,我們可以嘗試使用模擬鍵盤操作來避免點選到其他元素。

程式碼如下:

def login001(self):

self.driver.get(")

time.sleep(3)

self.driver.find_element(By.NAME,"username").send_keys("使用者名稱")

self.driver.find_element(By.NAME,"password").send_keys("密碼")

ActionChains(self.driver).send_keys(Keys.ENTER).perform()

再次執行程式碼,則可登入成功。

方法3:使用javascript進行點選。

如果按照方法一、方法二中的方法,元素還是點選失敗,如下案例:

場景是:點選下拉框,從下拉框中選擇搜尋條件,並進行搜尋。

使用.click()方法,會提示如下錯誤:

當想使用模擬鍵盤操作時發現,這種情況跟登入不一樣,登入時滑鼠有定位,可直接使用Keys.Enter進行操作,但是此場景滑鼠沒有定位,無法使用。

那麼我們可以再嘗試使用javascript來解決這個問題,使用javascript執行點選操作,不會受到元素遮罩的影響,只要能定位到元素,就能執行點選操作。

使用方法:

color_loc=self.driver.find_element(By.CLASS_NAME,"color")

self.driver.execute_script("arguments[0].click()",color_loc)

使用此方法執行指令碼透過

但是這種方法有一個缺點,有一些系統錯誤暴露不出來,舉個例子來說:

假如我們要對這裡進行設定,設定完成之後,再去錄入關鍵字進行搜尋,如果使用javascript進行操作,即使我們儲存設定的時候,提示了錯誤資訊,並且設定頁面也沒有關閉的情況下,javascript依舊可以對下面的頁面進行操作,而不是提示出錯誤來。但是如果其他點選方法無法正常工作的情況下,也只能透過這種方式進行點選。

以上是我在日常的工作中總結的幾點經驗,希望對大家能有所幫助。

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034708/viewspace-2997531/,如需轉載,請註明出處,否則將追究法律責任。

相關文章