最近使用selenium webdriver 用Java语言写脚本测试登录功能. 碰到一个问题: 无法调用指定的Firefox Profile.
请教各位大神解决办法.
问题重现过程
1. 将注册和登录分别写在两段脚本并存储在两个单独的java文件中.
2. 运行注册脚本完成注册后, 使用注册的帐号及密码信息运行登录实例.
3. 登录失败,提示帐号密码错误. 但是如果将登录段脚本合并到注册脚本中就可以成功登录.
注册脚本:
1 package com.qiujy.testweb_mvn; 2 import java.io.File; 3 import java.io.IOException; 4 import java.util.List; 5 6 import org.apache.commons.io.FileUtils; 7 import org.openqa.selenium.By; 8 import org.openqa.selenium.Cookie; 9 import org.openqa.selenium.OutputType; 10 import org.openqa.selenium.TakesScreenshot; 11 import org.openqa.selenium.WebDriver; 12 import org.openqa.selenium.WebElement; 13 import org.openqa.selenium.firefox.FirefoxDriver; 14 import org.openqa.selenium.firefox.FirefoxOptions; 15 import org.openqa.selenium.firefox.FirefoxProfile; 16 import org.openqa.selenium.firefox.internal.ProfilesIni; 17 import org.openqa.selenium.support.ui.ExpectedCondition; 18 import org.openqa.selenium.support.ui.WebDriverWait; 19 20 21 public class ProfileRegister { 22 private static final String WebElement = null; 23 24 /** 25 * @param args 26 * @throws InterruptedException 27 * @throws IOException 28 */ 29 public static void main(String[] args) throws InterruptedException, IOException { 30 System.setProperty("webdriver.gecko.driver", "D:\\geckodriver-v0.19.1-win64\\geckodriver.exe"); 31 ProfilesIni pi = new ProfilesIni(); 32 FirefoxProfile profile = pi.getProfile("defaultqhj"); 33 FirefoxOptions options = new FirefoxOptions(); 34 options.setProfile(profile); 35 WebDriver driver = new FirefoxDriver(options); 36 //// FirefoxProfile profile = new FirefoxProfile(new File("C:\\Users\\qianhj\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\as1bczf1.default-1513049377171")); 37 // FirefoxOptions options = new FirefoxOptions(); 38 // options.setProfile(profile); 39 // WebDriver driver = new FirefoxDriver(options); 40 41 // String firefoxProfileDir="C:\\Users\\qianhj\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\lsntx5d6.defaultqhj"; 42 //// FirefoxProfile profile = new FirefoxProfile(new File("C:\\Users\\qianhj\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\lsntx5d6.defaultqhj")); 43 // FirefoxProfile profile=new FirefoxProfile(new File(firefoxProfileDir)); 44 // WebDriver driver = new FirefoxDriver(profile); 45 46 47 driver.manage().window().maximize(); 48 driver.get("http://192.168.203.99:5000/#/login"); 49 String sysTitle = driver.getTitle(); 50 String expectedTitle="Dva Demo"; 51 if (sysTitle.equals(expectedTitle)) { 52 System.out.println(sysTitle); 53 } else { 54 System.out.println("Wrong Title"); 55 } 56 57 //点“注册”,打开注册页面 58 WebElement addButton=driver.findElement(By.xpath("//*[@id=\"root\"]/div/form/div[5]/a")); 59 addButton.click(); 60 Thread.sleep(1000); 61 62 //输入注册信息 63 WebElement userName=driver.findElement(By.xpath("//*[@id=\"nickname\"]")); 64 userName.sendKeys("abc"); 65 WebElement password=driver.findElement(By.xpath("//*[@id=\"password\"]")); 66 password.sendKeys("123456"); 67 WebElement cpassword=driver.findElement(By.xpath("//*[@id=\"confirm\"]")); 68 cpassword.sendKeys("123456"); 69 WebElement mailbox=driver.findElement(By.xpath("//*[@id=\"email\"]")); 70 mailbox.sendKeys("abc@000.com"); 71 WebElement add=driver.findElement(By.xpath("//*[@id=\"residence\"]")); 72 add.click(); 73 WebElement add1=driver.findElement(By.xpath("/html/body/div[2]/div/div/div/ul[1]/li[1]")); 74 add1.click(); 75 System.out.println(add1); 76 WebElement add2=driver.findElement(By.xpath("/html/body/div[2]/div/div/div/ul[2]/li")); 77 add2.click(); 78 System.out.println(add2); 79 WebElement add3=driver.findElement(By.xpath("/html/body/div[2]/div/div/div/ul[3]/li")); 80 add3.click(); 81 System.out.println(add3); 82 WebElement cellphone=driver.findElement(By.xpath("//*[@id=\"phone\"]")); 83 cellphone.sendKeys("123456789"); 84 85 //获取验证码 86 WebElement verifycode=driver.findElement(By.className("ant-btn")); 87 verifycode.click(); 88 WebElement text=driver.findElement(By.className("ant-notification-notice-description")); 89 String str=text.getText(); 90 String str1=str.replaceAll("请在5min内输入验证码:",""); 91 System.out.println(str1); 92 WebElement inputcode=driver.findElement(By.xpath("//*[@id=\"captcha\"]")); 93 inputcode.sendKeys(str1); 94 WebElement checkbox=driver.findElement(By.xpath("//*[@id=\"root\"]/div/form/div[8]/div/div/label/span[1]/input")); 95 checkbox.click(); 96 File screenshotFile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 97 FileUtils.copyFile(screenshotFile, new File("E:\\screenshot\\Register"+System.currentTimeMillis()+".png")); 98 WebElement register=driver.findElement(By.xpath("//*[@id=\"root\"]/div/form/div[9]/div/div/button")); 99 register.click(); 100 101 //取出注册成功的提示字样 102 WebElement text2=(new WebDriverWait(driver,10)).until(new ExpectedCondition<WebElement>() { 103 public org.openqa.selenium.WebElement apply(WebDriver driver) { 104 List<org.openqa.selenium.WebElement> eles = driver.findElements(By.className("ant-notification-notice-description")); 105 if(eles.size() == 2 && eles.get(1).isDisplayed()) { 106 return eles.get(1); 107 } 108 return null; 109 } 110 }); 111 112 System.out.println(text2.getText().toString()); 113 114 Thread.sleep(1000); 115 File screenshotFile1=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 116 FileUtils.copyFile(screenshotFile1, new File("E:\\screenshot\\Success"+System.currentTimeMillis()+".png")); 117 118 119 120 121 122 //用刚刚注册的帐号登录 123 WebElement uName=driver.findElement(By.xpath("//*[@id=\"userName\"]")); 124 uName.sendKeys("abc"); 125 WebElement pwd=driver.findElement(By.xpath("//*[@id=\"password\"]")); 126 pwd.sendKeys("123456"); 127 WebElement Button=driver.findElement(By.xpath("//*[@id=\"root\"]/div/form/div[4]/button")); 128 Button.click(); 129 File screenshotFile2=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 130 FileUtils.copyFile(screenshotFile2, new File("E:\\screenshot\\login"+System.currentTimeMillis()+".png")); 131 132 133 134 //取出登录成功的提示框title 135 WebElement text3=(new WebDriverWait(driver, 10)).until(new ExpectedCondition<WebElement>(){ 136 public org.openqa.selenium.WebElement apply(WebDriver driver){ 137 List<org.openqa.selenium.WebElement> eles = driver.findElements(By.className("ant-notification-notice-message")); 138 if(eles.size()==3 && eles.get(2).isDisplayed()) { 139 return eles.get(2); 140 } 141 return null; 142 } 143 }); 144 System.out.println(text3.getText().toString()); 145 146 147 148 149 //取出登录成功的提示字样 150 WebElement text4=(new WebDriverWait(driver, 10)).until(new ExpectedCondition<WebElement>(){ 151 public org.openqa.selenium.WebElement apply(WebDriver driver){ 152 List<org.openqa.selenium.WebElement> eles = driver.findElements(By.className("ant-notification-notice-description")); 153 if(eles.size()==3 && eles.get(2).isDisplayed()) { 154 return eles.get(2); 155 } 156 return null; 157 } 158 }); 159 System.out.println(text4.getText().toString()); 160 161 File screenshotFile3=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 162 FileUtils.copyFile(screenshotFile3, new File("E:\\screenshot\\LS"+System.currentTimeMillis()+".png")); 163 164 Thread.sleep(10000); 165 166 167 168 driver.quit(); 169 170 } 171 172 }
登录脚本:
1 package com.qiujy.testweb_mvn; 2 import java.io.File; 3 import java.io.IOException; 4 import java.util.List; 5 6 import org.apache.commons.io.FileUtils; 7 import org.openqa.selenium.By; 8 import org.openqa.selenium.Cookie; 9 import org.openqa.selenium.OutputType; 10 import org.openqa.selenium.TakesScreenshot; 11 import org.openqa.selenium.WebDriver; 12 import org.openqa.selenium.WebElement; 13 import org.openqa.selenium.firefox.FirefoxDriver; 14 import org.openqa.selenium.firefox.FirefoxOptions; 15 import org.openqa.selenium.firefox.FirefoxProfile; 16 import org.openqa.selenium.firefox.internal.ProfilesIni; 17 import org.openqa.selenium.support.ui.ExpectedCondition; 18 import org.openqa.selenium.support.ui.WebDriverWait; 19 20 21 public class ProfileLogin { 22 private static final String WebElement = null; 23 24 /** 25 * @param args 26 * @throws InterruptedException 27 * @throws IOException 28 */ 29 public static void main(String[] args) throws InterruptedException, IOException { 30 System.setProperty("webdriver.gecko.driver", "D:\\geckodriver-v0.19.1-win64\\geckodriver.exe"); 31 ProfilesIni pi = new ProfilesIni(); 32 FirefoxProfile profile = pi.getProfile("defaultqhj"); 33 FirefoxOptions options = new FirefoxOptions(); 34 options.setProfile(profile); 35 WebDriver driver = new FirefoxDriver(options); 36 37 38 driver.manage().window().maximize(); 39 driver.get("http://192.168.203.99:5000/#/login"); 40 String sysTitle = driver.getTitle(); 41 String expectedTitle="Dva Demo"; 42 if (sysTitle.equals(expectedTitle)) { 43 System.out.println(sysTitle); 44 } else { 45 System.out.println("Wrong Title"); 46 } 47 48 49 //用ProfileRegister 脚本中注册的帐号登录 50 WebElement uName=driver.findElement(By.xpath("//*[@id=\"userName\"]")); 51 uName.sendKeys("abc"); 52 WebElement pwd=driver.findElement(By.xpath("//*[@id=\"password\"]")); 53 pwd.sendKeys("123456"); 54 WebElement Button=driver.findElement(By.xpath("//*[@id=\"root\"]/div/form/div[4]/button")); 55 Button.click(); 56 File screenshotFile2=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 57 FileUtils.copyFile(screenshotFile2, new File("E:\\screenshot\\login"+System.currentTimeMillis()+".png")); 58 59 60 61 //取出登录成功的提示框title 62 WebElement text3=(new WebDriverWait(driver, 10)).until(new ExpectedCondition<WebElement>(){ 63 public org.openqa.selenium.WebElement apply(WebDriver driver){ 64 List<org.openqa.selenium.WebElement> eles = driver.findElements(By.className("ant-notification-notice-message")); 65 if(eles.size()==3 && eles.get(2).isDisplayed()) { 66 return eles.get(2); 67 } 68 return null; 69 } 70 }); 71 System.out.println(text3.getText().toString()); 72 73 74 75 76 //取出登录成功的提示字样 77 WebElement text4=(new WebDriverWait(driver, 10)).until(new ExpectedCondition<WebElement>(){ 78 public org.openqa.selenium.WebElement apply(WebDriver driver){ 79 List<org.openqa.selenium.WebElement> eles = driver.findElements(By.className("ant-notification-notice-description")); 80 if(eles.size()==3 && eles.get(2).isDisplayed()) { 81 return eles.get(2); 82 } 83 return null; 84 } 85 }); 86 System.out.println(text4.getText().toString()); 87 88 File screenshotFile3=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 89 FileUtils.copyFile(screenshotFile3, new File("E:\\screenshot\\LS"+System.currentTimeMillis()+".png")); 90 91 Thread.sleep(10000); 92 93 94 95 driver.quit(); 96 97 } 98 99 }
问题根因
虽然脚本中定义了指定Firefox profile
1 public static void main(String[] args) throws InterruptedException, IOException { 2 System.setProperty("webdriver.gecko.driver", "D:\\geckodriver-v0.19.1-win64\\geckodriver.exe"); 3 ProfilesIni pi = new ProfilesIni(); 4 FirefoxProfile profile = pi.getProfile("defaultqhj"); 5 FirefoxOptions options = new FirefoxOptions(); 6 options.setProfile(profile); 7 WebDriver driver = new FirefoxDriver(options);
但是在运行过程中selenium 在temp文件夹中复制了一个profile文件,并且运行完毕后这里的信息并没有同步回指定的Firefox profile.
文字:
1514969522065mozrunner::runnerINFORunning command: "C:\\Program Files\\Mozilla Firefox\\firefox.exe" "-marionette" "-profile" "C:\\Users\\qianhj\\AppData\\Local\\Temp\\rust_mozprofile.CpsWZbn1Io5z"