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即可。
