While trying automated logins with a simplistic python script like this -
import requests
url = 'https://theserver.tld/login/index.php'
myobj = {'username': 'theUserName', 'password': 'ThisIsThePassWord!', "logintoken": "hCBVa2gzAWqSa2u7iNzdzlE9kwpVehFf"}
x = requests.post(url, data = myobj)
print(x.text)
Moodle would return authentication failure - it was checking the logintoken, which was hard-coded above. R used a modified script to get the logintoken correctly first, which then works -
import sys
import requests
from bs4 import BeautifulSoup
#driver = webdriver.Chrome()
# using this technique, the testing machines would run out of RAM
# after a dozen or so Chrome instances were loaded!
#def login(url,usernameId, username, passwordId, password, submit_buttonId):
# driver.get(url)
# driver.find_element_by_id(usernameId).send_keys(username)
# driver.find_element_by_id(passwordId).send_keys(password)
# driver.find_element_by_id(submit_buttonId).click()
#myMoodleEmail = sys.argv[1]
#login("https://server.tld/login/index.php", "username", myMoodleEmail, "password", "ThePW!", "loginbtn")
#driver.close()
login_data = {
#'logintoken': 'XPc8nw0a2gLXpgsn6njpehwEoW43mzYQ',
'username': sys.argv[1], 'password': 'ThePW!'
}
headers = {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36'}
with requests.Session() as s:
url = "https://theserver.tld/login/index.php"
r = s.get(url)
soup = BeautifulSoup(r.content, 'html5lib')
login_data['logintoken'] = soup.find('input', attrs = {'name': 'logintoken'})['value']
r = s.post(url, data = login_data, headers = headers)
print(r.text)
So I didn't have to try JMeter as the moodle documentation suggests,
https://moodle.org/mod/forum/discuss.php?d=313489
which points to the moodle documentation on load testing.
https://docs.moodle.org/dev/JMeter#Make_JMeter_test_plan
Edit: Example usage of JMeter -
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
Edit: The final result was, on AWS, "R5A Quadruple Extra Large - 128 GB RAM, 16 Virtual CPUs, 10 GB Network" - for 2000 users to log in concurrently.