1.当我开始写脚本的时候,发现我们项目的模块都是用的内嵌页面frame做的,直接定位ID找不到相应的元素,需要先切换到内嵌页面,再通过常规的定位元素找到。
2.当我做到最后一步导出Excel文件的时候,跳出的下载窗口竟然无法操作。后来我用robot通过控制鼠标来点击保存按钮,但是不知道为什么直接初始化Robot对象去点保存不会执行,所以我通过Robot控制鼠标先点击导出按钮,再点击保存。
1 package selenium_test; 2 3 import org.junit.*; 4 import static org.junit.Assert.*; 5 6 import java.awt.Robot; 7 import java.awt.Toolkit; 8 import java.awt.event.InputEvent; 9 import java.awt.event.KeyEvent; 10 import org.openqa.selenium.*; 11 import org.openqa.selenium.ie.InternetExplorerDriver; 12 import org.openqa.selenium.support.ui.ExpectedCondition; 13 import org.openqa.selenium.support.ui.WebDriverWait; 14 15 public class PRMlogin { 16 private WebDriver driver; 17 private boolean acceptNextAlert = true; 18 private StringBuffer verificationErrors = new StringBuffer(); 19 20 @Before 21 public void setUp() throws Exception { 22 //设置启动ie的IEdriverServer,我下载的是32位的,就在名称后边加了个32。 23 System.setProperty("webdriver.ie.driver", "C:\Program Files (x86)\Internet Explorer\IEDriverServer32.exe"); 24 //启动浏览器 25 driver = new InternetExplorerDriver(); 26 System.out.println("before执行"); 27 28 } 29 @Test 30 public void test123() throws Exception { 31 //进入需要测试的PRM网址 32 driver.get("http://211.94.36.125:11254/portal/security/login.xhtml"); 33 //清空username输入框 34 driver.findElement(By.id("username")).clear(); 35 //输入用户名 36 driver.findElement(By.id("username")).sendKeys("yinyue_zb"); 37 //同上 38 driver.findElement(By.id("password")).clear(); 39 driver.findElement(By.id("password")).sendKeys("123"); 40 //这儿有一个验证码要输入,我设置让他睡5秒,我自己输入,正常可以让开发设置一个万能码或者直接去掉验证码 41 Thread.sleep(5000); 42 //点击登录按钮 43 driver.findElement(By.id("loginButton")).click(); 44 //验证是否登录成功 45 (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { 46 public Boolean apply(WebDriver d) { 47 return d.getCurrentUrl().toLowerCase().endsWith("http://211.94.36.125:11254/portal/portalsso.xhtml"); 48 } 49 }); 50 System.out.println("登录成功!"); 51 Thread.sleep(5000); 52 //点击信用管理 53 driver.findElement(By.linkText("信用管理")).click(); 54 //在这儿之后,我发现获取不到信用管理之下的模块,看了下源代码,发现是一个内嵌页面 55 //找了下资料,利用driver.switchTo().frame("frame-name")方法调到内嵌页面中, 56 //driver.switchTo().defaultContent();跳出内嵌页面 57 driver.switchTo().frame("tab-7-frame"); 58 Thread.sleep(10000); 59 driver.findElement(By.linkText("投诉管理")).click(); 60 Thread.sleep(100); 61 driver.findElement(By.linkText("投诉查询")).click(); 62 Thread.sleep(100); 63 driver.findElement(By.linkText("客服投诉查询")).click(); 64 Thread.sleep(5000); 65 //选择账期 66 driver.findElement(By.id("queryFields:j_id88PopupButton")).click(); 67 driver.findElement(By.className("rich-calendar-tool-btn")).click(); 68 driver.findElement(By.id("queryFields:j_id88DayCell1")).click(); 69 driver.findElement(By.id("queryFields:j_id90PopupButton")).click(); 70 driver.findElement(By.id("queryFields:j_id90DayCell2")).click(); 71 //点击查询按钮 72 driver.findElement(By.id("queryFields:j_id116")).click(); 73 Thread.sleep(5000); 74 //初始化Robot对象 75 final Robot rb = new Robot(); 76 //启动一个线程 77 new Thread() { 78 public void run() { 79 rb.delay(2000); 80 // 模拟回车 81 rb.keyPress(KeyEvent.VK_ENTER); 82 rb.keyRelease(KeyEvent.VK_ENTER); 83 }}.start(); 84 //延迟1.5s 85 rb.delay(1500); 86 //确定好导出按钮的x,y坐标 87 int x=Toolkit.getDefaultToolkit().getScreenSize().width-1550; 88 int y=Toolkit.getDefaultToolkit().getScreenSize().height-640; 89 //移动鼠标到导出按钮,并用鼠标点击, 90 //BUTTON1_MASK代表左键,BUTTON3_MASK代表右键,双键鼠标BUTTON2_MASK代表右键 91 rb.mouseMove(x, y); 92 rb.delay(500); 93 pressMouse(rb, InputEvent.BUTTON1_MASK, 500); 94 Thread.sleep(5000); 95 //确定好保存按钮的x,y坐标 96 int x1=Toolkit.getDefaultToolkit().getScreenSize().width-650; 97 int y1=Toolkit.getDefaultToolkit().getScreenSize().height-60; 98 //移动鼠标到保存按钮,并用鼠标点击 99 rb.mouseMove(x1, y1); 100 rb.delay(500); 101 pressMouse(rb, InputEvent.BUTTON1_MASK, 500); 102 103 104 } 105 // 鼠标单击,要双击就连续调用 106 private static void pressMouse(Robot r, int m, int delay) { 107 r.mousePress(m); 108 r.delay(10); 109 r.mouseRelease(m); 110 r.delay(delay); 111 } 112 113 @After 114 public void tearDown() throws Exception { 115 System.out.println("tearDown执行"); 116 //driver.quit(); 117 String verificationErrorString = verificationErrors.toString(); 118 if (!"".equals(verificationErrorString)) { 119 fail(verificationErrorString); 120 } 121 } 122 123 private boolean isElementPresent(By by) { 124 try { 125 driver.findElement(by); 126 return true; 127 } catch (NoSuchElementException e) { 128 return false; 129 } 130 } 131 132 private boolean isAlertPresent() { 133 try { 134 driver.switchTo().alert(); 135 return true; 136 } catch (NoAlertPresentException e) { 137 return false; 138 } 139 } 140 141 private String closeAlertAndGetItsText() { 142 try { 143 Alert alert = driver.switchTo().alert(); 144 String alertText = alert.getText(); 145 if (acceptNextAlert) { 146 alert.accept(); 147 } else { 148 alert.dismiss(); 149 } 150 return alertText; 151 } finally { 152 acceptNextAlert = true; 153 } 154 } 155 }