как трижды щелкнуть python, чтобы выбрать абзац? - PullRequest
2 голосов
/ 04 августа 2020

Кто-нибудь подскажите, пожалуйста, способ трижды щелкнуть по селену python. Я пробовал это и другие вещи, но это не сработало.

for x in range(3)
   actions.click()

Ответы [ 4 ]

2 голосов
/ 05 августа 2020

Текущая реализация Selenium не предоставляет никакого способа выполнить тройной щелчок. Однако возможный подход - смоделировать желаемые события мыши с использованием метода execute_script() следующим образом:

def  js_triple_click(element, deltaY = 60, offsetX = 0, offsetY = 0):
    driver.execute_script("""
      "var target = arguments[0];                                 " +
      "var offsetX = arguments[1];                                " +
      "var offsetY = arguments[2];                                " + 
      "var rect = target.getBoundingClientRect();                 " +
      "var cx = rect.left + (offsetX || (rect.width / 2));        " +        
      "var cy = rect.top + (offsetY || (rect.height / 2));        " +
      "                                                           " +
      "emit('mousedown', {clientX: cx, clientY: cy, buttons: 1}); " +
      "emit('mouseup',   {clientX: cx, clientY: cy});             " +
      "emit('mousedown', {clientX: cx, clientY: cy, buttons: 1}); " +
      "emit('mouseup',   {clientX: cx, clientY: cy});             " +
      "emit('mousedown', {clientX: cx, clientY: cy, buttons: 1}); " +
      "emit('mouseup',   {clientX: cx, clientY: cy});             " +
      "emit('click',     {clientX: cx, clientY: cy, detail: 3});  " +
      "                                                           " +
      "function emit(name, init) {                                " +
    "target.dispatchEvent(new MouseEvent(name, init));        " +
      "}                                                          " ;
    """)

element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.TAG_NAME, "p"))) # replace the locator as per your usecase
ActionChains(driver).move_to_element(element).perform()
js_triple_click(element)
print("Tripple click performed")

Вывод в консоль:

Tripple click performed
1 голос
/ 04 августа 2020

Вам нужно импортировать:

from selenium.webdriver.common.action_chains import ActionChains

Тогда вы можете попробовать это:

times = 3
while(times >0):
            ActionChains(driver).click().perform()
            times -= 1;
1 голос
/ 04 августа 2020

Это сделает тройной щелчок по заданному вами вопросу на этой странице. Надеюсь, поможет. Сложность в том, что pyauto gui не заботится о том, где находится окно браузера.

1 голос
/ 04 августа 2020

Я бы сказал, что вам не хватает действия выполнить:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
actions = ActionChains(driver)
for i in range(3):
    actions.click()
    actions.perform()
    print('click')

Теперь оно работает?

ОБНОВЛЕНО ОТВЕТ Попробуйте найти два элемента, а затем используйте drag_and_drop с этими элементами в качестве источника и конца команды. Код ниже, кажется, работает и выбирает абзац.

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("https://en.wikipedia.org/wiki/Home")
actions = ActionChains(driver)
# first element and last element in the paragraph
start = driver.find_element_by_xpath('//*[@id="mw-content-text"]/div/div[1]')
end = driver.find_element_by_xpath('//*[@id="mw-content-text"]/div/div[4]')

actions.drag_and_drop(start, end).perform()

Я использовал Википедию в качестве теста и взял xpath из двух строк текста. Сценарий выбрал абзац между ними. Так что все должно быть в порядке. Сообщите мне

...