上下文:Microsoft Azure VM; VS2015社区; C#; Selenium.WebDriver.2.52.0; Firefox 44.0.2;控制台(即不在IIS下运行)
如何使用Selenium在Firefox下维护状态。以编程方式我转到一个页面,输入登录详细信息,并遍历到第二个域。然后我关闭浏览器,重新打开并尝试转到第二个域上的链接。我最后再次登录页面请求登录详细信息。
当以交互方式执行此操作时,浏览器会记住我在第一页上登录并自动将我传输到第二个域的页面。
我在webserver
中设置了C:\Users\Bruce\AppData\Roaming\Mozilla\Firefox\profiles.ini
个人资料
[General]
StartWithLastProfile=1
[Profile0]
Name=default
IsRelative=1
Path=Profiles/eracklz4.default
[Profile1]
Name=webserver
IsRelative=1
Path=Profiles/webserver.default
Default=1
所以有人会认为,即使我没有明确声明我想使用webserver
个人资料,但是,它会选择该个人资料并使用它。以防我继续明确陈述
var seleniumProxy = new Proxy();
seleniumProxy.HttpProxy = "localhost:" + port; // port provided by BrowserMob Proxy
...
FirefoxBinary fb = new FirefoxBinary(@" C:\Program Files (x86)\Mozilla Firefox\firefox.exe");
FirefoxProfileManager fpm = new FirefoxProfileManager();
FirefoxProfile fp = fpm.GetProfile("webserver");
fp.DeleteAfterUse = false;
fp.SetProxyPreferences(seleniumProxy);
IWebDriver wd = null;
try
{
wd = new FirefoxDriver(fb, fp);
}
catch (Exception exc)
{
System.Diagnostics.Debug.Print(exc.Message);
}
IJavaScriptExecutor js = wd as IJavaScriptExecutor;
ExistingProfiles
列表FirefoxProfileManager
中的 webserver
,因此fpm
var不为空。
此时,我非常确信会话的数据会被保留,因为当我在调试器中查看fpm
时,Non-Public members
- > profiles
- > [1]
- > Value
为"C:\\Users\\Bruce\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles/webserver.default"
。
使用fpm
方法将个人资料数据从fp
转移到.GetProfile
后,ProfileDirectory
的{{1}}属性读为fp
,null
- > Non-Public members
也是profileDir
和null
- > Non-Public members
为sourceProfileDir
因此,根据权利,人们应该希望将密码保留到"C:\\Users\\Bruce\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles/webserver.default"
个人资料中,尤其是当人们通过定期调用webserver
将数据明确保存到个人资料时。
然而!我上次运行代码时,fp.WriteToDisk();
anonymous.359f853715d5418c87c7393c629dcb1a.webdriver-profile
当然,C:\Users\Bruce\AppData\Local\Temp
个人资料中似乎有一些活动。但是,登录页面的密码未保留。
这里发生了什么?会话数据是否可以在Selenium + Firefox中保留,或者某个地方有设计决策,无论您如何指定它,都不会保存任何状态?我想做一些本质上被禁止的事情吗?
下一天
从2014年开始阅读StackOverflow posting讨论类似问题后,添加了以下代码。但是,我仍然看到Roaming
中创建了临时个人资料。并且未对AppData\Local\Temp
个人资料进行任何更改。问题不已解决。
小一点
我目前正在尝试使用Google Chrome而不是Firefox,即
Roaming
我不太相信这会产生很大的不同。值得注意的是,我无法弄清楚如何设置或获取在Temp中创建的配置文件文件夹的名称。上面的代码创建了一个 ChromeOptions co = new ChromeOptions();
string tfn = @"C:\Temp";
co.AddArgument("user-data-dir=" + tfn);
co.Proxy = seleniumProxy;
IWebDriver wd = new ChromeDriver(co);
文件夹,但在VS2015C的属性视图中没有提到它。
最后
惊讶,惊讶,实际上有效。再见Firefox。你好谷歌Chrome。似乎存储了足够的会话数据,以便遍历第二个站点。可能会将目录从Temp更改为特定于客户端。感谢ActiveState Python的民众。