Mam problem z funkcją Move_to_element na Firefoksie WebDriver (Chrome, tj. Działa dobrze)

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

Pracuję z tymi wersjami: geckodriver - 0,17.0 // Firefox - 54.0 // Selenium - 3.4.3

Po uruchomieniu tego skryptu na wyjściach pokazuje:

selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: (134.96666717529297, 8682.183013916016) is out of bounds of viewport width (1268) and height (854) 
24
Matheus 27 czerwiec 2017, 12:42

6 odpowiedzi

Najlepsza odpowiedź

Ten błąd...

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

... sugeruje, że element, którego szukasz, nie znajduje się w rzutek. Musimy przewijać w dół, aby przynieść element w rzutek. Oto kod pracy:

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

Daj mi znać, jeśli to odpowiada na twoje pytanie.

7
DebanjanB 12 sierpień 2019, 11:25

Szukałem rozwiązania przez ostatnie 2 godziny i nic nie działa. Następnie właśnie dałem czas snu time.sleep(5) po otwarciu okna, na którym należy wykonać działanie i zaczęło działać.

-3
colidyre 5 kwiecień 2020, 13:49

To nie jest ogólny rozwiązanie, ale może pomóc dzwonić dzwonek. Dzięki wejściom w tym wątku mogłem rozwiązać problem, ulepszając stronę docelową.

Wystąpił wyjątek, w moim przypadku:

  • Podczas sprawdzania istnienia elementu, który miał być na górze strony,
  • Podczas gdy strona, gdy na przeglądarce, została automatycznie przewijana na dół z powodu "autofokusa", który został ustawiony na elemencie przycisku na dole strony.

Ponieważ skrypt testowy był przeciwko własnym rozwojem, miałem elastyczność do przeglądu potrzeby "autofokusa" i uniknąć automatycznego przewijania do dołu strony, gdy strona została wykonana.

Alternatywnie, sprawdzanie istnienia innego elementu, który zostanie wykonany w rzutni, jeśli jest to możliwe, może również rozwiązać problem.

0
Snidhi Sofpro 23 lipiec 2020, 11:24

Polecenie Time.Sleep () może być czasami używać, gdy elementy zajmuje czas na przełączanie. Scrolling zawsze nie pomaga.

0
Lokesh Murge 12 czerwiec 2020, 06:45

Możesz spróbować poniżej podczas automatyzowania skryptu w Firefoksie, gdy zwykle rzuca błąd MovetargetOutofboundSexception:

Można przekształcić / powiększać lub wyjść

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

Czasami, jeśli używasz skryptu automatyzacji w Jenkins (CI Tools), możesz również zmierzyć się z problemem z powyższego kodu transformacji, w którym zawartość przeglądarki jest skalowana nie jest rzeczywistą przeglądarką, w tym stanie można wypróbować zmienić rozmiar okna przeglądarki:

driver.set_window_size(x, y)

Lub

driver.set_window_size(2000, 694)
4
Pranjay Kaparuwan 5 sierpień 2019, 08:24

Myślę, że poprawna odpowiedź ma szczęście, że element, którego szukali, stało się na dole strony i tak naprawdę nie wyjaśnili, dlaczego dzieje się to w Firefoksie.

Przeglądarki inne niż Firefox traktują WebDrivers move_to_element Akcja jako przewijanie do części strony z elementem, a następnie najedź nad nim. Firefox wydaje się wziąć a Stanga Hardline że ruch_to_to_element jest po prostu unosi się i czekają na < A href = "https://github.com/w3c/webdriver/issues/1005" Rel = "NefErer"> Przewiń działanie, aby to naprawić.

Na razie musisz obejść ten błąd za pomocą JavaScript, jak wspomniano w poprzedniej odpowiedzi, ale proponuję przy użyciu czegoś takiego, zamiast arbitralnie (cóż, myślę, że przykład był stopcą) przewijanie do dołu strony i nadzieją obiekt jest nadal w widoku.

    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)

Potem później

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()
20
Cynic 29 sierpień 2018, 22:23