分享

和我一起学 Selenium WebDriver(7)

 KILLKISS 2016-04-26
昨天我们已经可以轻松移动鼠标了,距离拖拽只有一步之遥。 其实这就是一层窗户纸,捅破它就搞定了,之前做的操作可以说都是单步操作:移动鼠标、点击页面元素、弹出窗口等等;而拖拽操作就不行了,他需要一连串连贯的动作配合起来:mousedown、mousemove、mouseup,缺了哪个都不行,顺序不对也不行。

【1、如何进行拖拽】
    这时候我们就需要用到 org.openqa.selenium.interactions.Actions 这个类了,它专门用来做动作组合的。 Actions 中有若干方法,可以让你很容易的生成 鼠标、按键的操作集合。
    例如: clickAndHold + moveToElement + release 就可以组合成一套拖拽的操作;
    详细内容还请查看 Selenium 的 javadoc:http://selenium./svn/trunk/docs/api/java/index.html

     生成操作组合后,利用 build 方法可以得到一个有效的 Action 对象;最后使用 perform 方法执行就可以了。

    和昨天测试鼠标移动的情况类似,还是 FireFox 问题最大, IE8 有小问题, Chrome 测试最正常。

FireFox:使用 moveToElement 方法时,效果同昨天使用 MoveToOffsetAction 情况类似,xOffset、yOffset值无论如何设置,在页面上得到的都是 指定的 页面元素;
    另外,如果在不使用 moveToElement的时候就使用moveByOffset 很容易报错:org.openqa.selenium.interactions.MoveTargetOutOfBoundsException: Element cannot be scrolled into view: (WARNING: The server did not provide any stacktrace information)

IE8: 使用 moveToElement 方法时,如果用到了 xOffset、yOffset 参数,你会发现在 IE8中 计算的情况 和 Chrome 上不太一样,貌似范围会更大一些,因此导致如果设置为0, 0 时,就不是你预期的结果了

测试代码我分成了3个部分:
  • 观察反复拖拽测试 1
   可以专门用来观察 moveToElement 在不同浏览器下的情况

  • 观察反复拖拽测试 2
   可以专门用来观察 moveByOffset 在不同浏览器下的情况,FireFox 会报错

  • 观察系列操作测试
   可以专门用来观察 多种组合操作 在 不同浏览器下的情况


    总之,对于鼠标移动和拖拽的测试还是直接在 Chrome 下进行就可以了吧;ie的只能略微参考;剩下的还是自己手动来吧。。。。
    如果想在 IE 上正常测试,建议采用moveToElement(WebElement)+ moveByOffset(xOffset, yOffset); 避免直接使用 moveToElement(WebElement, xOffset, yOffset),同时还是要严格注意 xOffset 和 yOffset 的设置;这个需要根据自己的实际情况来调试了。

    学习了这些内容以后,对于 测试 zTree 这类前端 js 插件来说就足够了,剩下的就努力干活儿吧。 貌似我是真用不上 Selenium 的 webdriver 了。。。

以下是测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package lesson07;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.HasInputDevices;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.MoveMouseAction;
import org.openqa.selenium.interactions.MoveToOffsetAction;
import org.openqa.selenium.internal.Locatable;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import util.Common;
public class ExampleForDrag  {
     
    static WebDriver driver;
     
    @BeforeClass
    public static void init() {
        System.out.println("init...");
        //用 Chrome
//      System.setProperty(
//              "webdriver.chrome.driver",
//              "E:\\BaiduWangPan\\百度网盘\\javascript\\Selenium WebDriver\\chromedriver_win_23.0.1240.0\\chromedriver.exe");
//      driver = new ChromeDriver();
         
        //用 IE
//      driver = new InternetExplorerDriver();
         
        //用 FireFox
        System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
        // 创建一个 FireFox 的浏览器实例
        driver = new FirefoxDriver();
    }
     
    @Test
    public void test() {
        // 让浏览器访问 zTree Demo
        driver.get("http://www./v3/demo/cn/exedit/drag.html");
         
        // 等待 zTree 初始化完毕,Timeout 设置10秒
        try {
            (new WebDriverWait(driver, 10, 500)).until(new ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver d) {
                    WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#treeDemo li').get(0);");
                    return element != null;
                }
            });
             
        } catch(Exception e) {
            e.printStackTrace();
        }
         
        //找到第一个根节点的子节点
        ((JavascriptExecutor)driver).executeScript("window.zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');"
                + "window.zTreeNodeSrc = window.zTreeObj.getNodes()[0].children[0];");
         
        //获取 需要拖拽的节点对象
        WebElement elementSrc = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#' + window.zTreeNodeSrc.tId + '_a').get(0)");
        //获取 目标节点对象
        WebElement elementTarget = (WebElement) ((JavascriptExecutor)driver).executeScript("window.zTreeNodeTarget = window.zTreeNodeSrc.getNextNode().children[0]; return $('#' + window.zTreeNodeTarget.tId + '_a').get(0)");
        Actions actions = new Actions(driver);
        Action action;
        //观察反复拖拽测试 1
//      actions.clickAndHold(elementSrc);
//      for (int i=0; i<500; i++) {
//          actions.moveToElement(elementTarget, i%100-50, i%50-20);
//      }
//      actions.release();
//      action = actions.build();
//      action.perform();
//     
//      Common.waitFor(10, driver);
        //观察反复拖拽测试 2
//      actions.clickAndHold(elementSrc).moveToElement(elementTarget);
//      int x = 0, y = 0, dx=2, dy=2;
//      for (int i=0; i<500; i++) {
//          x+=2; y+=2;
//          if (x > 50) {
//              dx = -x;
//              x = 0;
//          } else {
//              dx = 2;
//          }
//          if (y > 150) {
//              dy = -y;
//              y = 0;
//          } else {
//              dy = 2;
//          }
//          actions.moveByOffset(dx, dy);
//      }
//      actions.release();
//      action = actions.build();
//      action.perform();
//      Common.waitFor(10, driver);
         
        //观察系列操作测试
        System.out.println("移动成为目标节点的 前一个节点");
        actions.clickAndHold(elementSrc).moveToElement(elementTarget, 60, 1).release();
        action = actions.build();
        action.perform();
         
        // 等待 10 秒
        Common.waitFor(10, driver);
         
        System.out.println("移动成为目标节点的后一个节点");
        actions.clickAndHold(elementSrc).moveToElement(elementTarget, 60, 38).release();
        action = actions.build();
        action.perform();
         
        // 等待 10秒
        Common.waitFor(10, driver);
         
        System.out.println("移动成为目标节点的子节点");
        actions.clickAndHold(elementSrc).moveToElement(elementTarget).release();
        action = actions.build();
        action.perform();
         
        // 等待 10秒
        Common.waitFor(10, driver);
        System.out.println("移动成为目标节点下一个节点的子节点");
        actions.clickAndHold(elementSrc).moveToElement(elementTarget).moveByOffset(0, 20).release();
        action = actions.build();
        action.perform();
         
        // 等待 10秒
        Common.waitFor(10, driver);
         
    }
     
    @AfterClass
    public static void destory() {
        System.out.println("destory...");
        //关闭浏览器
        driver.quit();
    }
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多