Действие Selenium 'move_to_element' не работает в Safari из-за поддерживаемой команды 'pause' - PullRequest
0 голосов
/ 23 октября 2018

Следующая команда завершилась неудачно в браузере Safari во время тестирования автоматизации:

ActionChains(driver).move_to_element(searchInput).perform()

Исключение:

InvalidArgumentException: Сообщение: источник ввода с обнаруженным ключом с недопустимым значением «value» в полезной нагрузке: {actions = ({duration = 0; Тип = Пауза;});id = ключ;type = key;}

Весь усовершенствованный пример теста:

def test_safari2(self):
    driver = webdriver.Safari()
    driver.get('https://www.wikipedia.org')
    locator = (By.ID, 'searchInput')

    # 1. the line below is passed
    searchInput = WebDriverWait(driver, timeout=30).until(expected_conditions.visibility_of_element_located(locator))

    # 2. the line below is failed in Safari, but passed in Chrome, FF
    ActionChains(driver).move_to_element(searchInput).perform()

Однако!Если self.w3c_actions.key_action.pause() прокомментировано внутри действия move_to_element(), тогда работают целые цепочки действий!

def move_to_element(self, to_element):
    """
    Moving the mouse to the middle of an element.

    :Args:
     - to_element: The WebElement to move to.
    """
    if self._driver.w3c:
        self.w3c_actions.pointer_action.move_to(to_element)
        # self.w3c_actions.key_action.pause()
    else:
        self._actions.append(lambda: self._driver.execute(
                             Command.MOVE_TO, {'element': to_element.id}))
    return self

Аналогичная ситуация с другими действиями.Мой вопрос: это известное ограничение Safari?И поэтому команда ActionChais не может быть использована для Selenium + Safari?Или есть какая-то особенность конфигурации?

Моя конфигурация бегуна:

  • ОС: Mac HighSierra 10.13.6
  • Safari 12.0 (13606.2.11)
  • Selenium: 3.14.1
  • Python: 2.7.14
  • Safari запускается с возможностями w3c и протоколом (т. Е. Driver.w3c = True)

История вопроса: у меня есть достаточно развитая среда с множеством действий и тестов, которые работают хорошо для Chrome и Firefox.Сейчас я пытаюсь расширить охват браузера Safari.Поэтому я ищу решение для неработающих ActionChains

1 Ответ

0 голосов
/ 05 декабря 2018

Обходной путь, обернув класс ActionChains так, чтобы key_action.pause не использовался (что, кажется, не служит какой-либо важной цели):

import selenium.webdriver

class ActionChains(selenium.webdriver.ActionChains):
    def __init__(self, driver):
        super(ActionChains, self).__init__(driver)
        if driver.name in ('Safari', 'Safari Technology Preview'):
            self.w3c_actions.key_action.pause = lambda *a, **k: None
...