Селен правой кнопкой мыши иногда дважды нажмите - PullRequest
0 голосов
/ 09 февраля 2020

Я делаю бота для игры тральщик, в котором мне нужно иметь возможность щелкать правой кнопкой мыши плитки, чтобы предупредить о бомбах. Я создал функцию для нажатия на плитки со следующим кодом:

from selenium import webdriver
from selenium.webdriver import ActionChains

def click(rad, kol, bomb = False):
    if int(rad) > 0 and int(kol) > 0:
        tile = driver.find_element_by_xpath('//*[@id="{}_{}"]'.format(int(rad), int(kol)))

        if bomb == False:
            #Left click
            tile.click()
        else:
            #Right click
            actionChains.context_click(tile).perform()
            print("Right click")

Но потом, когда я вызываю функцию со следующим кодом:

click(10, 10, True)
click(5, 5, True)
click(1,1,True)

Обе плитки с координатами (10, 10) и (5,5) включаются и выключаются, но только (10,10) включаются снова. В то же время плитка с координатой (1,1) не включается и не выключается, а работает правильно.

Я распечатывал каждый раз, когда запускался код для щелчка правой кнопкой мыши, и 3 раза выводился «щелчок правой кнопкой мыши». я должен.

Редактировать: Я выяснил, что проблема, вероятно, в том, что actionChains запоминают свои предыдущие действия и поэтому снова нажимают на все плитки. Но я не могу понять, как удалить предыдущие действия цепочки. Кажется, функция reset_actions () не удаляет какое-либо действие

1 Ответ

0 голосов
/ 11 февраля 2020

Я обнаружил, что при reset_actions https://github.com/SeleniumHQ/selenium/issues/6837 сообщалось об ошибке, но она закрыта и должна быть в порядке (у меня также была эта проблема на моей машине) ... Либо попробуйте обновить драйвер, либо Я думаю, если это не поможет, тогда просто присвойте actionChains еще раз в if. Это единственное быстрое решение, которое приходит мне в голову на данный момент.

def click(rad, kol, bomb = False):
    if int(rad) > 0 and int(kol) > 0:
        tile = driver.find_element_by_xpath('//*[@id="{}_{}"]'.format(int(rad), int(kol)))

        if bomb == False:
            #Left click
            tile.click()
        else:
            #Right click
            actionChains = ActionChains(driver)
            actionChains.context_click(tile).perform()
            print("Right click")
...