Javascript 如果没有键盘/人为干扰,按钮单击将无法工作

Javascript 如果没有键盘/人为干扰,按钮单击将无法工作,javascript,dom-events,ui-automation,keyboard-events,Javascript,Dom Events,Ui Automation,Keyboard Events,场景:开发者通过调用外部服务生成JWT令牌,生成JWT后,复制粘贴到Swagger的authorize部分,点击authorize按钮,之后我们可以从Swagger启动API,因为它现在有JWT令牌 我已经尝试将其自动化,一旦生成JWT,我的JS代码将进入授权部分的JWT令牌并尝试单击授权按钮。但是这里有一些问题,我可以看到JS正在尝试单击授权按钮(在控制台中我可以看到操作),但什么都没有发生。我还注意到,若我们从键盘手动添加任何内容,然后按下按钮,它就会工作。如何在JS中模拟这一点 注意:如果

场景:开发者通过调用外部服务生成JWT令牌,生成JWT后,复制粘贴到Swagger的authorize部分,点击authorize按钮,之后我们可以从Swagger启动API,因为它现在有JWT令牌

我已经尝试将其自动化,一旦生成JWT,我的JS代码将进入授权部分的JWT令牌并尝试单击授权按钮。但是这里有一些问题,我可以看到JS正在尝试单击授权按钮(在控制台中我可以看到操作),但什么都没有发生。我还注意到,若我们从键盘手动添加任何内容,然后按下按钮,它就会工作。如何在JS中模拟这一点

注意:如果我们手动按下/输入键盘上的任何字符,然后触发z.click(),它会工作吗?我们如何在JS中模拟键盘按下输入文本

我尝试过这个,但没有成功:

 document.getElementById("va").dispatchEvent(
 new KeyboardEvent("keydown", {
 key: "e",
 keyCode: 69, // example values.
 code: "KeyE", // put everything you need in this object.
 which: 69,
 shiftKey: false, // you don't need to include values
 ctrlKey: false,  // if you aren't going to use them.
 metaKey: false   // these are here for example's sake.
 })
);



 const txtToken = document.getElementById("jwttoken");

function simulateEnterToken (x,tokens){
var val=x.getElementsByClassName("dialog-ux")[0]
             .getElementsByClassName("modal-ux")[0]
              .getElementsByClassName("modal-dialog-ux")[0]
              .getElementsByClassName("modal-ux-inner")[0]
              .getElementsByClassName("modal-ux-content")[0]
             .getElementsByClassName("auth-container")[0] .getElementsByClassName("wrapper")[1];
   val.getElementsByTagName("input")[0].id="va";
  document.getElementById("va").value=tokens;

 console.log(x);
}


function simulateClickAuthorize(x){
 var y=x.getElementsByClassName("dialog-ux")[0]
         .getElementsByClassName("modal-ux")[0]
          .getElementsByClassName("modal-dialog-ux")[0]
          .getElementsByClassName("modal-ux-inner")[0]
          .getElementsByClassName("modal-ux-content")[0]
         .getElementsByClassName("auth-container")[0]
          .getElementsByClassName("auth-btn-wrapper")[0];
           console.log(y);
       var z=y.getElementsByClassName("btn modal-btn auth authorize button")[0];
   z.click();
    }
添加了2个屏幕截图以便于清晰理解

注意:我还尝试模拟键盘事件

document.getElementById("va").value.dispatchEvent(new 
KeyboardEvent('keypress',{'key':'a'}));


 document.getElementById("va").dispatchEvent(
 new KeyboardEvent("keydown", {
  key: "e",
  keyCode: 69, // example values.
  code: "KeyE", // put everything you need in this object.
  which: 69,
  shiftKey: false, // you don't need to include values
  ctrlKey: false,  // if you aren't going to use them.
  metaKey: false   // these are here for example's sake.
  })
 );
此外,我不能改变任何从招摇,因为它是第三方图书馆

编辑:控制台的输出。日志(z)已附加

编辑2:表单没有ID

编辑3:@Roger要求提交表格

var val=x.getElementsByClassName("dialog-ux")[0]
             .getElementsByClassName("modal-ux")[0]
              .getElementsByClassName("modal-dialog-ux")[0]
              .getElementsByClassName("modal-ux-inner")[0]
              .getElementsByClassName("modal-ux-content")[0]
             .getElementsByClassName("auth-container")[0]

val.getElementsByTagName("form")[0].submit()
它也不起作用,我得到了错误页面

错误

白标错误页 此应用程序没有针对/error的显式映射,因此您将其视为一种回退。Mon Jul 20 14:01:11 IST 2020 出现意外错误(类型=错误请求,状态=400)。 所需的字符串参数“product”不存在

编辑4:这是我的初始URL

http://localhost:8080/docs?product=test&docid=testapp-swagger-openapi&type=yaml#/person-controller/getPersonUsingGET

单击submit()后,url显示在下方,但有错误

http://localhost:8080/docs?#/person-控制器/getPersonUsingGET

单击提交()后的图像/网络控制台


注意:当我们手动单击以提交表单时,没有api调用,我相信您会希望以表单元素为目标并调用
submit
方法

示例(假设页面上只有一个
元素):


为了提交表单,我相信您会希望以表单元素为目标,并调用
submit
方法

示例(假设页面上只有一个
元素):


console.log(z)
return是什么?@DarrenSweeney我已经在edit中附加了console.log(z)的输出
console.log(z)
return是什么?@DarrenSweeney我已经在edit中附加了console.log(z)的输出,所以我需要获取表单的id并正确提交?但是表单没有id,我已在Edit2中附加了屏幕截图,并使用
document.getElementByTagName
更新了答案,以确定表单元素的目标。我设法获取表单并尝试提交,但它返回了错误。我添加了有问题的错误EDIT var val=x.getElementsByClassName(“对话ux”)[0].getElementsByClassName(“模态ux”)[0]。getElementsByClassName(“模态对话框ux”)[0]。getElementsByClassName(“模态ux内部”)[0]。getElementsByClassName(“模态ux内容”)[0]。getElementsByClassName(“身份验证容器”)[0]val.getElementsByTagName(“表单”)[0]。提交()。从错误消息判断,您可能正确调用了窗体的处理程序,但处理程序中出现了错误。但是,当我手动(用手)执行此操作时,我的意思是,当我在输入文本中输入内容并按“授权”时,不会出现错误,我们遗漏了什么吗?所以我需要获得表格的id并提交,对吗?但是表单没有id,我已在Edit2中附加了屏幕截图,并使用
document.getElementByTagName
更新了答案,以确定表单元素的目标。我设法获取表单并尝试提交,但它返回了错误。我添加了有问题的错误EDIT var val=x.getElementsByClassName(“对话ux”)[0].getElementsByClassName(“模态ux”)[0]。getElementsByClassName(“模态对话框ux”)[0]。getElementsByClassName(“模态ux内部”)[0]。getElementsByClassName(“模态ux内容”)[0]。getElementsByClassName(“身份验证容器”)[0]val.getElementsByTagName(“表单”)[0]。提交()。从错误消息判断,您可能正确调用了窗体的处理程序,但处理程序中出现了错误。但是,当我手动(用手)执行此操作时,我的意思是,当我在输入文本中输入某个内容并按“授权”时,不会出现错误,我们是否遗漏了某些内容?
var formElement = document.getElementByTagName('form')[0];
formElement.submit();