関数に問題があります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)
このエラー...
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()
これがあなたの質問に答えるかどうか教えてください。
ここでの正解は幸運だったと思います。彼らが探していた要素はたまたまページの一番下にあり、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()
通常、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)
Driver.get()の前にウィンドウサイズをドライバーに設定してみてください
driver.set_window_size(1024, 768) #(1920, 1080) #(4096, 3112)
これは私のために働きました:
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();