最近使用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"
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4547/viewspace-3170692/ ,如需转载,请注明出处,否则将追究法律责任。