问题描述
下面的脚本包含三个 Lua 函数,这些函数执行此站点的登录过程,同时尝试最大限度地减少显式等待时间以加快完成时间。该脚本旨在登录,以便我可以保存此会话并在稍后的步骤中在多个并发请求中使用它。所有这些都在起作用;然而,我最快的时间是 12 秒,平均时间在 17 秒左右。同时,手动登录并进入网站的仪表板最多需要 8 秒。根据我对每一步超时的尝试,实际的 javascript 和元素操作需要 1-2 秒,而显式等待又需要 3 秒。我尝试完全消除返回的任何数据,但没有任何影响(即使有,我需要无论如何返回的信息);我还禁用了所有可以用于渲染的媒体源和图像。我还能做些什么来尝试减少此登录所需的时间?我的结论是否有误?
function main(splash)
splash.private_mode_enabled = false
assert(splash:go{
splash.args.url,headers=splash.args.headers,http_method=splash.args.http_method,body=splash.args.body,})
assert(splash:wait(1))
--USERNAME ENTRY
wait_for_element(splash,'#idp-discovery-username')
local username = assert(splash:select('#idp-discovery-username'))
username:send_text('username')
assert(splash:wait(0))
--CLICK NEXT BUTTON
assert(splash:runjs('document.querySelector("#idp-discovery-submit").click()'))
assert(splash:wait(2))
--PASSWORD ENTRY
wait_for_element(splash,'#okta-signin-password')
local password = assert(splash:select('#okta-signin-password'))
password:send_text('password')
assert(splash:wait(0))
--CLICK LOGIN BUTTON
--local time_up_to_login_button_click = os.clock() - start_time
assert(splash:runjs('document.body.querySelector("#okta-signin-submit").click()'))
assert(splash:wait(0))
assert(wait_restarting_on_redirects(splash,4,3))
local entries = splash:history()
local last_response = entries[#entries].response
return {
url = splash:url(),headers = last_response.headers,cookies = splash:get_cookies(),}
end
function wait_restarting_on_redirects(splash,time,max_redirects)
local redirects_remaining = max_redirects
while redirects_remaining > 0 do
local ok,reason = splash:wait{time=time,cancel_on_redirect=true}
if reason ~= 'redirect' then
return ok,reason
end
redirects_remaining = redirects_remaining - 1
end
return nil,"too_many_redirects"
end
function wait_for_element(splash,css,maxwait)
if maxwait == nil then
maxwait = 3
end
return splash:wait_for_resume(string.format([[
function main(splash) {
var selector = '%s';
var maxwait = %s;
var end = Date.Now() + maxwait*1000;
function check() {
if(document.querySelector(selector)) {
splash.resume('Element found');
} else if(Date.Now() >= end) {
var err = 'Timeout waiting for element';
splash.error(err + " " + selector);
} else {
setTimeout(check,200);
}
}
check();
}
]],maxwait))
end
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)