Selenium - 問題集


selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: move target out of bounds

這個問題相對復雜,可能的原因就是鼠標要懸停的標簽不在可視的窗口內,導致懸停失敗。
為了證明,我本機測百度主頁,懸浮到【設置】,然后獲取彈出框內【搜索設置】文本。

正常代碼示例
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options as chrome_options
from selenium.webdriver.firefox.options import Options as firefox_optoions

# 創建瀏覽器對象
firefox_options = firefox_optoions()
firefox_options.add_argument("-headless")
chrome_options = chrome_options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# driver = webdriver.Firefox(firefox_options=firefox_options)
driver = webdriver.Firefox()

# driver = webdriver.Chrome(chrome_options=chrome_options)
# driver = webdriver.Chrome()
driver.implicitly_wait(10)
action = ActionChains(driver)

try:
    url = "https://www.baidu.com/"
    driver.get(url)
    action.move_to_element(driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')).perform()
    text = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[4]/div[1]/div/a[1]').text
    print(text)

except Exception as e:
    print(e)
finally:
    time.sleep(5)
    driver.quit()
可能的報錯示例(因為不同電腦可能結果不一致)

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options as chrome_options
from selenium.webdriver.firefox.options import Options as firefox_optoions

# 創建瀏覽器對象
firefox_options = firefox_optoions()
firefox_options.add_argument("-headless")
chrome_options = chrome_options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# driver = webdriver.Firefox(firefox_options=firefox_options)
# driver = webdriver.Firefox()

# driver = webdriver.Chrome(chrome_options=chrome_options)
driver = webdriver.Chrome()
driver.implicitly_wait(10)
action = ActionChains(driver)

try:
    url = "https://www.baidu.com/"
    driver.get(url)
    driver.set_window_size(300, 200)
    action.move_to_element(driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')).perform()
    text = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[4]/div[1]/div/a[1]').text
    print(text)

except Exception as e:
    print(e)
finally:
    time.sleep(5)
    driver.quit()

無論是無頭還是網頁模式下,當使用默認窗口大小測試時,都不報錯,這意味着鼠標懸浮的標簽此時還在可視窗口內;當手動將窗口大小設置的小一些時,就報錯了,這意味着鼠標懸浮的標簽不在可視窗口內。
當你遇到如下幾種錯誤(根據測試環境不同,報錯不同):

Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]/div[1]/div[4]/div[1]/div/a[1]"}
  (Session info: chrome=86.0.4240.183)

Message: (787, 30) is out of bounds of viewport width (454) and height (120)

selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: move target out of bounds

尤其是上述報錯的最后一個,你可以嘗試手動的將窗口設置到盡可能的大,這里推薦下面兩個方法搭配食用,效果更佳哦:

driver.maximize_window()   
driver.set_window_size(1000, 900)  

這里有個套路,你先可以使用driver.maximize_window()來嘗試解決問題,如果仍然報錯,穩住,這可能是driver.maximize_window()后的窗口也不夠大,導致鼠標要懸浮的標簽仍然不再可視窗口內,這個時候你就要driver.get_window_size()來獲取下maximize_window后的大小,然后再手動使用driver.set_window_size(1000, 900)將值設置的比driver.maximize_window()的值大,多次嘗試后,應該能解決問題。

因為我自己電腦多次測試的值不一致,並且不同瀏覽器和不同的模式、不同的窗口大小,報錯可能也不一致........所以,我只能不斷嘗試。而你,直奔主題,手動將窗口大小往大了設置就完了!
參考:使用selenium出現MoveTargetOutOfBoundsException異常 | [selenium]selenium.common.exceptions.MoveTargetOutOfBoundsException的處理 | Selenium - MoveTargetOutOfBoundsException with Firefox

DeprecationWarning: use options instead of chrome_options driver = webdriver.Chrome("chromedriver.exe",chrome_options=chrome_options)

棄用警告,只需要將chrome_options改為options即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM