Repository: oppia/oppia

Issue:
Acceptance Testing - covering all user journeys in form of user stories
### Describe the bug

In order to verify that key user journeys do not break, the Oppia development team is implementing Acceptance Testing for the develop branch. This means that, on every commit, all key requirements are verified through a set of acceptance tests that check that each type of end user can do the things they expect to do on the site. 

The aim of this issue is to build up a set of such tests. Please see the instructions below for how to claim a task in this issue. (Feel free to contact @oppia/acceptance-test-reviewers  if you have any doubts!)

### **# Instructions**

1. Carefully read the “How to write [Acceptance Tests](https://github.com/oppia/oppia/wiki/Acceptance-Tests)” wiki page.
2. Select 1 or more “package” (of 1-2 user stories each) from the list below, and get yourself assigned to them from @oppia/acceptance-test-reviewers 
3. After the user stories are assigned to you, go to the user file for the tests inside `core/tests/puppeteer-acceptance-tests/spec/<user-type>tests.spec.js`
4. Start writing the assigned user stories based on the [Testing Spreadsheet](https://docs.google.com/spreadsheets/d/1O8EHiSAGrG0yoNUBz9E4DIwKNS8Rfsv_ffC4k1WK5jc/edit?usp=sharing). Each user story in the spreadsheet should be covered within 1 `it` block, and all the test steps and expectations should match the expected behavior. You might also need to write utility functions, similar to the existing examples below.
5. After you have written the tests, make sure they run fine on your local machine before submitting your PR. If this is your first time writing acceptance tests, we suggest writing the tests for one user story and verifying that it runs fine before adding the rest of the tests to your PR.
6. In case of any confusion or for PR reviews, feel free to ask @oppia/acceptance-test-reviewers 
7. After getting assigned to a package(containing 2-3 user stories), your inactivity/no communication for more than 7 days  may lead to getting unassigned from the task assigned. 

For reference: You can see an example set of acceptance tests for “blog admin”/”blog editor” [here](https://github.com/oppia/oppia/pull/16394). Please follow a similar format and file naming convention for the tests that you write:
- Top-level tests: 
   - core/tests/puppeteer-acceptance-tests/spec/blog-admin-tests/
   - core/tests/puppeteer-acceptance-tests/spec/blog-editor-tests/
- User-utilities: core/tests/puppeteer-acceptance-tests/userutilities/blog-post-admin-utils.js
- User factory: core/tests/puppeteer-acceptance-tests/spec/blog-admin-tests.spec.js

### **List of user stories (arranged by user type)**
(serial numbers same as testing spreadsheet row number for each user type)


Exploration Creator
- [ ] 3- Users can record voiceovers in different languages, upload voiceovers for their question explorations in different languages, and monitor progress…………. 
4- Users can create questions from the exploration, add questions from the exploration

- [x] 5- Users can see history in the exploration editor, can check the latest version with notes, user, and date, and compare any two versions from ………… -- @Akhilesh-max  (PR: https://github.com/oppia/oppia/pull/19828)
6- User can preview the exploration, and can start the questions from the beginning -- @Akhilesh-max 

- [ ] 7- User can navigate to the Feedback Tab: The user can access the Feedback Tab in the Exploration Editor and view all the feedback ………….
8- User can ask for "Help" for the editor's exploration, take a tour of the editor's exploration, visit the help centerTake the translator tour

- [x] 9- User can do the Basic setting: Title, Goal, Add a category, Language, Name of the first card, Tags, Advance features, Roles, Voice artist, Permissions …….. -- @rahat2134  (PR: https://github.com/oppia/oppia/pull/19780)
10- User can Publish the latest changes, User can draft the latest changes -- @rahat2134 

- [ ] 11- User can use all the interactions.

- [ ] 13- User can use all RTE components.

- [ ] 12- User can publish an exploration with an interaction.
14- User can view and make changes to a previously-published exploration
15- User can see statistics about number of views, ratings, etc. in the creator dashboard

Contributor Dashboard
- [ ] Translation submitter
**Tracking bug: https://github.com/oppia/oppia/issues/18892**
1.1 User can select a topic and a language, and then successfully submit a translation for that lesson card in that language.
Translation Reviewer
2.1 User can view the translated lessons in a topic, review the cards in the lesson and accept the translation in each card

- [x] Translation Admins
**Tracking bug: https://github.com/oppia/oppia/issues/18893**
3.1 Admin should be able to provide Translation rights in a language to a user
3.2 Admin should be able to remove translation rights in a language to a user
**assigned to @agallop** 

- [ ] Practice Question Submitter
**Tracking bug: https://github.com/oppia/oppia/issues/18894**
4.1 Users can suggest questions by selecting the difficulty level of a lesson in a Topic
4.2 Users can suggest questions by selecting difficulty level as Hard to a lesson in a Topic

- [ ] Practice Question Reviewer
**Tracking bug: https://github.com/oppia/oppia/issues/18896**
5.1 Users can review a question on a topic and Accept it
5.2 Users can review a question in a topic and Reject it

- [ ] Practice Question Admins
**Tracking bug: https://github.com/oppia/oppia/issues/18897**
6.1 Admin can provide Contribution Rights to submit and review Questions
6.2 Admin should be able to remove Review and Submit Question permissions to a user

Logged-in Learner  @AFZL210 
- [ ] 3- User can add an exploration to 'play later' from the /community-library page, remove that exploration from 'play later' from the /learner-dashboard page………. 
- [x] 4- User can subscribe to a creator and should be able to view all explorations authored by that creator. (PR: https://github.com/oppia/oppia/pull/20195)

- [ ] 5- User can check current progress from the lesson info modal, can return to the most recent checkpoint visited, and resume the exploration after the previously visited checkpoint
6- User can change his profile, export account (upload thumbnail image, add a bio, add subject interest , add site language add audio language) ……………


Anonymous Learner
- [ ] 3- Users can play an exploration as an anonymous user, search for exploration on the community library and play it
4- Users can leave feedback on an exploration (particular state), eave feedback on an exploration (whole exploration)

Logged-in user (browsing static pages) 
- [x] 3- Users can open the About, The Oppia Foundation and Blog pages, Schools and Organizations, Volunteer, Donate, Contact us and Donate in the Nav bar -- @imchristie 
11- Users can open About, The Oppia Foundation, Blog, Forum, Get Started, Creator Guidelines, For Parents/teachers, Browse the Library, Contact Us,......... -- @agallop 


Topic Manager
- [ ] 3- As a topic manager user should be able to filter topics and skills, can merge skills, assign, unassign skills, and delete topic/skill
4- As a topic manager user should be able to create questions using image interaction and modify images


- [x] Voiceover Artist
3- Voiceover artist can add audio recordings to any exploration
Voiceover Admin @hrshkshri ( PR: #19994 )
5- Voiceover admin can add voiceover artists to an exploration

- [x]  Curriculum Admin @Vir-8 ( PR: #19914 )
1- As a curriculum admin, the user should be able to create a Topic, sub-topic, skill, story, chapter and publish it

- [ ]  Curriculum Admin @pritam2317 
2- As a curriculum admin user should be able to create a Classroom, add topics to it 

- [ ] #19781
3- As a learner I should be able to play an embedded lesson



Discussion:
Hi @Shivkant-Chauhan, thanks for proposing this as a good first issue. I am removing the label for now and looping in @DubeySandeep to approve the label. It will be added back if approved. Thanks!
Hi @Shivkant-Chauhan, thanks for proposing this as a good first issue. I am removing the label for now and looping in @DubeySandeep to approve the label. It will be added back if approved. Thanks!
Hi @ashish-patwal and @Shivkant-Chauhan can I get 7 and 8 of exploration creator assigned to me? thank you! since it's my first time writing such acceptance testing, i might need some time or guidance on this aspect. 
1. As a pre-requisite, does my browser need to redirect to the /creator-dashboard route? 
2. If there are bugs encountered in the code that is to be tested, do I flag or fix the developed code bugs?
3. Also, having done some user testing, can I suggest some UX changes? One example is the placing of the icons that may be unintuitive
Thank you!
> Hi @ashish-patwal and @Shivkant-Chauhan can I get 7 and 8 of exploration creator assigned to me? thank you! since it's my first time writing such acceptance testing, i might need some time or guidance on this aspect.
> 
> 1. As a pre-requisite, does my browser need to redirect to the /creator-dashboard route?
> 2. If there are bugs encountered in the code that is to be tested, do I flag or fix the developed code bugs?
> 3. Also, having done some user testing, can I suggest some UX changes? One example is the placing of the icons that may be unintuitive
>    Thank you!

Hey @caramelmelmel, assigned you to the 7,8 user stories of exploration creator and thanks for showing your interest in the Acceptance tests. I and @ashish-patwal will be there for you for clearing your blockers and helping you out when stuck. But get a fair idea by reading the wiki pages for Acceptance tests and go through the reference PR #16394 (links are shared within the issue desc.).

1 --> yes, you need to have the local server setup on your system and you must be accessible to the /creator-dashboard page. also, you need to have a proper idea of all the components present on the page and what must be the expected behavior of the components (if there is a bug anywhere).
2 --> if you are able to fix the bug within the PR itself, that would be very appreciable. otherwise, you need to open an issue for the bug you encountered with proper desc.
3 --> it depends if your idea seems good to the product reviewers, then we can implement your suggested changes.
Hello @ashish-patwal and @Shivkant-Chauhan, it's my first time contributing to an open source software and  I would like to get assigned to (5,6) Exploration Creator or/and Anonymous Learner(3,4)?
> Hello @ashish-patwal and @Shivkant-Chauhan, it's my first time contributing to an open source software and I would like to get assigned to (5,6) Exploration Creator or/and Anonymous Learner(3,4)?

hey @marcella-stefan , since you are new to the codebase, so I am assigning you only 1 package from Exploration Creator. Please ask here in case of any blocker/confusion.

@caramelmelmel please share the updates on the package you are assigned.
Hi @Shivkant-Chauhan and @ashish-patwal, this is my first time contributing to an open source project as well, would I be able to get assigned to Logged-in user browsing static pages (3, 11)?
> Hi @Shivkant-Chauhan and @ashish-patwal, this is my first time contributing to an open source project as well, would I be able to get assigned to Logged-in user browsing static pages (3, 11)?

sure @SahilB1 ! assigning you to the requested package.
@Shivkant-Chauhan Thank you! Will the [acceptance tests](https://github.com/oppia/oppia/wiki/Acceptance-Tests) wiki page have the information needed to get started on understanding how to go about writing these tests?
@Shivkant-Chauhan @ashish-patwal I tried to run the acceptance tests as they are using the command `python -m scripts.run_acceptance_tests` from my root directory of oppia, but I'm getting a `No module named scripts.run_acceptance_test` error when I try to run the command.

Additionally, running `jasmine --config="core/tests/puppeteer-acceptance-tests/jasmine.json" core/tests/puppeteer-acceptance-tests/spec/blog-editor-tests/check-blog-editor-unable-to-publish-duplicate-blog-post.spec.js` as the example test in the [acceptance test page](https://github.com/oppia/oppia/wiki/Acceptance-Tests) yields the response 

`Running suite with 0 specs. No specs found Finished in 0.002 seconds Incomplete: No specs found`

Looking into the actual `scripts` directory in my cloned repo, it looks like `run_acceptance_test.py` does not exist in this directory. Could it have moved elsewhere or have been renamed?
> @Shivkant-Chauhan @ashish-patwal I tried to run the acceptance tests as they are using the command `python -m scripts.run_acceptance_tests` from my root directory of oppia, but I'm getting a `No module named scripts.run_acceptance_test` error when I try to run the command.
> 
> Additionally, running `jasmine --config="core/tests/puppeteer-acceptance-tests/jasmine.json" core/tests/puppeteer-acceptance-tests/spec/blog-editor-tests/check-blog-editor-unable-to-publish-duplicate-blog-post.spec.js` as the example test in the [acceptance test page](https://github.com/oppia/oppia/wiki/Acceptance-Tests) yields the response
> 
> `Running suite with 0 specs. No specs found Finished in 0.002 seconds Incomplete: No specs found`
> 
> Looking into the actual `scripts` directory in my cloned repo, it looks like `run_acceptance_test.py` does not exist in this directory. Could it have moved elsewhere or have been renamed?

we are still having a PR opened on that (#17364 ) that will fix both the things you asked for.
for now, run tests with: `jasmine --config=core/tests/puppeteer-acceptance-tests/jasmine.json --filter="Blog Editor"`
As soon as the above PR is merged, all the things will be running smoothly as stated in the wiki pages. 
@Shivkant-Chauhan sounds good, thank you!
Thanks for the response! I'm also experiencing the same issue! In the meantime, could we copy the PR that fixes #17364 to run the acceptance tests?

@caramelmelmel @SahilB1 until the PR #17364 is not merged, please run the test using: `jasmine --config=core/tests/puppeteer-acceptance-tests/jasmine.json --filter="Blog Admin"` command in your root /oppia directory
sure! thank you so much! right now, I'm asking for signed in users wise, must I mock the sign in phase?
@Shivkant-Chauhan  Thank you! Would you happen to have an idea or estimate as to when PR #17364 might be merged? No worries if not, just curious.
@SahilB1  We are making it asap. but it might not be a blocker for you!.. you can start writing tests by referring to the wiki and the already written tests. also just to run your test, use `jasmine --config=core/tests/puppeteer-acceptance-tests/jasmine.json --filter="{{your suite name}}"`
@Shivkant-Chauhan Perfect, I'll be sure to do so. Thanks!
Hi @Shivkant-Chauhan and @ashish-patwal, can I get the Practice Question Reviewer (5.1 and 5.2) of Contributor Dashboard assigned to me? I'm a college student and looking to contribute to an open source project as part of a class I'm taking right now. Thank you!
Hi @Shivkant-Chauhan and @ashish-patwal, Could I possibly be assigned to Practice Question Admin 6.1 and 6.2? I'm also a college student and a first time contributor to an open source project. Thank you!
@jjxiong23 @noramark done!
Hello @Shivkant-Chauhan and @ashish-patwal, I'm wondering if I can be assigned to Logged-in learner (3,4)? I'm a first time contributor to an open source project and I'm taking a class in my college that asks me to contribute to an open source project. Thank you!
Hi @Shivkant-Chauhan and @ashish-patwal, I'm a cs student and have a open source project as a class final project. can I get the Practice Question submitter (4.1 and 4.2) of Contributor Dashboard assigned to me?
@maxliu2001 @SACHARYAS done!
Hi @ashish-patwal and @Shivkant-Chauhan can I get 5 and 6 of logged in learned assigned to me? thank you! 
Hi, @ashish-patwal and @Shivkant-Chauhan can I get 4 or 9 of Exploration Creator assigned to me? Thank you!
Hi @ashish-patwal and @Shivkant-Chauhan, just following up to see if we can get these tasks assigned to us, thanks!

> Hi, @ashish-patwal and @Shivkant-Chauhan can I get 4 or 9 of Exploration Creator assigned to me? Thank you!


HI @ashish-patwal  and @Shivkant-Chauhan . I am new to the codebase and intereseted in contributing to the project. Can I get some of the user stories assigned to me? Thanks a lot!
@katehrkim @michbyiri @suraj-mandal I have assigned each of you with a package. PTAL!
@SahilB1 @caramelmelmel @noramark @jjxiong23 can you please update me with the user stories you are working on.
Hi @Shivkant-Chauhan currently working on the practice question admin story - ensuring the admin can provide a user with contribution rights (being able to review and submit a question) - For updates generally, is there specific information I should be providing or updating with? 
Hi @Shivkant-Chauhan, I'm also currently working on writing the acceptance tests for practice question reviewers. Starting with the first user story (accepting a question on a topic), and then will move on to the second user story (rejecting a question on a topic). Seconding @noramark, how should we keep you updated as we work on these tests?
Hi @Shivkant-Chauhan, I'm currently working on writing the acceptance tests for logged-in users navigating to static pages via the navbar and footer sitemap to ensure that the users are navigating to the correct pages when clicking on the links to these static pages. 
Hi! @Shivkant-Chauhan, I was trying to run the acceptance test using the command 
```
python -m scripts.run_acceptance_tests
```
However, I am getting the given error:
```
/home/suraj-mandal/Desktop/suraj-work/OSPs/oppia/.direnv/python-3.8.15/bin/python: No module named scripts.run_acceptance_tests
```
When I checked the`scripts` directory I found that there is no such script with the given name. I have installed and configured Oppia as per the instructions presented in the installation page.

Can you help me figure out how exactly the acceptance tests can be run?

**My OS is Ubuntu 22.04.**
Here, I tried running the server first at localhost:8181. Then I am executing the jasmine script. But getting the error.

Since I am new to tests, I need to know if I am proceeding correctly or not.

Getting this error:
![image](https://user-images.githubusercontent.com/23192674/229694408-25a8e0b5-3bbc-4d18-b0f7-70a9a53a863e.png)

Here is the full stack trace
![image](https://user-images.githubusercontent.com/23192674/229694482-b1810b72-cb72-4dbf-b149-eb3ea0fb9098.png)

Can someone help me with configuring Jasmine for e2e testing... I have been trying since yesterday, unable to make any progress 
Hi, @ashish-patwal and @Shivkant-Chauhan, we finished writing the acceptance test for exploration creator 4, and we are just wondering where do we submit our code for review? Or do we just push it to the repo?
> Hi, @ashish-patwal and @Shivkant-Chauhan, we finished writing the acceptance test for exploration creator 4, and we are just wondering where do we submit our code for review? Or do we just push it to the repo?

you need to open a PR for the same! also please try to check that your tests are running fine in your local machine
> Can someone help me with configuring Jasmine for e2e testing... I have been trying since yesterday, unable to make any progress

Hi, would it be fine for you to ping me on the Google Chat? --shivkantchauhan2002@gmail.com
Resolved, missed something while rereading
Hi @ashish-patwal and @Shivkant-Chauhan, To use the type function do we find the CSS selector of the input field by inspecting elements on the website or is there another way?
Hi, @Shivkant-Chauhan pinged you
Hello @Shivkant-Chauhan. I am a first-time contributor and would like to tackle the Translation admins user journeys (3.1, 3.2). Would you mind assigning me?

Thank you
Hi @ashish-patwal and @Shivkant-Chauhan, following up on my question from 2 weeks ago. I'm almost done but need this clarified before I can pull request
> Hi @ashish-patwal and @Shivkant-Chauhan, To use the type function do we find the CSS selector of the input field by inspecting elements on the website or is there another way?

> Hi @ashish-patwal and @Shivkant-Chauhan, To use the type function do we find the CSS selector of the input field by inspecting elements on the website or is there another way?

Yes, you need to have the CSS selector for that field. Please go through the already written tests of Blog Admin and  Blog Editor, you will get a fair idea of how to proceed
> Hello @Shivkant-Chauhan. I am a first-time contributor and would like to tackle the Translation admins user journeys (3.1, 3.2). Would you mind assigning me?
> 
> Thank you

done..
Hello everyone, 
I would like to inform that the PR for the acceptance tests workflow and the script for executing the acceptance tests has been submitted to the develop branch. From now on, it is possible to run acceptance tests for any suite by using the command python -m script.run_acceptance_tests --suite="{{suiteName}}". It is important to ensure that your branches are updated with the latest changes from the develop branch.


(tagging all for notifying)
@maxliu2001 @SACHARYAS @noramark @agallop @suraj-mandal @michbyiri @SahilB1 @jjxiong23 @aashanp01 @katehrkim @caramelmelmel @marcella-stefan 
Thanks a lot.. it will be easier now
thanks! will note this! pulling branch now!

@maxliu2001 @SACHARYAS @noramark @agallop @suraj-mandal @michbyiri @SahilB1 @jjxiong23 @aashanp01 @katehrkim @caramelmelmel @marcella-stefan

please give updates about the packages you were assigned. thanks!
@Shivkant-Chauhan I'm making progress on the translation admin tests
I was running into some trouble using one of the select elements for the [Contributor dashboard admin page](https://github.com/oppia/oppia/blob/develop/core/templates/pages/contributor-dashboard-admin-page/contributor-dashboard-admin-page.component.html), but I see it is because there are two of these elements with the same id.

```
<select id="label-target-form-review-category-select"
    class="form-control e2e-test-form-contribution-rights-category-select"
    ng-options="roleString as roleName for (roleName, roleString) in $ctrl.CONTRIBUTION_RIGHT_CATEGORIES"
    ng-model="$ctrl.formData.viewContributionReviewers.category"
    ng-change="$ctrl.clearResults()">
</select>
```

```
<select id="label-target-form-review-category-select"
    class="form-control e2e-test-form-contribution-rights-category-select"
    ng-options="value as key for (key, value) in $ctrl.CONTRIBUTION_RIGHT_CATEGORIES"
    ng-model="$ctrl.formData.addContributionReviewer.category">
</select>
```

These ids should probably be different. is it okay to make a PR to change the second one to
```
<select id="label-target-form-add-category-select"
   ...
</select>
```

Thanks!
Hi @Shivkant-Chauhan , i was away on a trip.. am back by tomorrow.. will be progressing then
Hi was away will be progressing later today or early tomorrow 
> @Shivkant-Chauhan I'm making progress on the translation admin tests I was running into some trouble using one of the select elements for the [Contributor dashboard admin page](https://github.com/oppia/oppia/blob/develop/core/templates/pages/contributor-dashboard-admin-page/contributor-dashboard-admin-page.component.html), but I see it is because there are two of these elements with the same id.
> 
> ```
> <select id="label-target-form-review-category-select"
>     class="form-control e2e-test-form-contribution-rights-category-select"
>     ng-options="roleString as roleName for (roleName, roleString) in $ctrl.CONTRIBUTION_RIGHT_CATEGORIES"
>     ng-model="$ctrl.formData.viewContributionReviewers.category"
>     ng-change="$ctrl.clearResults()">
> </select>
> ```
> 
> ```
> <select id="label-target-form-review-category-select"
>     class="form-control e2e-test-form-contribution-rights-category-select"
>     ng-options="value as key for (key, value) in $ctrl.CONTRIBUTION_RIGHT_CATEGORIES"
>     ng-model="$ctrl.formData.addContributionReviewer.category">
> </select>
> ```
> 
> These ids should probably be different. is it okay to make a PR to change the second one to
> 
> ```
> <select id="label-target-form-add-category-select"
>    ...
> </select>
> ```
> 
> Thanks!

you can fix this by changing the elements' ID in your PR itself. this will unblock you and will correct the behavior for the tests
@maxliu2001 @SACHARYAS @noramark @agallop @suraj-mandal @michbyiri @SahilB1 @jjxiong23 @aashanp01 @katehrkim @caramelmelmel @marcella-stefan
can you all please give the updates to get to know about the current progress on the assigned task. please note, I am thinking to un-assign the inactive folks from their assigned packages so that the new contributors coming up would have more choices to select their desired packages to work.
Hi @Shivkant-Chauhan i have done the setup for the first part of the anonymous learner.. like creation of the explanation etc.Now need to do the assertions based on the test cases provided 
@Shivkant-Chauhan apologies for the late response! i will be out of town for a while and won't have the ability to work on my assigned package anymore, so please go ahead and unassign me so that other contributors can claim the package if they'd like. sorry for the inconvenience!
im doing the assertions on the test case objects and facing some difficulties now
meeting this error as a prerequisite from the user perspective here @Shivkant-Chauhan 
Filed an issue here regarding the fact that I am unable to create a exploration as a lesson creator
https://github.com/oppia/oppia/issues/18275
hi so I'm fixing a few errors that the user is experiencing but is not clear to the user:
1. Bad requests
    - User is trying to publish lesson with directed cases of users being stuck and therefore unable to proceed. This gives a 400 simply because the user is unable to retract the accidental mistake of labelling the option correct and places the stuck option at the same time.
    - state transitions are correct but errors and displays are not very obvious to the user.
    
 2. When creating lesson, there seems to be an error of not removing the test account so the tutorial does not show up again
 3. one of the text boxes does not have a very obvious validation for a minimum number of characters to be fulfilled before publishing the lesson.
replied on Google sheet too!
Quick update from me.

I finished writing the tests, I just need to clean up the style and comments, in addition to checking any references to ids I changed.

I'm currently traveling so it may take a few days to get the PR out.

Thanks
Since no one seems working on any of the user stories, and I don't see any active Pull Request, so I am unassigning everyone from the assigned user stories.
Give this week to me.. if not completed then unassign
@suraj-mandal no worries, can you please tell the user-story you are working on?
Have added my commits but forgot my PR oops

@caramelmelmel please let me know on which user-story you are working on. thanks!
Hi @shivkant5 I'm working on 7 and 8 let me reopen this
@shivkant5 done with 7 finishing 8
> @shivkant5 done with 7 finishing 8

Hi @caramelmelmel please open a PR for that and assign me on that PR. Thanks!!
Hi @shivkant5 I will open my PR after I take this week to clean up everything
@shivkant5 It looks like my previous [pull request for 3.1, 3.2](https://github.com/oppia/oppia/pull/18345) closed and I've been super busy. I can open another one. I did address your comments in the original PR, but I did need some help with this ask.

> main thing, do a bulk run (at least 20 runs for each test) of the tests on CI by modifying the GitHub Action workflows on your fork.

I think I requested a re-review before the PR closed itself, but maybe I needed to reassign it as well?
> Hi @shivkant5 I will open my PR after I take this week to clean up everything

sure @caramelmelmel. let me know, once you have a PR opened for the user stories. thanks!
> @shivkant5 It looks like my previous [pull request for 3.1, 3.2](https://github.com/oppia/oppia/pull/18345) closed and I've been super busy. I can open another one. I did address your comments in the original PR, but I did need some help with this ask.
> 
> > main thing, do a bulk run (at least 20 runs for each test) of the tests on CI by modifying the GitHub Action workflows on your fork.
> 
> I think I requested a re-review before the PR closed itself, but maybe I needed to reassign it as well?

it would be fine if you can re-open that previous PR itself, by that, it would be easy to track the requested changes.
for the bulk run, once all the reviews are done, I will do a bulk run on my another repo with your changes, and will inform you about the flakes that are occuring. you need to fix them also, so that after your tests are in into the develop, they must not be flaky
I don't think I am able to reopen the pull request. I think the button would be here if I could?

![image](https://github.com/oppia/oppia/assets/9313126/b06f56ec-dafc-44ea-96ab-83e569361b7e)

@agallop I reopened it! Thanks for flagging.
@Shivkant-Chauhan @ashish-patwal Can I please do 3.1 & 4.1 under Contributor Dashboard?
> 3.1 & 4.1

hey @StephenYu2018, we are assigning a whole package which contains 2 user stories. can you please take a look again and tell me which package you want to work.
@Shivkant-Chauhan I'll take package 4 (Practice Question Submitter) under contributor dashboard.
done @StephenYu2018 
@Shivkant-Chauhan For the practice question submitter acceptance tests, the instructions says to check for a listed opportunity labelled 'Test Topic, First Exploration'. According to this [snippet](https://github.com/oppia/oppia/blob/develop/core/templates/domain/opportunity/skill-opportunity.model.ts#L52C1-L58C4), the topic name is the heading of a skill opportunity (which is fine), but the subheading is the skill description. The exploration/chapter name is not displayed on the listed opportunity itself.

Where is 'First Exploration' supposed to be located on the listed skill opportunity?
Hi @StephenYu2018 -- I think you are right, this is inaccurate. I've given you edit access to the spreadsheet, could you please update the test expectations appropriately? Thanks for catching this!
@seanlip @Shivkant-Chauhan Should I also add setup steps to each test that initializes the newly created skill's rubrics, misconceptions, worked examples, etc (and the corresponding expectations to check that they show up during the question suggesting process)?
I think that would be great if possible, thanks! (As long as it doesn't significantly blow up the project's complexity.)
Since #18345 is approved, and hopefully will be merged soon, can I take a look at 6.1, 6.2?
@agallop Go for it :) Can you please leave a similar comment on https://github.com/oppia/oppia/issues/18897 so that we can properly assign you? GitHub doesn't show your name in the assignees list otherwise.

Thanks for helping out with this!
hello as part of hacktoberfest, I'll be making that PR after the code is refactored!

Resolving patch:
diff --git a/scripts/common.py b/scripts/common.py
--- a/scripts/common.py
+++ b/scripts/common.py
@@ -207,8 +207,13 @@
 
 ACCEPTANCE_TESTS_SUITE_NAMES = [
     'blog-admin-tests/assign-roles-to-users-and-change-tag-properties.spec.js',
-    'blog-editor-tests/check-blog-editor-unable-to-publish-' +
-    'duplicate-blog-post.spec.js',
+    'blog-editor-tests/try-to-publish-a-duplicate-blog-post-and-get-blocked' +
+    '.spec.js',
+    'logged-in-user-tests/click-all-buttons-on-navbar.spec.js',
+    'logged-in-user-tests/click-all-buttons-in-about-page.spec.js',
+    'logged-in-user-tests/click-all-buttons-in-about-foundation-page.spec.js',
+    'logged-in-user-tests/click-all-buttons-in-thanks-for-donating-page' +
+    '.spec.js',
     'practice-question-admin-tests/add-and-remove-contribution-rights.spec.js',
     'translation-admin-tests/add-translation-rights.spec.js',
     'translation-admin-tests/remove-translation-rights.spec.js'


Test patch:
diff --git a/.github/workflows/e2e_lighthouse_performance_acceptance_tests.yml b/.github/workflows/e2e_lighthouse_performance_acceptance_tests.yml
--- a/.github/workflows/e2e_lighthouse_performance_acceptance_tests.yml
+++ b/.github/workflows/e2e_lighthouse_performance_acceptance_tests.yml
@@ -311,7 +311,11 @@ jobs:
           os: [ubuntu-22.04]
           suite:
             - blog-admin-tests/assign-roles-to-users-and-change-tag-properties.spec.js
-            - blog-editor-tests/check-blog-editor-unable-to-publish-duplicate-blog-post.spec.js
+            - blog-editor-tests/try-to-publish-a-duplicate-blog-post-and-get-blocked.spec.js
+            - logged-in-user-tests/click-all-buttons-on-navbar.spec.js
+            - logged-in-user-tests/click-all-buttons-in-about-page.spec.js
+            - logged-in-user-tests/click-all-buttons-in-about-foundation-page.spec.js
+            - logged-in-user-tests/click-all-buttons-in-thanks-for-donating-page.spec.js
             - practice-question-admin-tests/add-and-remove-contribution-rights.spec.js
             - translation-admin-tests/add-translation-rights.spec.js
             - translation-admin-tests/remove-translation-rights.spec.js
diff --git a/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/puppeteer-utils.js b/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/puppeteer-utils.js
--- a/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/puppeteer-utils.js
+++ b/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/puppeteer-utils.js
@@ -72,7 +72,7 @@ module.exports = class baseUser {
    * @param {string} email - The email of the user.
    */
   async signInWithEmail(email) {
-    await this.goto(testConstants.URLs.home);
+    await this.goto(testConstants.URLs.Home);
     if (!this.userHasAcceptedCookies) {
       await this.clickOn('OK');
       this.userHasAcceptedCookies = true;
@@ -166,7 +166,7 @@ module.exports = class baseUser {
    * This function logs out the current user.
    */
   async logout() {
-    await this.goto(testConstants.URLs.logout);
+    await this.goto(testConstants.URLs.Logout);
     await this.page.waitForSelector(testConstants.Dashboard.MainDashboard);
   }
 
diff --git a/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/test-constants.js b/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/test-constants.js
--- a/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/test-constants.js
+++ b/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/test-constants.js
@@ -20,14 +20,30 @@ const path = require('path');
 
 let testConstants = {
   URLs: {
-    home: 'http://localhost:8181/',
-    BlogDashboard: 'http://localhost:8181/blog-dashboard',
+    About: 'http://localhost:8181/about',
+    AboutFoundation: 'http://localhost:8181/about-foundation',
+    AdminPage: 'http://localhost:8181/admin',
+    AdminPageRolesTab: 'http://localhost:8181/admin#/roles',
+    Android: 'http://localhost:8181/android',
+    Blog: 'http://localhost:8181/blog',
     BlogAdmin: 'http://localhost:8181/blog-admin',
-    CreatorDashboard: 'http://localhost:8181/creator-dashboard',
+    BlogDashboard: 'http://localhost:8181/blog-dashboard',
+    CommunityLibrary: 'http://localhost:8181/community-library',
+    Contact: 'http://localhost:8181/contact',
     ContributorDashboardAdmin: 'http://localhost:8181/contributor-dashboard-admin/',
-    AdminPage: 'http://localhost:8181/admin',
-    RolesEditorTab: 'http://localhost:8181/admin#/roles',
-    logout: 'http://localhost:8181/logout'
+    CreatorDashboard: 'http://localhost:8181/creator-dashboard',
+    CreatorDashboardCreateMode: 'http://localhost:8181/creator-dashboard?mode=create',
+    Donate: 'http://localhost:8181/donate',
+    DonateWithThanksModal: 'http://localhost:8181/donate?thanks=',
+    ExternalLink61MillionChildren: 'https://uis.unesco.org/en/news/world-poverty-could-be-cut-half-if-all-adults-completed-secondary-education',
+    ExternalLinkEvenThoseWhoAreInSchool: 'https://uis.unesco.org/sites/default/files/documents/fs46-more-than-half-children-not-learning-en-2017.pdf',
+    ExternalLinkSourceUnesco: 'https://uis.unesco.org/en/news/new-report-how-measure-equity-education',
+    ExternalLinkWatchAVideo: 'https://www.facebook.com/oppiaorg/videos/189487953721583/',
+    Home: 'http://localhost:8181/',
+    Logout: 'http://localhost:8181/logout',
+    MathClassroom: 'http://localhost:8181/learn/math',
+    Partnerships: 'http://localhost:8181/partnerships',
+    Volunteer: 'http://localhost:8181/volunteer'
   },
   Dashboard: {
     MainDashboard: '.e2e-test-splash-page',
diff --git a/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/user-factory.js b/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/user-factory.js
--- a/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/user-factory.js
+++ b/core/tests/puppeteer-acceptance-tests/puppeteer-testing-utilities/user-factory.js
@@ -17,7 +17,8 @@
  */
 
 let e2eSuperAdmin = require('../user-utilities/super-admin-utils.js');
-let e2eBlogAdmin = e2eBlogPostEditor = e2eGuestUser = require(
+let e2eGuestUser = require('../user-utilities/logged-in-users-utils.js');
+let e2eBlogAdmin = e2eBlogPostEditor = require(
   '../user-utilities/blog-post-admin-utils.js');
 let e2eTranslationAdmin = require(
   '../user-utilities/translation-admin-utils.js');
diff --git a/core/tests/puppeteer-acceptance-tests/spec/blog-editor-tests/check-blog-editor-unable-to-publish-duplicate-blog-post.spec.js b/core/tests/puppeteer-acceptance-tests/spec/blog-editor-tests/try-to-publish-a-duplicate-blog-post-and-get-blocked.spec.js
similarity index 100%
rename from core/tests/puppeteer-acceptance-tests/spec/blog-editor-tests/check-blog-editor-unable-to-publish-duplicate-blog-post.spec.js
rename to core/tests/puppeteer-acceptance-tests/spec/blog-editor-tests/try-to-publish-a-duplicate-blog-post-and-get-blocked.spec.js
diff --git a/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-in-about-foundation-page.spec.js b/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-in-about-foundation-page.spec.js
new file mode 100644
--- /dev/null
+++ b/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-in-about-foundation-page.spec.js
@@ -0,0 +1,89 @@
+// Copyright 2023 The Oppia Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Acceptance Test for checking if logged-in users
+ * can open links by clicking all buttons in about foundation page
+ */
+
+const userFactory = require(
+  '../../puppeteer-testing-utilities/user-factory.js');
+const testConstants = require(
+  '../../puppeteer-testing-utilities/test-constants.js');
+
+const DEFAULT_SPEC_TIMEOUT = testConstants.DEFAULT_SPEC_TIMEOUT;
+
+describe('Logged-in User in About Foundation page', function() {
+  let testUser = null;
+
+  beforeAll(async function() {
+    testUser = await userFactory.createNewGuestUser(
+      'testuser', 'testuser@example.com');
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  beforeEach(async function() {
+    await testUser.navigateToAboutFoundationPage();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the page with the 61 million children link.',
+    async function() {
+      await testUser.click61MillionChildrenLinkInAboutFoundation();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the page with the Even Those Who Are In School link.',
+    async function() {
+      await testUser.clickEvenThoseWhoAreInSchoolLinkInAboutFoundation();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the page with the Source: UNESCO link.',
+    async function() {
+      await testUser.clickSourceUnescoLinkInAboutFoundation();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the page with the 420 Million link.',
+    async function() {
+      await testUser.click420MillionLinkInAboutFoundation();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the About page with the Learn More About Oppia button.',
+    async function() {
+      await testUser.clickLearnMoreAboutOppiaButtonInAboutFoundation();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the Volunteer page with the Become A Volunteer button.',
+    async function() {
+      await testUser.clickBecomeAVolunteerButtonInAboutFoundation();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the Partnerships page with the Consider Becoming A ' +
+    'Partner Today! link.',
+  async function() {
+    await testUser.clickConsiderBecomingAPartnerTodayLinkInAboutFoundation();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the Volunteer page with the Join Our Large Volunteer ' +
+    'Community link.',
+  async function() {
+    await testUser.clickJoinOurLargeVolunteerCommunityLinkInAboutFoundation();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the Donate page with the donations link.',
+    async function() {
+      await testUser.clickDonationsLinkInAboutFoundation();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  afterAll(async function() {
+    await userFactory.closeAllBrowsers();
+  });
+});
diff --git a/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-in-about-page.spec.js b/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-in-about-page.spec.js
new file mode 100644
--- /dev/null
+++ b/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-in-about-page.spec.js
@@ -0,0 +1,73 @@
+// Copyright 2023 The Oppia Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Acceptance Test for checking if logged-in users
+ * can open links by clicking all buttons in about foundation page
+ */
+
+const userFactory = require(
+  '../../puppeteer-testing-utilities/user-factory.js');
+const testConstants = require(
+  '../../puppeteer-testing-utilities/test-constants.js');
+
+const DEFAULT_SPEC_TIMEOUT = testConstants.DEFAULT_SPEC_TIMEOUT;
+
+describe('Logged-in User in About page', function() {
+  let testUser = null;
+
+  beforeAll(async function() {
+    testUser = await userFactory.createNewGuestUser(
+      'testuser', 'testuser@example.com');
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  beforeEach(async function() {
+    await testUser.navigateToAboutPage();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Math Classroom page with the Browse Our Lessons button.',
+    async function() {
+      await testUser.clickBrowseOurLessonsButtonInAboutPage();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Android page with the Access Android App button.',
+    async function() {
+      await testUser.clickAccessAndroidAppButtonInAboutPage();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Math Classroom page with the Visit Classroom button.',
+    async function() {
+      await testUser.clickVisitClassroomButtonInAboutPage();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Community Library page with the Browse Library button.',
+    async function() {
+      await testUser.clickBrowseLibraryButtonInAboutPage();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Creator Dashboard page and Exploration Editor ' +
+    'with the Create Lessons button',
+  async function() {
+    await testUser.clickCreateLessonsButtonInAboutPage();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Math Classroom page with the Explore Lessons button.',
+    async function() {
+      await testUser.clickExploreLessonsButtonInAboutPage();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  afterAll(async function() {
+    await userFactory.closeAllBrowsers();
+  });
+});
diff --git a/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-in-thanks-for-donating-page.spec.js b/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-in-thanks-for-donating-page.spec.js
new file mode 100644
--- /dev/null
+++ b/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-in-thanks-for-donating-page.spec.js
@@ -0,0 +1,58 @@
+// Copyright 2023 The Oppia Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Acceptance Test for checking if logged-in users
+ * can open links by clicking all buttons in thanks for donating page
+ */
+
+const userFactory = require(
+  '../../puppeteer-testing-utilities/user-factory.js');
+const testConstants = require(
+  '../../puppeteer-testing-utilities/test-constants.js');
+
+const DEFAULT_SPEC_TIMEOUT = testConstants.DEFAULT_SPEC_TIMEOUT;
+
+describe('Logged-in User in Thanks for Donating page', function() {
+  let testUser = null;
+
+  beforeAll(async function() {
+    testUser = await userFactory.createNewGuestUser(
+      'testuser', 'testuser@example.com');
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  beforeEach(async function() {
+    await testUser.navigateToThanksForDonatingPage();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the right page with the Watch A Video button.',
+    async function() {
+      await testUser.clickWatchAVideoButtonInThanksForDonatingPage();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open the Blog page with the Read Our Blog button.',
+    async function() {
+      await testUser.clickReadOurBlogButtonInThanksForDonatingPage();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should close the thanks for donating popup and show the Donate Page ' +
+    'with the dismiss button.',
+  async function() {
+    await testUser.clickDismissButtonInThanksForDonatingPage();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  afterAll(async function() {
+    await userFactory.closeAllBrowsers();
+  });
+});
diff --git a/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-on-navbar.spec.js b/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-on-navbar.spec.js
new file mode 100644
--- /dev/null
+++ b/core/tests/puppeteer-acceptance-tests/spec/logged-in-user-tests/click-all-buttons-on-navbar.spec.js
@@ -0,0 +1,82 @@
+// Copyright 2023 The Oppia Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Acceptance Test for checking if logged-in users
+ * can open link by clicking all buttons on navbar
+ */
+
+const userFactory = require(
+  '../../puppeteer-testing-utilities/user-factory.js');
+const testConstants = require(
+  '../../puppeteer-testing-utilities/test-constants.js');
+
+const DEFAULT_SPEC_TIMEOUT = testConstants.DEFAULT_SPEC_TIMEOUT;
+
+describe('Logged-in User', function() {
+  let testUser = null;
+
+  beforeAll(async function() {
+    testUser = await userFactory.createNewGuestUser(
+      'testuser', 'testuser@example.com');
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open About Url with About Oppia button in About Menu on navbar',
+    async function() {
+      await testUser.clickAboutButtonInAboutMenuOnNavbar();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open About Foundation Url with The Oppia Foundation button ' +
+    'in About Menu on navbar',
+  async function() {
+    await testUser.clickAboutFoundationButtonInAboutMenuOnNavbar();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Blog Url with Blog button in About Menu on navbar',
+    async function() {
+      await testUser.clickBlogButtonInAboutMenuOnNavbar();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Partnerships Url with School and Organizations button ' +
+    'in Get Involved menu on navbar',
+  async function() {
+    await testUser.clickPartnershipsButtonInGetInvolvedMenuOnNavbar();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Volunteer Url with Volunteer button in Get Involved menu ' +
+    'on navbar',
+  async function() {
+    await testUser.clickVolunteerButtonInGetInvolvedMenuOnNavbar();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Donate Url with Donate button in Get Involved menu on navbar',
+    async function() {
+      await testUser.clickDonateButtonInGetInvolvedMenuOnNavbar();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Contact Url with Contact Us button in Get Involved menu ' +
+    'on navbar',
+  async function() {
+    await testUser.clickContactUsButtonInGetInvolvedMenuOnNavbar();
+  }, DEFAULT_SPEC_TIMEOUT);
+
+  it('should open Donate Url with Donate button on navbar',
+    async function() {
+      await testUser.clickDonateButtonOnNavbar();
+    }, DEFAULT_SPEC_TIMEOUT);
+
+  afterAll(async function() {
+    await userFactory.closeAllBrowsers();
+  });
+});
diff --git a/core/tests/puppeteer-acceptance-tests/user-utilities/logged-in-users-utils.js b/core/tests/puppeteer-acceptance-tests/user-utilities/logged-in-users-utils.js
new file mode 100644
--- /dev/null
+++ b/core/tests/puppeteer-acceptance-tests/user-utilities/logged-in-users-utils.js
@@ -0,0 +1,620 @@
+// Copyright 2023 The Oppia Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Logged-in users utility file.
+ */
+
+const baseUser = require(
+  '../puppeteer-testing-utilities/puppeteer-utils.js');
+const testConstants = require(
+  '../puppeteer-testing-utilities/test-constants.js');
+const { showMessage } = require(
+  '../puppeteer-testing-utilities/show-message-utils.js');
+
+const homeUrl = testConstants.URLs.Home;
+const aboutUrl = testConstants.URLs.About;
+const mathClassroomUrl = testConstants.URLs.MathClassroom;
+const androidUrl = testConstants.URLs.Android;
+const communityLibraryUrl = testConstants.URLs.CommunityLibrary;
+const creatorDashboardCreateModeUrl =
+  testConstants.URLs.CreatorDashboardCreateMode;
+const aboutFoundationUrl = testConstants.URLs.AboutFoundation;
+const blogUrl = testConstants.URLs.Blog;
+const partnershipsUrl = testConstants.URLs.Partnerships;
+const volunteerUrl = testConstants.URLs.Volunteer;
+const donateUrl = testConstants.URLs.Donate;
+const contactUrl = testConstants.URLs.Contact;
+const _61MillionChildrenUrl = testConstants.URLs.ExternalLink61MillionChildren;
+const sourceUnescoUrl = testConstants.URLs.ExternalLinkSourceUnesco;
+const evenThoseWhoAreInSchoolUrl =
+  testConstants.URLs.ExternalLinkEvenThoseWhoAreInSchool;
+const _420MillionUrl = testConstants.URLs.ExternalLink61MillionChildren;
+const thanksForDonatingUrl = testConstants.URLs.DonateWithThanksModal;
+const watchAVideoUrl = testConstants.URLs.ExternalLinkWatchAVideo;
+
+const navbarAboutTab = 'a.e2e-test-navbar-about-menu';
+const navbarAboutTabAboutButton = 'a.e2e-test-about-link';
+const navbarAboutTabAboutFoundationButton =
+  'a.e2e-test-navbar-about-menu-about-foundation-button';
+const navbarAboutTabBlogButton = 'a.e2e-test-blog-link';
+const navbarGetInvolvedTab = 'a.e2e-test-navbar-get-involved-menu';
+const navbarGetInvolvedTabSchoolAndOrganizationsButton =
+  'a.e2e-test-navbar-get-involved-menu-school-and-organizations-button';
+const navbarGetInvolvedTabVolunteerButton =
+  'a.e2e-test-navbar-get-involved-menu-volunteer-button';
+const navbarGetInvolvedTabDonateButton =
+  'a.e2e-test-navbar-get-involved-menu-donate-button';
+const navbarGetInvolvedTabContactUsButton =
+  'a.e2e-test-navbar-get-involved-menu-contact-us-button';
+const navbarDonateButton = 'a.e2e-test-navbar-donate-button';
+
+const browseOurLessonsButton = '.e2e-test-about-page-browse-our-lessons-button';
+const accessAndroidAppButton = '.e2e-test-about-page-access-android-app-button';
+const visitClassroomButton = '.e2e-test-about-page-visit-classroom-button';
+const browseLibraryButton = '.e2e-test-about-page-browse-library-button';
+const createLessonsButton = '.e2e-test-about-page-create-lessons-button';
+const exploreLessonsButton = '.e2e-test-about-page-explore-lessons-button';
+
+const aboutFoundationClass = '.oppia-about-foundation-hero-content h1';
+const millionsOfContentId =
+  '.e2e-test-about-foundation-page-millions-of-content';
+const weCannotContentId = '.e2e-test-about-foundation-page-we-cannot-content';
+const sourceUnescoButton =
+  'a.e2e-test-about-foundation-page-source-unesco-button';
+const learnMoreAboutOppiaButton =
+  '.e2e-test-about-foundation-page-learn-more-about-oppia-button';
+const becomeAVolunteerButton =
+  '.e2e-test-about-foundation-page-become-a-volunteer-button';
+const sectionSixPart1 = '.e2e-test-about-foundation-page-section-six-part-1';
+const sectionSixPart2 = '.e2e-test-about-foundation-page-section-six-part-2';
+const sectionSixPart3 = '.e2e-test-about-foundation-page-section-six-part-3';
+
+const watchAVideoButton =
+  'a.e2e-test-thanks-for-donating-page-watch-a-video-button';
+const readOurBlogButton =
+  'a.e2e-test-thanks-for-donating-page-read-our-blog-button';
+const dismissButton = 'i.e2e-test-thanks-for-donating-page-dismiss-button';
+const thanksForDonatingClass = '.modal-open';
+const donatePage = '.modal-backdrop.fade';
+
+module.exports = class LoggedInUsers extends baseUser {
+  /**
+   * Function to navigate to the home page.
+   */
+  async navigateToHome() {
+    await this.goto(homeUrl);
+  }
+
+  /**
+   * Function to navigate to the about page.
+   */
+  async navigateToAboutPage() {
+    await this.goto(aboutUrl);
+  }
+
+  /**
+   * Function to navigate to the about foundation page.
+   */
+  async navigateToAboutFoundationPage() {
+    await this.goto(aboutFoundationUrl);
+  }
+
+  /**
+   * Function to navigate to the Thanks for Donating page.
+   */
+  async navigateToThanksForDonatingPage() {
+    await Promise.all([
+      this.page.waitForNavigation(),
+      this.page.goto(thanksForDonatingUrl),
+    ]);
+  }
+
+  /**
+   * Function to click a button and check if it opens the expected destination.
+   * @param {string} button - the CSS selector of the button element
+   * @param {string} buttonName - the name of the button
+   * @param {string} expectedDestinationPageUrl - the expected page that
+   *   the button should navigate to
+   * @param {string} expectedDestinationPageName - the name of the expected page
+   */
+  async clickButtonToNavigateToNewPage(
+      button, buttonName, expectedDestinationPageUrl,
+      expectedDestinationPageName) {
+    await Promise.all([
+      this.page.waitForNavigation(),
+      await this.clickOn(button),
+    ]);
+    if (this.page.url() !== expectedDestinationPageUrl) {
+      throw new Error (
+        'The ' + buttonName + ' does not open the ' +
+        expectedDestinationPageName + ' page!');
+    } else {
+      showMessage(
+        'The ' + buttonName + ' opens the ' +
+        expectedDestinationPageName + ' page.');
+    }
+  }
+
+  /**
+   * Function to click the About button in the About Menu on navbar
+   * and check if it opens the About page.
+   */
+  async clickAboutButtonInAboutMenuOnNavbar() {
+    await this.clickOn(navbarAboutTab);
+    await this.clickButtonToNavigateToNewPage(
+      navbarAboutTabAboutButton,
+      'About Oppia button in the About Menu on navbar', aboutUrl, 'About');
+  }
+
+  /**
+   * Function to click the Browse Our Lessons button in the About page
+   * and check if it opens the Math Classroom page.
+   */
+  async clickBrowseOurLessonsButtonInAboutPage() {
+    await this.clickButtonToNavigateToNewPage(
+      browseOurLessonsButton,
+      'Browse Our Lessons button', mathClassroomUrl, 'Math Classroom');
+  }
+
+  /**
+   * Function to click the Access Android App button in the About page
+   * and check if it opens the Android page.
+   */
+  async clickAccessAndroidAppButtonInAboutPage() {
+    await this.clickButtonToNavigateToNewPage(
+      accessAndroidAppButton,
+      'Access the Android App button', androidUrl, 'Android');
+  }
+
+  /**
+   * Function to click the Visit Classroom button in the About page
+   * and check if it opens the Math Classroom page.
+   */
+  async clickVisitClassroomButtonInAboutPage() {
+    await this.clickButtonToNavigateToNewPage(
+      visitClassroomButton,
+      'Visit Classroom button', mathClassroomUrl, 'Math Classroom');
+  }
+
+  /**
+   * Function to click the Browse Library button in the About page
+   * and check if it opens the Community Library page.
+   */
+  async clickBrowseLibraryButtonInAboutPage() {
+    await this.clickButtonToNavigateToNewPage(
+      browseLibraryButton,
+      'Browse Library button', communityLibraryUrl, 'Community Library');
+  }
+
+  /**
+   * Function to click the Browse Our Lessons button in the About page
+   * and check if it opens the Creator Dashboard page in Create Mode.
+   */
+  async clickCreateLessonsButtonInAboutPage() {
+    await this.clickOn(createLessonsButton);
+    if (this.page.url() !== creatorDashboardCreateModeUrl) {
+      throw new Error (
+        'The Create Lessons button does not open the Creator Dashboard ' +
+        'in Create Mode!');
+    } else {
+      showMessage(
+        'The Create Lessons button opens the Creator Dashboard ' +
+        'in Create Mode.');
+    }
+    await this.page.waitForNavigation();
+    const urlRegex =
+      /http:\/\/localhost:8181\/create\/\w*(\/gui\/Introduction)?/;
+    if (this.page.url().match(urlRegex) === null) {
+      throw new Error (
+        'The Create Lessons button does not display ' +
+        'the Exploration Editor page!');
+    } else {
+      showMessage(
+        'The Create Lessons button displays the Exploration Editor page.');
+    }
+  }
+
+  /**
+   * Function to click the Browse Our Lessons button in the About page
+   * and check if it opens the Math Classroom page.
+   */
+  async clickExploreLessonsButtonInAboutPage() {
+    await this.clickButtonToNavigateToNewPage(
+      exploreLessonsButton,
+      'Explore Lessons button', mathClassroomUrl, 'Math Classroom');
+  }
+
+  /**
+   * Function to click the The Oppia Foundation button in the About Menu
+   * on navbar and check if it opens The About Foundation page.
+   */
+  async clickAboutFoundationButtonInAboutMenuOnNavbar() {
+    await this.clickOn(navbarAboutTab);
+    await this.clickOn(navbarAboutTabAboutFoundationButton);
+    await this.page.waitForSelector(aboutFoundationClass);
+    const displayedH1 = await this.page.$eval(
+      aboutFoundationClass,
+      element => element.innerText
+    );
+    if ((this.page.url() !== aboutFoundationUrl) &&
+      (displayedH1 !== 'THE OPPIA FOUNDATION')) {
+      throw new Error (
+        'The Oppia Foundation button in About Menu on navbar ' +
+        'does not open the About Foundation page!');
+    } else {
+      showMessage(
+        'The Oppia Foundation button in About Menu on navbar ' +
+        'opens the About Foundation page.');
+    }
+  }
+
+  /**
+   * Function to click the 61 million children link
+   * in the About Foundation page and check if it opens the right page.
+   */
+  async click61MillionChildrenLinkInAboutFoundation() {
+    await this.page.waitForSelector(millionsOfContentId);
+    const buttonText = await this.page.$eval(
+      millionsOfContentId,
+      element => element.getElementsByTagName('a')[0].textContent
+    );
+
+    if (buttonText !== '61 million children') {
+      throw new Error (
+        'The 61 Million Children button does not exist!');
+    }
+    await this.page.$eval(
+      millionsOfContentId,
+      element => element.getElementsByTagName('a')[0].click()
+    );
+    if (this.page.url() !== _61MillionChildrenUrl) {
+      throw new Error (
+        'The 61 Million Children link does not open the right page!');
+    } else {
+      showMessage(
+        'The 61 Million Children link opens the right page.');
+    }
+  }
+
+  /**
+   * Function to click the even those who are in school link
+   * in the About Foundation page and check if it opens the right page.
+   */
+  async clickEvenThoseWhoAreInSchoolLinkInAboutFoundation() {
+    await this.page.waitForSelector(millionsOfContentId);
+    const buttonText = await this.page.$eval(
+      millionsOfContentId,
+      element => element.getElementsByTagName('a')[1].textContent
+    );
+    if (buttonText !== 'even those who are in school') {
+      throw new Error (
+        'The Even Those Who Are In School button does not exist!');
+    }
+    await this.page.$eval(
+      millionsOfContentId,
+      element => element.getElementsByTagName('a')[1].click()
+    );
+    if (this.page.url() !== evenThoseWhoAreInSchoolUrl) {
+      throw new Error (
+        'The Even Those Who Are In School link does not open ' +
+        'the right page!');
+    } else {
+      showMessage(
+        'The Even Those Who Are In School link opens the right page.');
+    }
+  }
+
+  /**
+   * Function to click the Source: UNESCO link in the About Foundation page
+   * and check if it opens the right page.
+   */
+  async clickSourceUnescoLinkInAboutFoundation() {
+    await this.clickButtonToNavigateToNewPage(
+      sourceUnescoButton,
+      'Source: UNESCO link', sourceUnescoUrl, 'right');
+  }
+
+  /**
+   * Function to click the 420 million link
+   * in the About Foundation page and check if it opens the right page.
+   */
+  async click420MillionLinkInAboutFoundation() {
+    await this.page.waitForSelector(weCannotContentId);
+    const buttonText = await this.page.$eval(
+      weCannotContentId,
+      element => element.getElementsByTagName('a')[0].textContent
+    );
+    if (buttonText !== '420 million') {
+      throw new Error (
+        'The 420 Million link does not exist!');
+    }
+    await this.page.$eval(
+      weCannotContentId,
+      element => element.getElementsByTagName('a')[0].click()
+    );
+    if (this.page.url() !== _420MillionUrl) {
+      throw new Error (
+        'The 420 Million link does not open the right page!');
+    } else {
+      showMessage(
+        'The 420 Million link opens the right page.');
+    }
+  }
+
+  /**
+   * Function to click the Learn More About Oppia button
+   * in the About Foundation page and check if it opens the About page.
+   */
+  async clickLearnMoreAboutOppiaButtonInAboutFoundation() {
+    await this.clickOn(learnMoreAboutOppiaButton);
+    const newTab = await this.browserObject.waitForTarget(
+      target => target.url() === aboutUrl
+    );
+    if (newTab.url() !== aboutUrl) {
+      throw new Error (
+        'The Learn More About Oppia button does not open the About page!');
+    } else {
+      showMessage(
+        'The Learn More About Oppia button opens the About page.');
+    }
+  }
+
+  /**
+   * Function to click the Become A Volunteer button
+   * in the About Foundation page and check if it opens the Volunteer page.
+   */
+  async clickBecomeAVolunteerButtonInAboutFoundation() {
+    await this.clickOn(becomeAVolunteerButton);
+    const newTab = await this.browserObject.waitForTarget(
+      target => target.url() === volunteerUrl
+    );
+    if (newTab.url() !== volunteerUrl) {
+      throw new Error (
+        'The Become A Volunteer button does not open the Volunteer page!');
+    } else {
+      showMessage(
+        'The Become A Volunteer button opens the Volunteer page.');
+    }
+  }
+
+  /**
+   * Function to click the Consider Becoming A Partner Today! link
+   * in the About Foundation page and check if it opens the Partnerships page.
+   */
+  async clickConsiderBecomingAPartnerTodayLinkInAboutFoundation() {
+    await this.page.waitForSelector(sectionSixPart1);
+    const buttonText = await this.page.$eval(
+      sectionSixPart1,
+      element => element.getElementsByTagName('a')[0].textContent
+    );
+    if (buttonText !== 'Consider becoming a partner today!') {
+      throw new Error (
+        'The Consider becoming a partner today! link does not exist!');
+    }
+    await this.page.$eval(
+      sectionSixPart1,
+      element => element.getElementsByTagName('a')[0].click()
+    );
+    if (this.page.url() !== partnershipsUrl) {
+      throw new Error (
+        'The Consider becoming a partner today! link does not open ' +
+        'the Partnerships page!');
+    } else {
+      showMessage(
+        'The Consider becoming a partner today! link opens ' +
+        'the Partnerships page.');
+    }
+  }
+
+  /**
+   * Function to click the Join our large volunteer community! link
+   * in the About Foundation page and check if it opens the Volunteer page.
+   */
+  async clickJoinOurLargeVolunteerCommunityLinkInAboutFoundation() {
+    await this.page.waitForSelector(sectionSixPart2);
+    const buttonText = await this.page.$eval(
+      sectionSixPart2,
+      element => element.getElementsByTagName('a')[0].textContent
+    );
+    if (buttonText !== 'Join our large volunteer community!') {
+      throw new Error (
+        'The Join our large volunteer community! link does not exist!');
+    }
+    await this.page.$eval(
+      sectionSixPart2,
+      element => element.getElementsByTagName('a')[0].click()
+    );
+    if (this.page.url() !== volunteerUrl) {
+      throw new Error (
+        'The Join our large volunteer community! link does not open ' +
+        'the Volunteer page!');
+    } else {
+      showMessage(
+        'The Join our large volunteer community! link opens ' +
+        'the Volunteer page.');
+    }
+  }
+
+  /**
+   * Function to click the donations link
+   * in the About Foundation page and check if it opens the Donate page.
+   */
+  async clickDonationsLinkInAboutFoundation() {
+    await this.page.waitForSelector(sectionSixPart3);
+    const buttonText = await this.page.$eval(
+      sectionSixPart3,
+      element => element.getElementsByTagName('a')[0].textContent
+    );
+    if (buttonText !== 'donations') {
+      throw new Error (
+        'The donations link does not exist!');
+    }
+    await this.page.$eval(
+      sectionSixPart3,
+      element => element.getElementsByTagName('a')[0].click()
+    );
+    if (this.page.url() !== donateUrl) {
+      throw new Error (
+        'The donations link does not open the Donate page!');
+    } else {
+      showMessage(
+        'The donations link opens the Donate page.');
+    }
+  }
+
+  /**
+   * Function to click the Blog button in the About Menu on navbar
+   * and check if it opens the Blog page.
+   */
+  async clickBlogButtonInAboutMenuOnNavbar() {
+    await this.clickOn(navbarAboutTab);
+    await this.clickButtonToNavigateToNewPage(
+      navbarAboutTabBlogButton,
+      'Blog button in the About Menu on navbar', blogUrl, 'Blog');
+  }
+
+  /**
+   * Function to click the School and Organizations button in the
+   * Get Involved Menu on navbar and check if it opens the Partnerships page.
+   */
+  async clickPartnershipsButtonInGetInvolvedMenuOnNavbar() {
+    await this.clickOn(navbarGetInvolvedTab);
+    await this.clickButtonToNavigateToNewPage(
+      navbarGetInvolvedTabSchoolAndOrganizationsButton,
+      'School and Organizations in the Get Involved Menu on navbar',
+      partnershipsUrl, 'Partnerships');
+  }
+
+  /**
+   * Function to click the Volunteer button in the Get Involved Menu
+   * on navbar and check if it opens the Volunteer page.
+   */
+  async clickVolunteerButtonInGetInvolvedMenuOnNavbar() {
+    await this.clickOn(navbarGetInvolvedTab);
+    await this.clickButtonToNavigateToNewPage(
+      navbarGetInvolvedTabVolunteerButton,
+      'Volunteer button in the Get Involved Menu on navbar',
+      volunteerUrl, 'Volunteer');
+  }
+
+  /**
+   * Function to click the Donate button in the Get Involved Menu
+   * on navbar and check if it opens the Donate page.
+   */
+  async clickDonateButtonInGetInvolvedMenuOnNavbar() {
+    await this.clickOn(navbarGetInvolvedTab);
+    await this.clickButtonToNavigateToNewPage(
+      navbarGetInvolvedTabDonateButton,
+      'Donate button in the Get Involved Menu on navbar', donateUrl, 'Donate');
+  }
+
+  /**
+   * Function to click the Contact Us button in the Get Involved Menu
+   * on navbar and check if it opens the Partnerships page.
+   */
+  async clickContactUsButtonInGetInvolvedMenuOnNavbar() {
+    await this.clickOn(navbarGetInvolvedTab);
+    await this.clickButtonToNavigateToNewPage(
+      navbarGetInvolvedTabContactUsButton,
+      'Contact Us button in the Get Involved Menu on navbar',
+      contactUrl, 'Contact');
+  }
+
+  /**
+   * Function to click the Donate button on navbar
+   * and check if it opens the Donate page.
+   */
+  async clickDonateButtonOnNavbar() {
+    await this.clickButtonToNavigateToNewPage(
+      navbarDonateButton, 'Donate button on navbar', donateUrl, 'Donate');
+  }
+
+  /**
+   * Function to click the Watch A Video button
+   * in the Thanks for Donating page and check if it opens the right page.
+   */
+  async clickWatchAVideoButtonInThanksForDonatingPage() {
+    await this.page.waitForSelector(watchAVideoButton);
+    const buttonText = await this.page.$eval(
+      watchAVideoButton,
+      element => element.innerText
+    );
+    if (buttonText !== 'Watch a video') {
+      throw new Error (
+        'The Watch A Video button does not exist!');
+    }
+    await Promise.all([
+      this.page.waitForNavigation(),
+      this.clickOn(watchAVideoButton),
+    ]);
+    if (this.page.url() !== watchAVideoUrl) {
+      throw new Error (
+        'The Watch A Video button does not open the right page!');
+    } else {
+      showMessage(
+        'The Watch A Video button opens the right page.');
+    }
+  }
+
+  /**
+   * Function to click the Read Our Blog button
+   * in the Thanks for Donating page and check if it opens the Blog page.
+   */
+  async clickReadOurBlogButtonInThanksForDonatingPage() {
+    await this.page.waitForSelector(readOurBlogButton);
+    const buttonText = await this.page.$eval(
+      readOurBlogButton,
+      element => element.innerText
+    );
+    if (buttonText !== 'Read our blog') {
+      throw new Error (
+        'The Read Our Blog button does not exist!');
+    }
+    await Promise.all([
+      this.page.waitForNavigation(),
+      this.clickOn(readOurBlogButton),
+    ]);
+    if (this.page.url() !== blogUrl) {
+      throw new Error (
+        'The Read Our Blog button does not open the Blog page!');
+    } else {
+      showMessage(
+        'The Read Our Blog button opens the Blog page.');
+    }
+  }
+
+  /**
+   * Function to click the dismiss button in the Thanks for Donating page,
+   * and check if the Thanks for Donating popup disappears
+   * and if the Donate page is shown
+   */
+  async clickDismissButtonInThanksForDonatingPage() {
+    await this.clickOn(dismissButton);
+    const thanksForDonatingHeader = await this.page.$(thanksForDonatingClass);
+    if (thanksForDonatingHeader !== null) {
+      throw new Error (
+        'The dismiss button does not close the Thanks for Donating popup!');
+    }
+    const donatePageShowed = await this.page.$(donatePage);
+    if (donatePageShowed === null) {
+      throw new Error (
+        'The dismiss button does not show the Donate page!');
+    } else {
+      showMessage(
+        'The dismiss button closes the Thanks for Donating popup ' +
+        'and if the Donate page is shown.');
+    }
+  }
+};
diff --git a/core/tests/puppeteer-acceptance-tests/user-utilities/super-admin-utils.js b/core/tests/puppeteer-acceptance-tests/user-utilities/super-admin-utils.js
--- a/core/tests/puppeteer-acceptance-tests/user-utilities/super-admin-utils.js
+++ b/core/tests/puppeteer-acceptance-tests/user-utilities/super-admin-utils.js
@@ -23,7 +23,7 @@ const testConstants = require(
 const { showMessage } = require(
   '../puppeteer-testing-utilities/show-message-utils.js');
 
-const rolesEditorTab = testConstants.URLs.RolesEditorTab;
+const AdminPageRolesTab = testConstants.URLs.AdminPageRolesTab;
 const roleEditorInputField = 'input.e2e-test-username-for-role-editor';
 const roleEditorButtonSelector = 'button.e2e-test-role-edit-button';
 const rolesSelectDropdown = 'div.mat-select-trigger';
@@ -36,7 +36,7 @@ module.exports = class e2eSuperAdmin extends baseUser {
    * @param {string} role - The role that would be assigned to the user.
    */
   async assignRoleToUser(username, role) {
-    await this.goto(rolesEditorTab);
+    await this.goto(AdminPageRolesTab);
     await this.type(roleEditorInputField, username);
     await this.clickOn(roleEditorButtonSelector);
     await this.clickOn(addRoleButton);
@@ -60,7 +60,7 @@ module.exports = class e2eSuperAdmin extends baseUser {
    */
   async expectUserToHaveRole(username, role) {
     const currentPageUrl = this.page.url();
-    await this.goto(rolesEditorTab);
+    await this.goto(AdminPageRolesTab);
     await this.type(roleEditorInputField, username);
     await this.clickOn(roleEditorButtonSelector);
     await this.page.waitForSelector('div.justify-content-between');
@@ -85,7 +85,7 @@ module.exports = class e2eSuperAdmin extends baseUser {
    */
   async expectUserNotToHaveRole(username, role) {
     const currentPageUrl = this.page.url();
-    await this.goto(rolesEditorTab);
+    await this.goto(AdminPageRolesTab);
     await this.type(roleEditorInputField, username);
     await this.clickOn(roleEditorButtonSelector);
     await this.page.waitForSelector('div.justify-content-between');