使用 (Python) Webdriver 在不使用元素的情况下选择文本(即单击并拖动以突出显示从一组坐标到另一组坐标)

Dar*_*ren 5 python selenium webdriver highlight mouseevent

我正在尝试选择一些文本(即用鼠标光标突出显示它)进行自动化测试。我想使用 Python 和 webdriver 访问此网址:http://en.wikipedia.org/wiki/WebDriver#Selenium_WebDriver并突出显示标题“Selenium WebDriver”下的第二句话(“Selenium WebDriver 接受命令(发送到Selenese,或通过客户端 API)并将它们发送到浏览器。”)

棘手的是,我希望这可以在不使用任何元素的情况下完成,并且我一直在尝试找出一种方法来单击 x 和 y 坐标指定的位置,然后按住移动到由一组不同的 x 和 y 坐标。

通过阅读,我了解到,当您需要指定一个元素时,不可能仅通过坐标单击页面的某个区域,因此可以仅使用单个远程元素(比方说“. mw-editsection>a")? 我认为可以通过使用该元素作为参考并单击距其一定距离(即按偏移量单击)来完成此操作。

这是我到目前为止所尝试的,但它没有完成这项工作:

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

driver = webdriver.Firefox()
actions = ActionChains(driver)
driver.get("http://en.wikipedia.org/wiki/WebDriver#Selenium_WebDriver")

the_only_element = ".mw-editsection>a"
element = driver.find_element_by_css_selector(the_only_element)

actions.move_to_element_with_offset(element,50,50)
actions.click_and_hold(on_element=None)
actions.move_by_offset(50, 50)
actions.release()
actions.perform()
Run Code Online (Sandbox Code Playgroud)

由此,我得到这个错误:

WebDriverException: Message: u"'UnknownError: Cannot press more then one button or an already pressed button.' when calling method: [wdIMouse::down]" 
Run Code Online (Sandbox Code Playgroud)

背景:

我明白上面的例子有点做作,但我实际上无法向您提供我真正想要测试的东西。我实际上正在做的是使用 webdriver 在 Python 中编写一系列测试来测试我们的文档查看器,并且我确实需要能够突出显示一行文本,因为这是在我们的系统上添加注释的方式。不幸的是,文档查看器实际上并不显示提交的文档,仅通过某种 JavaScript 魔法显示它的图像。文档页面是一个元素,但页面本身没有可供 Webdriver 单击的元素。

因此,我希望能够通过指定坐标(在句子的开头)来单击并按住页面上的某个位置,在模拟鼠标光标向右移动到第二组时保持鼠标按钮不放坐标(在句子末尾),然后释放按钮。

长话短说:

是否可以在不使用元素的情况下从网页上的任意点单击并拖动到另一个点(除了充当将任意点定义为偏移的参考)?

如果没有,您建议使用什么其他方法来突出显示文本区域?您能否提供一个可行的示例?

谢谢!

Dar*_*ren 1

我想我已经解决了-以下似乎确实有效,但我似乎无法让它放手!我认为这可能是由于 Webdriver 的 Python 绑定中 .release() 的实现有问题:

def click_and_drag(locator, x_from, y_from, x_to, y_to):
    element = driver.find_element_by_css_selector(locator)
    actions.move_to_element(element)
    actions.move_by_offset(x_from, y_from)
    actions.click_and_hold(on_element=None)
    actions.move_by_offset(x_to, y_to)
    actions.release(on_element=None)
    actions.perform()
Run Code Online (Sandbox Code Playgroud)