web-dev-qa-db-ja.com

Selenium-FirefoxでのMoveTargetOutOfBoundsException

関数に問題がありますmove_to_element on Firefox Webdriver(Chrome、IEうまく動作します)

driver = webdriver.Firefox()
driver.get("https://stackoverflow.com")
time.sleep(5)
source_element = driver.find_element_by_xpath('//*[@id="footer"]/div/ul/li[1]/a')
ActionChains(driver).move_to_element(source_element).perform()

私はこれらのバージョンを使用しています:geckodriver-0.17.0 // Firefox-54.0 // Selenium-3.4.3

このスクリプトを実行すると、出力に次のように表示されます。

Selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: (134.96666717529297, 8682.183013916016) is out of bounds of viewport width (1268) and height (854) 
9
Matheus

このエラー...

Selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: (134.96666717529297, 8682.183013916016) is out of bounds of Viewport width (1268) and height (854)

...探している要素が Viewport 内にないことを意味します。 Viewport 内に要素を表示するには、下にスクロールする必要があります。ここに作業コードがあります:

from Selenium import webdriver
from Selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from Selenium.webdriver.common.action_chains import ActionChains

binary = FirefoxBinary('C:\\Program Files\\Mozilla Firefox\\firefox.exe')
caps = DesiredCapabilities().FIREFOX
caps["marionette"] = True
driver = webdriver.Firefox(capabilities=caps, firefox_binary=binary, executable_path="C:\\Utility\\BrowserDrivers\\geckodriver.exe")
driver.get("https://stackoverflow.com")
last_height = driver.execute_script("return document.body.scrollHeight")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
source_element = driver.find_element_by_xpath('//*[@id="footer"]/div/ul/li[1]/a')
ActionChains(driver).move_to_element(source_element).perform()

これがあなたの質問に答えるかどうか教えてください。

4
DebanjanB

ここでの正解は幸運だったと思います。彼らが探していた要素はたまたまページの一番下にあり、Firefoxでこれが一般的に発生する理由を実際には説明していません。

Firefox以外のブラウザはWebdriverを扱いますmove_to_elementアクションを要素のあるページの一部にスクロールして、その上にホバーします。 Firefoxは ハードラインスタンス を実行したようです。move_to_elementはホバーであり、これを修正するための scroll アクションを待機しています。

今のところ、前の回答で述べたようにjavascriptを使用してこのバグを回避する必要がありますが、任意に(この例はフッターだったと思います)ではなく、このようなものを使用して、ページの下部までスクロールし、オブジェクトがまだ表示されていることを期待します。

    def scroll_shim(passed_in_driver, object):
        x = object.location['x']
        y = object.location['y']
        scroll_by_coord = 'window.scrollTo(%s,%s);' % (
            x,
            y
        )
        scroll_nav_out_of_way = 'window.scrollBy(0, -120);'
        passed_in_driver.execute_script(scroll_by_coord)
        passed_in_driver.execute_script(scroll_nav_out_of_way)

それじゃあ、後でね

source_element = driver.find_element_by_xpath('//*[@id="footer"]/div/ul/li[1]/a')
if 'firefox' in driver.capabilities['browserName']:
    scroll_shim(driver, source_element)
# scroll_shim is just scrolling it into view, you still need to hover over it to click using an action chain.
actions = ActionChains(driver)
actions.move_to_element(source_element)
actions.click()
actions.perform()
10
Cynic

通常、MoveTargetOutOfBoundsExceptionエラーをスローするFirefoxでスクリプトを自動化しながら、以下を試すことができます。

変形/拡大または縮小することができます

driver.execute_script("document.body.style.transform='scale(0.9)';")

Jenkins(CIツール)で自動化スクリプトを実行している場合、ブラウザのコンテンツが実際のブラウザではなくスケールアウトされる上記の変換コードの問題に直面することもあります。そのような状況で、ブラウザウィンドウのサイズを変更してみてください。

driver.set_window_size(x, y)

または

driver.set_window_size(2000, 694)
1

Driver.get()の前にウィンドウサイズをドライバーに設定してみてください

driver.set_window_size(1024, 768) #(1920, 1080) #(4096, 3112)
0
Wonka

これは私のために働きました:

    WebElement element = driver.findElement(By.id("id")));
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
    Thread.sleep(500); 
    Actions act = new Actions(driver);
    act.moveToElement(element).perform();
0
Iza