Selenium高级用户交互

来源:互联网 发布:弧形楼梯怎么算法 编辑:程序博客网 时间:2024/05/16 02:17
高级用户交互介绍高级用户交互API是用于描述用户可以在网页上执行的操作的新的更全面的API。这包括按住Ctrl键的同时拖放或单击多个元素等操作。入门(简短说明)为了生成一系列动作,使用动作生成器来构建它。首先,配置它:   Actions builder = new Actions(driver);   builder.keyDown(Keys.CONTROL)       .click(someElement)       .click(someOtherElement)       .keyUp(Keys.CONTROL);然后得到的行动:   Action selectMultiple = builder.build();并执行它:   selectMultiple.perform();动作的顺序应该很短 - 最好是执行一小段动作,并在序列的其余部分发生之前确认页面处于正确的状态。下一节列出所有可用的操作,以及如何扩展。键盘交互到目前为止,键盘交互是通过一个特定的元素进行的,WebDriver确保元素处于这种交互的适当状态。这主要包括将元素滚动到视口中并关注元素。由于新的Interactions API采用了面向用户的方法,因此在向用户发送文本之前,与元素进行明确的交互更加符合逻辑。这意味着点击一个元素或发送一个Keys.TAB焦点在一个相邻的元素上。新的交互API将(首先)支持没有提供元素的键盘操作。在发送键盘事件之前关注元素的额外工作将在稍后添加。鼠标交互鼠标操作有一个上下文 - 鼠标的当前位置。所以当为几个鼠标动作(使用onElement)设置一个上下文时,第一个动作将相对于用作上下文的元素的位置,下一个动作将相对于最后一个动作结束时的鼠标位置,等等。当前状态该API(大部分)是针对动作和动作生成器完成的。它完全实现了HtmlUnit和Firefox,并正在为Opera和IE实现。大纲一个动作所有的操作都实现了Action界面。这个动作只有一个方法:perform()。这个想法是,每个动作获得构造函数中传递的所需信息。当被调用时,动作会指出它应该如何与页面进行交互(例如,找出发送键的活动元素或者计算点击的元素的屏幕坐标),并调用底层实现来实际执行互动。目前有几个动作:ButtonReleaseAction - 释放一个持有的鼠标按钮。ClickAction - 等同于 WebElement.click()ClickAndHoldAction - 按住鼠标左键。ContextClickAction - 单击(通常)带来上下文菜单的鼠标按钮。DoubleClickAction - 双击一个元素。KeyDownAction - 按住一个修饰键。KeyUpAction - 释放修改键。MoveMouseAction - 将鼠标从当前位置移动到另一个元素。MoveToOffsetAction - 将鼠标移动到元素的偏移量(偏移量可以是负值,元素可以是鼠标移到的相同元素)。SendKeysAction - 相当于 WebElement.sendKey(...)CompositeAction包含其他动作,当它的perform方法被调用时,它将调用它所包含的每个动作的执行方法。通常情况下,行动不应该直接创建 - ActionChainsGenerator应该照顾。生成操作链所述Actions链发生器实现了生成器图案来创建包含一组其他动作的CompositeAction。这应该通过配置一个Actions链生成器实例并调用它的build()方法来获取复杂的操作来简化构建操作:   Actions builder = new Actions(driver);   Action dragAndDrop = builder.clickAndHold(someElement)       .moveToElement(otherElement)       .release(otherElement)       .build();   dragAndDrop.perform();Actions该类的计划扩展是添加一个方法,将任何行动附加到它所持有的当前行动列表。这将允许添加扩展操作,而无需手动创建CompositeAction。有关扩展操作,请参阅下文。扩展Action接口的指导原则你的Action界面只有一个动作 - perform()。除了实际的交互本身之外,还应该在这种方法中进行任何条件评估。页面状态可能在动作的创建和实际执行之间发生了变化,因此元素的可见性和坐标不应该在Action构造函数中找到。实施细节为了实现每个动作正在执行的操作和实际执行的操作之间的分离,所有的行动依靠两个接口:Mouse和Keyboard。这些接口由支持高级用户交互的每个驱动程序实现。请注意,这些接口被指定为由操作使用 - 而不是由最终用户使用 -本节中的信息仅对计划扩展WebDriver的开发人员有用。一个警告的话键盘和鼠标接口被设计为供各种操作类使用。由于这个原因,他们的API比Actions链式发生器的API更不稳定。直接使用这些接口可能不会产生预期的结果,因为在实际生成事件之前,操作本身会执行额外的工作以确保满足正确的条件。这样的初步工作包括关注正确的元素,或者在鼠标交互之前确保元素可见。键盘该Keyboard接口有三个方法:void sendKeys(CharSequence... keysToSend)- 类似于现有的sendKeys(...)方法。void pressKey(Keys keyToPress) - 只发送按键,不释放。只能用于修改键(Control,Alt和Shift)。void releaseKey(Keys keyToRelease) - 释放修饰键。调用之间存储修改键的状态是实现的责任。将接收这些事件的元素是活动元素。鼠标该Mouse接口包括以下方法(此接口将很快改变):void click(WebElement onElement)- 类似于现有的click()方法。void doubleClick(WebElement onElement) - 双击一个元素。void mouseDown(WebElement onElement) - 按住鼠标左键在一个元素上。操作selectMultiple = builder.build();void mouseUp(WebElement onElement) - 释放元素上的鼠标按钮。void mouseMove(WebElement toElement) - 从(从当前位置)移动到另一个元素。void mouseMove(WebElement toElement, long xOffset, long yOffset) -(从当前位置)移动到新的坐标:(toElement + xOffset的X坐标,toElement + yOffset的Y坐标)。void contextClick(WebElement onElement) - 对元素执行上下文单击(右键单击)。本土事件与合成事件在WebDriver中,高级用户交互是通过直接模拟Javascript事件(即合成事件)或让浏览器生成Javascript事件(即本地事件)来提供的。本地事件更好地模拟用户交互,而合成事件是独立于平台的,当使用替代窗口管理器时,在Linux中可能很重要,请参阅Linux上的本机事件。只要有可能就应该使用本地事件。下表显示了哪些浏览器支持哪种类型的事件:浏览器    操作系统   本机事件   合成事件火狐 Linux的 支持的    支持(默认)火狐 视窗 支持(默认) 支持的IE浏览器  视窗 支持(默认) 不支持谷歌 Linux / Windows的   支持的*   不支持欧朋 Linux / Windows的   支持(默认) 不支持HtmlUnit Linux / Windows的  支持(默认) 不支持*)ChromeDriver提供了两种支持本地事件的模式,称为WebKit事件和原始事件。在WebKit事件中,ChromeDriver调用触发Javascript事件的WebKit函数,在原始事件模式下使用操作系统事件。在FirefoxDriver中,本地事件可以在FirefoxProfile中打开和关闭。FirefoxProfile profile = new FirefoxProfile();profile.setEnableNativeEvents(true);FirefoxDriver driver = new FirefoxDriver(profile);例子以下是一些本地事件与合成事件不同的例子:通过合成事件,可以点击隐藏在其他元素后面的元素。使用本地事件时,浏览器将点击事件发送到给定位置的最顶层元素,就像用户点击特定位置时发生的那样。当用户按下“tab”键时,焦点从当前元素跳转到下一个元素。这是由浏览器完成的。对于合成事件,浏览器不知道“tab”键是否被按下,因此不会改变焦点。使用本地事件浏览器将按预期行事。
原创粉丝点击