第十六章:Katalon使用AutoIT进行身份验证

不知道有没有小伙伴遇到过Katalon内置关键字Authenticate无法使用的场景,这种情况下,我们可以使用autoIT来通过验证,同时我们还可以用AutoIT解决一些Katalon处理不了的其它场景。

关键字Authenticate不工作?
关键字Authenticate是一个Katalon的内置关键字,用于通过网页上的身份验证窗口,窗口大概长这样:

其用法如下:
WebUI.authenticate('http://the-internet.herokuapp.com/basic_auth', 'admin', 'admin', 12)
此关键词会执行三步操作:
导航到执行的网页地址
在身份验证框中输入用户名及密码
提交信息通过验证
但是公司的小伙伴告诉John,在访问一个后台地址时,遇到了页面根本无法展示,同时不会有验证窗口显示的情况,如下图:

John经测试后发现如果使用WebUI.navigateToUrl访问页面则验证窗口正常展示,但是这种情况下我们没有办法输入用户名密码。
那么我们是否可以先导航到该页面展示了验证窗口再通过Java的robot来实现输入用户名及密码并提交的操作呢?于是John在CustomerKeyword中加了一个方法,代码如下:
import com.kms.katalon.core.webui.exception.WebElementNotFoundException
import java.awt.Robot
import java.awt.Toolkit
import java.awt.datatransfer.StringSelection
import java.awt.event.KeyEvent

public class Authenticate {
  @Keyword
  def loginAuthenticate(String username, String password) {
    Robot robot = new Robot();
    robot.setAutoDelay(3000);

    StringSelection ss = new StringSelection(username);
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss,null);
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_TAB);

    ss = new StringSelection(password);
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss,null);
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_TAB);
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);
  }
}
代码实现的功能如下:

  • 设置了两个参数username和password
  • 将username参数的值加入剪贴板
  • 按住Control+V键并释放键盘
  • 按住Tab按键并释放键盘(用于切换到密码输入框)
  • 将password参数的值加入剪贴板
  • 按住Control+V键并释放键盘
  • 按住Tab按键并释放键盘(用于切换到提交按键)
  • 按住Enter键并释放

John满怀着期待的心情对这个方法进行了调用,代码如下:
CustomKeywords.'tools.Authenticate.loginAuthenticate'('username', '123456')
看控制台一切执行的都没有任何问题,如图:

Note:这里要说明一下,大家看到的黄色警告标志是因为实际上navigate这个操作并没有完成,因为有验证窗口存在,John估计将FailureHanding改成了OPTIONAL让程序继续下一步,否则会直接结束case。
但是页面上仍然没有过验证,跳转到了一个空白页面,如图:

很遗憾,这样的方法并没有解决我们的验证问题,由于时间紧迫,John并不打算深究其原因,于是寻找新的解决方案。在官网John找到这样一篇文档,因为平台限制我放成代码:
https://docs.katalon.com/katalon-studio/docs/using-autoit-for-authentication-in-katalon-studio.html
大意是说Katalon Studio中的WebUI.authenticate关键字在Firefox浏览器上运行良好,但由于未知原因,该功能可能无法在其他浏览器上运行。并推荐了AutoIT。

什么是AutoIT?
AutoIT是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。而这是其它语言不可能做到或无可靠方法实现的(例如VBScript和SendKeys)。

如何使用AutoIT通过身份验证?
第一步:在本地安装AutoIT, 下载地址如下
https://www.autoitscript.com/site/autoit/downloads/
我们选择完全安装,因为比较简单,不用单独再去下载写脚本的IDE,如图:

下载下来后一路下一步就可以了。
第二步:打开AutoIT的编辑器,我们在Win搜索框中输入 SciTE并搜索,如图:

第三步:编写通过身份验证的脚本,代码如下:
WinWaitActive("","Authentication Required","10")
WinFlash("", "Authentication Required",4,500)
If WinExists("","Authentication Required") Then ;如果存在身份验证
  Send("admin") ;输入用户名
  Sleep(10)  ;等待0.01秒
  Send("{TAB}") ;发送Tab键
  Send("123abcABC") ;发送密码
  Send("{ENTER}") ;提交信息
ElseIf WinExists("","Chrome Legacy Window")Then
  Send("admin")
  Send("123abcABC")
ElseIf WinExists("","Windows Security") Then
  Send("admin")
  Send("123abcABC")
EndIf
Note:这里有个坑要说明一下,如果你完全按照官网给的代码写的话,极大可能仍然通不过验证,你会发现用户名和密码都输入在了一个输入框内,且密码少了第一个字符,这是因为Tab键操虽然执行了,但并没有成功切换输入框,John百撕不得其姐后,默默的加了一句sleep(10)。
第四步:保存脚本文件为.au3格式,如图:

上一页12下一页


留言