how to triple-click on python to select a paragraph?
Question:
Someone please tell me a way to triple-click on selenium python. I tried this and other things but it did not work.
for x in range(3)
actions.click()
Answers:
I would say that you are missing the perform action:
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')
Does it work now?
UPDATED ANSWER
Try to locate two elements and then use drag_and_drop with those elements as source and end of the command. The code below seems to work and selects the paragraph.
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()
I used Wikipedia as a test and I took the xpath of two lines of text. The script selected the paragraph in between. So it should be okay. Let me know
You need to import:
from selenium.webdriver.common.action_chains import ActionChains
Then you can try this:
times = 3
while(times >0):
ActionChains(driver).click().perform()
times -= 1;
This will triple click on the question you asked on this page. Hope it helps. The tricky part is pyautogui does not care about where the browser window is.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pyautogui
driver = webdriver.Firefox(executable_path=r'C:\Path\To\Your\geckodriver.exe')
driver.get('https://stackoverflow.com/questions/63253535/how-to-triple-click-on-python-to-select-a-paragraph')
driver.maximize_window()
test_paragraph = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, "//p[contains(text(), 'Someone please tell me a way to triple-click ')]")))
# import time
# time.sleep(3)
panel_height = driver.execute_script('return window.outerHeight - window.innerHeight;')
abs_x = test_paragraph.location['x']
y = test_paragraph.location['y']
abs_y = y + panel_height
print("Absolute x : " + str(abs_x))
print("Absolute y : " + str(abs_y))
pyautogui.moveTo(abs_x + 10, abs_y)
pyautogui.click(clicks=3)
The current implementation of Selenium doesn’t provide any way to perform a triple click. However a feasable approach would be to simulate the desired mouse events using execute_script()
method as follows:
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")
Console Output:
Tripple click performed
Alternatively, you can try hard coding it.
actions = ActionChains(driver)
def triple_click(element_x):
actions.click(element_x).click(element_x).click(element_x).perform()
triple_click(your_element)
Someone please tell me a way to triple-click on selenium python. I tried this and other things but it did not work.
for x in range(3)
actions.click()
I would say that you are missing the perform action:
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')
Does it work now?
UPDATED ANSWER
Try to locate two elements and then use drag_and_drop with those elements as source and end of the command. The code below seems to work and selects the paragraph.
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()
I used Wikipedia as a test and I took the xpath of two lines of text. The script selected the paragraph in between. So it should be okay. Let me know
You need to import:
from selenium.webdriver.common.action_chains import ActionChains
Then you can try this:
times = 3
while(times >0):
ActionChains(driver).click().perform()
times -= 1;
This will triple click on the question you asked on this page. Hope it helps. The tricky part is pyautogui does not care about where the browser window is.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pyautogui
driver = webdriver.Firefox(executable_path=r'C:\Path\To\Your\geckodriver.exe')
driver.get('https://stackoverflow.com/questions/63253535/how-to-triple-click-on-python-to-select-a-paragraph')
driver.maximize_window()
test_paragraph = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, "//p[contains(text(), 'Someone please tell me a way to triple-click ')]")))
# import time
# time.sleep(3)
panel_height = driver.execute_script('return window.outerHeight - window.innerHeight;')
abs_x = test_paragraph.location['x']
y = test_paragraph.location['y']
abs_y = y + panel_height
print("Absolute x : " + str(abs_x))
print("Absolute y : " + str(abs_y))
pyautogui.moveTo(abs_x + 10, abs_y)
pyautogui.click(clicks=3)
The current implementation of Selenium doesn’t provide any way to perform a triple click. However a feasable approach would be to simulate the desired mouse events using execute_script()
method as follows:
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")
Console Output:
Tripple click performed
Alternatively, you can try hard coding it.
actions = ActionChains(driver)
def triple_click(element_x):
actions.click(element_x).click(element_x).click(element_x).perform()
triple_click(your_element)