дублированный текст, отправленный actionchains send_keys при интеграции в цикл for python - PullRequest
2 голосов
/ 30 июня 2019

Я пытаюсь отправить send_keys в textarea, поэтому я использую actionchains для отправки ключей. Я использовал этот код:

url='https://translate.google.com/?hl=vi'
browserdriver.get(url)
list_test=['product description 1','product description 2']
for i in range (0,2):   
    try:
        body_text=list_test[i]
        browserdriver.execute_script("window.scrollTo(0, document.body.scrollHeight)")      
        item = WebDriverWait(browserdriver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "textarea")))        
        actions.move_to_element(item).send_keys(body_text).perform()
        actions.reset_actions()
        time.sleep(1)
    except:
        pass
print("done")

И результат текста был отправлен в Google Translate, как показано ниже:

product description 1product description 1product description 2

Вы видите, что это так странно, что так должно быть:

product description 1product description 2

Я также вставил print () в utils.py в исходный код actionchains, чтобы узнать, какой текст ввода отправляется в функцию send_keys:

def keys_to_typing(value):
    """Processes the values that will be typed in the element."""
    typing = []
    for val in value:
        if isinstance(val, Keys):
            typing.append(val)
        elif isinstance(val, int):
            val = str(val)
            for i in range(len(val)):
                typing.append(val[i])
        else:
            for i in range(len(val)):
                typing.append(val[i])    
    print(typing)#this is a code line that I inserted
    return typing

и консоль вывода keys_to_typing:

['p', 'r', 'o', 'd', 'u', 'c', 't', ' ', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', ' ', '1']
['p', 'r', 'o', 'd', 'u', 'c', 't', ' ', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', ' ', '1']

['p', 'r', 'o', 'd', 'u', 'c', 't', ' ', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', ' ', '2']
['p', 'r', 'o', 'd', 'u', 'c', 't', ' ', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', ' ', '2']

И это функция send_keys в исходном коде actionchains:

def send_keys(self, keys_to_send):
        """
        Sends keys to current focused element.

        :Args:
         - keys_to_send: The keys to send.  Modifier keys constants can be found in the
           'Keys' class.
        """
        typing = keys_to_typing(keys_to_send)
        if self._driver.w3c:
            for key in typing:
                self.key_down(key)
                self.key_up(key)
        else:
            self._actions.append(lambda: self._driver.execute(
                Command.SEND_KEYS_TO_ACTIVE_ELEMENT, {'value': typing}))
        return self

Пожалуйста, помогите мне объяснить эту странную ситуацию? Я не знаю, почему в цикле, actionchains.send_keys отправлять дублированный контент? спасибо!

1 Ответ

2 голосов
/ 30 июня 2019

Проблема в reset_actions() не работает должным образом (добавление perform() не решает проблему). self.key_down(key) и self.key_up(key) в send_keys() сохраняют символы для ввода в self.w3c_actions.key_action

def key_down(self, value, element=None):
    if element:
        self.click(element)
    if self._driver.w3c:
        self.w3c_actions.key_action.key_down(value)
        self.w3c_actions.pointer_action.pause()
    else:
        self._actions.append(lambda: self._driver.execute(
            Command.SEND_KEYS_TO_ACTIVE_ELEMENT,
            {"value": keys_to_typing(value)}))
    return self

enter image description here

Эти действия должны быть сброшены, когда reset_actions() называется

def reset_actions(self):
    """
        Clears actions that are already stored locally and on the remote end
    """
    if self._driver.w3c:
        self.w3c_actions.clear_actions()
    self._actions = []

Но они этого не делают.

Когда send_keys() вызывается с описанием продукта 2 , текст добавляется к key_action, который уже содержит действия для ввода описания продукта 1 с первого for итерации, поэтому он печатает описание продукта 1 описание продукта 2 .

Возможное решение - создать ActionChains экземпляр внутри цикла

for i in range(0, 2):
    try:
        body_text = list_test[i]
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
        item = WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.TAG_NAME, "textarea")))
        actions = ActionChains(driver)
        actions.move_to_element(item).send_keys(body_text).perform()
        time.sleep(1)
    except:
        pass

Обновление

Я открыл проблему в bugs.chromium . Проблема была воспроизведена, но не будет устранена (по крайней мере, в обозримом будущем).

...