双击不在html中的可视元素以使textarea显示为硒

时间:2018-11-10 18:25:27

标签: python-3.x selenium selenium-chromedriver

我想在文本区域输入文本。问题是textarea仅在浏览器中的视觉元素上单击两次后才创建并显示在html中。 对于此可视元素Dubbelklik om je tekst te typen,我无法在html中找到引用该元素并执行double_click()的元素。只有容器,它们是不可单击的元素,或者允许单击,但不执行操作。

直到它起作用,双击的视觉提示出现在中心下方:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as wait

driver = webdriver.Chrome()
driver.get("https://www.hallmark.nl/kaarten/verjaardag-man/")
#wait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href*='https://www.hallmark.nl:443/kaarten/verjaardag-man/grappig-m/make-that-the-cat-wise/happy-bursdeej-to-jou-3415094.aspx']"))).click()
wait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href*='https://www.hallmark.nl:443/kaarten/verjaardag-man/grappig-m/hallmark/een-jaguar-voor-je-verjaardag-3346861.aspx']"))).click()
wait(driver, 10).until(EC.element_to_be_clickable((By.ID, "btnShowSizepicker"))).click()
wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Standaard']"))).click()
wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'showDesktop')]//button[contains(text(),'Binnenkant')]"))).click()

但是从那时起,我似乎找不到任何使硒单击元素的东西。 我尝试单击可以在html中找到的内容:

# elem = driver.find_element_by_xpath("//div[contains(@class, 'canvasAnchor')]").click()

这将导致element not interactable错误。我也尝试过为可查找元素使用偏移量:

elem = driver.find_element_by_class_name("canvas-container")
print(elem.location)
print(elem.size)
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(elem, 0.5*elem.location.get('x'), (0.5*elem.location.get('y'))) #should click in the middle of this container
action.double_click()
action.perform()

但是对于x和y的不同元素和值,我只能使其不执行任何操作,或者单击联系人侧边栏(突出显示“ Neem”一词)。

如果我手动单击两次,则html中将出现一个textarea,我可以执行send_keys('hello world')

1 个答案:

答案 0 :(得分:3)

您必须单击的元素实际上是canvas,所以您要做的就是将光标移至需要双击的位置,然后单击。

我对您的代码进行了尝试,并为我工作:

from selenium.webdriver.common.action_chains import ActionChains

elem = driver.find_element_by_xpath('//*[@class="canvasWrapper active"]//*[@class="canvas-container"]')
ActionChains(driver).move_to_element_with_offset(elem, 70, 60).double_click().perform()

注意:您可能必须等待canvas元素正确加载。我只是在提示符下尝试过。

您可以了解有关此鼠标操作here的信息。

更新:

我注意到双击对我而言就像是一次单击,因此更改为此。

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

elem = driver.find_element_by_xpath('//*[@class="canvasWrapper active"]//*[@class="canvas-container"]')
ActionChains(driver).move_to_element_with_offset(elem, 70, 60).click().perform()
time.sleep(1)
ActionChains(driver).move_to_element_with_offset(elem, 70, 60).click().perform()