登录后保持会话-selenium-javascript
我正在尝试使用SeleniumWeb驱动程序和NodeJS自动化两个页面。我可以登录,但登录后我想使用由web驱动程序启动的相同会话,这样我就可以在受会话保护的页面上进行自动测试。这是我的尝试登录后保持会话-selenium-javascript,javascript,selenium,promise,automation,webdriver,Javascript,Selenium,Promise,Automation,Webdriver,我正在尝试使用SeleniumWeb驱动程序和NodeJS自动化两个页面。我可以登录,但登录后我想使用由web驱动程序启动的相同会话,这样我就可以在受会话保护的页面上进行自动测试。这是我的尝试 async function login(){ Let d = await new Builder() .forBrowser('chrome') .build(); await d.get
async function login(){
Let d = await new Builder()
.forBrowser('chrome')
.build();
await d.get('https://demo.textdomain.com/')
await d.findElement(By.id('username')).sendKeys('admin ')
await d.findElement(By.id('password')).sendKeys('admin');
await d.findElement(By.css('button[type="submit"]')).click();
d.getPageSource().then(function(content) {
if(content.indexOf('Welcome text') !==-1 ) {
console.log('Test passed');
console.log('landing page');
d.get('https://demo.textdomain.com/landingpage') //this is still going to login page as i cannot use the previous session
} else {
console.log('Test failed');
return false;
}
//driver.quit();
});
}
login();
我是否在登录后意外丢弃了浏览器。在上的类似问题中,您可以存储和还原当前会话的cookie: 使用Javascript:
// Storing cookies:
driver.manage().getCookies().then(function (cookies) {
allCookies = cookies;
});
// Restoring cookies:
for (var key in allCookies) {
driver.manage().addCookie(key, allCookies[key]);
}
我相信你的问题是没有正确地等待登录完成 Selenium不会等待异步操作完成,它会移动到下一行,因此当您请求页面源时,很有可能登录操作没有在服务器上完成,并且结果不是您期望的结果 您必须显式地告诉Selenium等待,因此您需要在登录和检查用户是否登录的代码之间添加一些代码,出于此假设,添加10秒超时 如果这对您有效,您就不想浪费时间,因此您需要等待页面上的某些元素因登录而更改,例如,您需要等待页眉中用户照片的存在(或可见性,如果它已经在DOM中) 另外,我不确定“getPageSource”函数的行为,它可以使用现有页面,也可以请求新的副本
我建议您使用其他方法通过检查DOM来测试用户是否登录。我建议在其他web驱动程序实例中首次登录后重新使用会话cookie 首先存储cookie:
var cookieValue = firstWebDriver.Manage().Cookies.GetCookieNamed(name:"cookie_name");
然后,您可以将其传递到任何WebDriver实例,将其设置并驱动web应用程序,因为它将是具有不同浏览器实例的同一用户:
anotherWebDriver.Manage().Cookies.AddCookie(new Cookie(name:"cookie_name", value:cookieValue));
如果要使用相同的浏览器实例,则必须对它们进行同步,因为WebDriver调用通常不是线程安全的,并且可能会导致异常(例如,由于元素已更改或未找到而过时,因为一个web驱动程序已导航到不同的页面)
然后我建议对下一个实例使用窗口句柄,而不必关心会话。第一个打开,最后一个关闭会话(计算引用的句柄),并确保一次只有一个驱动程序使用此句柄。您还可以创建新的浏览器窗口,这将保留会话并为您提供新的句柄:
var handle = firstWebDriver.CurrentWindowHandle;
otherWebDriver.SwitchTo().Window(handle);
我用C语言编写了代码,但是应该可以很容易地适应JavaScript。您可能只是在处理时间问题。硒的移动非常快。比您作为用户进行交互的速度快得多。因此,它的行为方式常常看起来不可预测。但这只是因为硒的作用比用户快得多。为了解决这个问题,您应该充分利用Selenium内置的
驱动程序。例如:
const button = driver.wait(
until.elementLocated(By.id('my-button')),
20000
);
button.click();
上面的操作将等待,直到id为my button
的按钮出现在DOM中,然后单击它。它将等待最长20000毫秒,但将在按钮可用时立即完成
因此,在您的情况下,如果在用户成功登录后有可用的内容,您可以在进入代码中的新页面之前等待该元素
另一方面,我也不太清楚为什么要使用getPageSource()
?这似乎是一个非常严厉的方式来获得你想要的。这些内容不是在一个可以获取其内容的元素中吗
我写了一篇文章,可能会帮助您更详细地理解文章中的上述代码示例,以及其他可用于在浏览器中可靠等待各种条件的技术。我的问题仍然没有解决,但当我遵循您的solution@sumit请随时添加到您的问题与其他细节,我会尽力帮助您得到完全解决。