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