>

편집 : botium-webdriverio-connector에서 기본 기능을 재정의하도록 주제 변경

<시간>

버튼 클릭을 트리거하는 방법?

이 링크에서

: https://github.com/codeforequity-at/botium-core/ wiki/Botium-Scripting

그냥 넣어두면된다

#me
BUTTON btnTitle

그러나 실제로 일어난 일은 문자 그대로 BUTTON btnTitle 를 보낸다는 것입니다.  봇에게 텍스트로

상황에 따라, 나는 사용자 정의 WEBDRIVERIO_GETBOTMESSAGE를 구현하고 이것을 다시 보낸다

{
  "sender": "bot",
  "buttons": [
    {
      "text": "reply1"
    },
    {
      "text": "reply2"
    }
  ],
  "cards": [],
  "media": []
}

  • 답변 # 1

    트리거 버튼 클릭은 Botium Core 1.4.8의 일부입니다. 버튼 클릭의 경우 WEBDRIVERIO_GETBOTMESSAGE의 결과는 고려되지 않습니다. Botium은 버튼 제목 만 찾습니다 (기본 셀레늄 선택기가있는 소스 코드는 여기에 있습니다.

    리터럴 텍스트가 봇으로 전송되는 설명 된 동작은 Botium Core의 이전 버전 때문일 가능성이 높습니다. 사용중인 버전을 확인하십시오. 버전 1.4.8을 사용하는 경우 로깅을 활성화하고 로그 출력으로 질문을 확장하십시오.

  • 답변 # 2

    WEBDRIVERIO_SENDTOBOT 기능을 무시하기로 결정했습니다. botium-cli 0.0.44에서 실행되는 경우 최신 버전에는 더 나은 솔루션이있을 수 있습니다.

    <시간>

    편집 : 자세한 내용, 소스 코드 및 구현 추가

    결국, 나는이 기능 WEBDRIVERIO_OPENBOT 를 재정의  와이즈 비즈   와이즈 비즈  갤러리 메시지를 알리기 위해 맞춤 어설 터를 추가

    botium.json

    WEBDRIVERIO_SENDTOBOT
    
    

    ./ actions/open_test

    WEBDRIVERIO_GETBOTMESSAGE
    
    

    ./ actions/send

    {
      "botium": {
        "Capabilities": {
          "PROJECTNAME": "Production Test",
          "CONTAINERMODE": "webdriverio",
          "WEBDRIVERIO_OPTIONS": {  
            "desiredCapabilities": {
              "browserName": "chrome"      
            }
          },
          "WEBDRIVERIO_URL": "the bot url",
          "WEBDRIVERIO_OPENBOT": "./actions/open_test",
          "WEBDRIVERIO_IGNOREWELCOMEMESSAGES": 1,
          "WEBDRIVERIO_SENDTOBOT": "./actions/send",
          "WEBDRIVERIO_GETBOTMESSAGE": "./actions/parse_response",
          "WEBDRIVERIO_START_SELENIUM": true,
          "WEBDRIVERIO_START_SELENIUM_OPTS": {
            "drivers": {
              "chrome": {
                "version": "2.36"
              }
            }
          },
          "ASSERTERS": [
            {
              "ref": "GALLERY",
              "src": "./asserters/gallery",
              "global": true
            }
          ]
        }
      }
    }
    
    

    ./ actions/parse_response

    module.exports = (container, browser) => {
        return browser
            .waitForVisible('#toggle-chat', 20000)
            .click('#toggle-chat') // click chat button
            .pause(2000)
            .waitForVisible('#get-started', 20000)
            .click('#get-started') // click get started, initiate the chat
            .pause(2000)
    }
    
    

    ./ asserter/gallery

    
    module.exports = (container, browser, msg) => {
        if (msg.messageText && msg.messageText !== '' && msg.messageText.indexOf('BUTTON') !== 0) { // send text message
            return browser
                .waitForEnabled('#text-input', 10000)
                .setValue('#text-input', msg.messageText)
                .keys('Enter')
        } else if (msg.messageText.indexOf('BUTTON') === 0) { // if message started with "BUTTON xxx", safe to assume the tester want to click button xxx
            let buttonTitle = msg.messageText.split(' ')[1]
            if (!buttonTitle) throw new Error('BUTTON invalid (1)')
            return browser.waitForEnabled(`[chatmessagebuttontitle="${ buttonTitle }"]`, 10000)
            .click(`[chatmessagebuttontitle="${ buttonTitle }"]`)
        } else { // unhandled, send arbitary message
            return browser
                .waitForEnabled('#text-input', 10000)
                .setValue('#text-input', 'unhandled')
                .keys('Enter')
        }
    }
    
    

    그런 다음 사용자 정의 어설 터를 사용하십시오. testgallery.convo.txt

    module.exports = (container, browser, elementId) => {
        const botMsg = { sender: 'bot', buttons: [], cards: [], media: [] }
        /**
        *
        * ... parsing some html here to populate buttons, media and cards
        * ... can't put all the code for security reasons, sorry
        * ... here are example
        *
        * btw, elementId is NOT an html id attribute, so cannot query with "#" + elementId
        * cannot find documentation for webdriver elementId, but this page helps
        * http://v4.webdriver.io/api/protocol/elementIdElements.html
        *
        */
        browser.elementIdElements(elementId, '.bot-bubble')
        .then(elements => elements.value)
        .then(elements => 
            Promise.all(
                elements.map(element => 
                    browser.elementIdText(element.ELEMENT).then(text => text.value)
                )
            ).then(messages => {
                // i only need the first message, also this function only called for each bot message bubble, so safe to assume there is only 1 message
                if (messages.length > 0) botMsg.messageText = messages[0] 
                // send the bot response back to botium
                container.BotSays(botMsg)
            })
        )
    }
    
    

    이 설정은 botium-cli 버전 0.0.44에서 작동합니다. botium 0.0.45로 업데이트하려고했지만 셀레늄 드라이버에서 오류가 발생했습니다

    /** * @typedef Card * @property {String} image * @property {String} title * @property {String} subtitle * @property {Array<String>} buttons * * @typedef BotMesage * @property {Array<Card>} cards */ /** * @typedef GalleryAssertStepParam * @property {*} convo * @property {Array<String>} args * @property {BotMesage} botMsg */ module.exports = class GalleryAsserter { /** * this function is called whenever parse_response.js finishes * @param {GalleryAssertStepParam} param */ assertConvoStep(param) { let args = param.args let botMsg = param.botMsg // args needs to be an array, simple check if (!args.concat) return Promise.reject(new Error('args for GALLERY is not an array')) if (args.length > botMsg.cards.length) return Promise.reject(new Error('number of gallery cards doesnt match. expecting ' + args.length +'. Got ' + botMsg.cards.length)) // basic logic to check if the card that is passed from parse_response.js is equals to card that is written in test scripts for (var i = 0; i < args.length; i++) { // ParseGalleryString is a function that convert arbitary string to a Card object // example of the arbitary string: "( title=some title, subtitle= some subtitle, image=image url, buttons=btn1, btn2, btn3 )" // will be converted to JSON { title: "some title", subtitle: "some subtitle", ... } let card = ParseGalleryString(args[i]) let testcard = botMsg.cards[i] if (card.image !== testcard.image) return Promise.reject(new Error(`card[${i}] doesn't pass. expecting image to be ${ card.image }, got ${ testcard.image }`)) if (card.title !== testcard.title) return Promise.reject(new Error(`card[${i}] doesn't pass. expecting title to be ${ card.title }, got ${ testcard.title }`)) if (card.subtitle !== testcard.subtitle) return Promise.reject(new Error(`card[${i}] doesn't pass. expecting subtitle to be ${ card.subtitle }, got ${ testcard.subtitle }`)) if (card.buttons.length !== testcard.buttons.length) return Promise.reject(new Error(`card[${i}] doesn't pass. expecting ${ card.buttons.length }(${card.buttons.join(', ')}) buttons, got ${ testcard.buttons.length }(${testcard.buttons.join(', ')})`)) if (card.buttons.join('_') !== testcard.buttons.join('_')) return Promise.reject(new Error(`card[${i}] doesn't pass. expecting buttons to be ${ card.buttons.join(', ') }, got ${ testcard.buttons.join(', ') }`)) } return Promise.resolve() } }

  • 이전 ssh - Linux에서 사용할 반복 루프 목록을 문자열로 변환하는 방법
  • 다음 python - Flask에서 py 스크립트를 호출하는 방법