Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
登录后保持会话-selenium-javascript_Javascript_Selenium_Promise_Automation_Webdriver - Fatal编程技术网

登录后保持会话-selenium-javascript

登录后保持会话-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

我正在尝试使用SeleniumWeb驱动程序和NodeJS自动化两个页面。我可以登录,但登录后我想使用由web驱动程序启动的相同会话,这样我就可以在受会话保护的页面上进行自动测试。这是我的尝试

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请随时添加到您的问题与其他细节,我会尽力帮助您得到完全解决。