如何从赛普拉斯测试中调用第三方网站以获取验证码图像的文本?

时间:2018-09-13 00:41:37

标签: javascript cypress

我需要获取“验证码”图像的文本并进行计算,然后在提交表单时在文本字段中输入值。我发现有一个第三方库可以做到这一点。我的问题是如何在赛普拉斯测试中调用第三方库(https://somesite)?还是有其他简单的方法可以使用javascript获取验证码图片,有人可以建议如何实现吗?

describe('Check the submission of form', function() {
      it.only('Verify the submission of form', function() {
        const getCaptcha = () => {      
            // How to call the third party url here or some where ???
            return text  // these text retured are numbers and this look like '35+12 =?'
          }
         cy.visit("testUrl")
         cy.wrap({ name: getCaptcha })   
         cy.get('input[name="textinput1"]').type('Mazda')
         cy.get('input[name="textinput2"]').clear().type('Axela')
         ....// rest of the code 
      })
    })

1 个答案:

答案 0 :(得分:1)

如果我的理解正确,您想访问一个使用验证码的您控制的网站,获取捕获的图像,然后将其发送给第三方API来解决该验证码,然后继续登录该网站。

您可以使用cy.request来调用第三方API:

cy.request('POST', 'http://somesite', body).then((response) => {
    // do something with response.body
})

要从登录屏幕获取验证码图片,可以使用类似以下内容的

describe('my website', () => {
    it('should accept typing after login', () => {
        cy.visit('testURL')
        cy.get('a selector to target your #captcha img').then((captchaImg) => {
            // Now you will have the captcha image itself
            const body = { captchaImg } // prepare the body to send to the 3rd party API
            cy.request('POST', 'http://somesite', body).then((response) => {
                // Process the response to extract the field that you are interested in
                // For instance, you could pull out the string '55+20='
                let captchaText = getCaptchaText(response.body)
                let captchaAnswer = getCaptchaAnswer(captchaText)
                cy.get('captcha text input field').type(captchaAnswer)
                // You will probably need to click a submit button

                // Test the site here, now that you have logged in
                cy.get('input[name="textinput1"]').type('Mazda')
                // assert something
                cy.get('input[name="textinput2"]').clear().type('Axela')
                // assert something else     
            })
        })
    })
})

每次测试都执行此额外请求会大大降低测试速度。因此,最好先测试一次登录流程,然后尝试其他方法绕过网站的其余测试步骤。至少,您可以尝试将与验证码相关的测试逻辑放入before挂钩中,然后运行一系列测试。

赛普拉斯出于某些原因,建议不要在测试中访问第三方网站,这些原因记录在this answer中。并且他们还建议您对不受控制的网站进行测试。但是,可以使用cy.request来访问第三方API。