web-dev-qa-db-fra.com

Sélénium - MoveTargetOutOfBoundsException avec Firefox

J'ai un problème avec la fonction move_to_element on Firefox Webdriver (Chrome, IE fonctionne bien)

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()

Je travaille avec ces versions: geckodriver - 0.17.0 // Firefox - 54.0 // Selenium - 3.4.3

Après avoir exécuté ce script, la sortie affiche:

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

Cette erreur...

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

... implique que l'élément que vous recherchez n'est pas dans le Viewport . Nous devons faire défiler vers le bas pour amener l'élément dans le Viewport . Voici le code de travail:

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()

Faites-moi savoir si cela répond à votre question.

4
DebanjanB

Je pense que la bonne réponse ici a eu de la chance que l'élément qu'ils recherchaient se trouve en bas de la page et n'explique pas vraiment pourquoi cela se produit couramment dans Firefox.

Les navigateurs autres que Firefox traitent les Webdrivers move_to_element action en faisant défiler jusqu'à une partie de la page avec l'élément, puis survolez-le. Firefox semble avoir pris une position dure que move_to_element est juste en vol stationnaire et attend une action scroll pour résoudre ce problème.

Pour l'instant, vous devez contourner ce bogue en utilisant javascript comme mentionné dans la réponse précédente, mais je suggère d'utiliser quelque chose comme ça au lieu d'arbitraire (enfin, je suppose que l'exemple était un pied de page) en défilant vers le bas de la page et en espérant que l'objet est toujours en vue.

    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)

Puis plus tard

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

Vous pouvez essayer ci-dessous lors de l'automatisation du script dans Firefox alors qu'il génère généralement une erreur MoveTargetOutOfBoundsException:

On peut transformer/zoomer ou dézoomer en

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

Parfois, si vous exécutez un script d'automatisation dans Jenkins (outils CI), vous pouvez également rencontrer le problème du code de transformation ci-dessus où le contenu du navigateur est mis à l'échelle et non le navigateur réel, dans ces conditions, vous pouvez essayer de redimensionner la fenêtre du navigateur:

driver.set_window_size(x, y)

ou

driver.set_window_size(2000, 694)
1
Pranjay Kaparuwan

Essayez de définir la taille de la fenêtre sur le pilote AVANT driver.get ()

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

Cela a fonctionné pour moi:

    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