如何使用 Selenium 绕过 JWT 身份验证?

时间:2021-06-02 11:32:14

标签: spring-boot vue.js jwt selenium-chromedriver integration-testing

所以我正在尝试使用我的 Vue.js 作为前端对我的 Spring Boot Rest API 进行集成测试。当我想从需要 JWT 身份验证的页面中测试某些内容时,会出现问题,但我似乎无法进入该页面。对于单元测试,我可以使用

@WithMockUser

注解,它绕过身份验证的需要,进入需要身份验证的页面。

我对此很陌生。这是我到目前为止所得到的:

package com.example.SeleniumTesting;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import java.util.concurrent.TimeUnit;

public class FirstMainPageTest {
    WebDriver driver = new ChromeDriver();
    WebDriver driver2 = new ChromeDriver();
    WebDriver driver3 = new ChromeDriver();

    @BeforeTest
    public void setUp(){
        System.setProperty("webdriver.chrome.driver", ".\\chromedriver.exe");

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        driver.manage().window().maximize();
        driver.get("http://localhost:8081");


        System.setProperty("webdriver.chrome.driver", ".\\chromedriver.exe");

        driver2.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        driver2.manage().window().maximize();
        driver2.get("http://localhost:8081/parties");

        System.setProperty("webdriver.chrome.driver", ".\\chromedriver.exe");

        driver3.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        driver3.manage().window().maximize();
        driver3.get("http://localhost:8081/parties");
    }

    @Test
    public void loadHomePageTitle(){
        WebElement element = driver.findElement(By.cssSelector("h1"));
        element.isDisplayed();
    }


    @Test
    public void loadTheUnauthorizedPage(){
        WebElement element = driver2.findElement(By.cssSelector("h1"));
        element.isDisplayed();
        element.getText();
    }
    @AfterTest
    public void doThis(){
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.quit();
    }
}

我也试过在这里使用@WithMockUser,但这不起作用。任何人都可以帮助我解决此问题或为我指明正确的方向(带有指向显示类似问题的网站的链接?

提前致谢!

2 个答案:

答案 0 :(得分:2)

Selenium 测试是黑盒测试模式的一部分,因此它们的目的是从外部测试系统,而不必跳过普通用户会做的任何事情。所以我更喜欢自动化应用程序的登录部分。登录功能是您编写一次并用于所有测试的功能(例如 Junit @Before)。

答案 1 :(得分:0)

身份验证机制旨在防止任何未经身份验证的用户。如果您不进行身份验证,这也会阻止 Selenium 访问。这是意料之中的,真的不应该有任何解决方法或方法可以绕过。

如上一个答案所述,您应该执行普通用户会执行的所有登录步骤。您可能可以在测试之间重用登录状态,如果假设真实用户也会这样做,则可以使用该状态。但是,重新登录会给您带来更好的测试结果和信心。