Blur ใน Robot Framework

มีโจทย์ว่า input text ในเว็บแอพ เวลา on blur ให้มันไปทำการ validate ข้อมูลใน input นั้น ถ้าไม่ถูกต้องก็แสดง error message ด้วยความที่ไม่รู้ ตอนที่อยากทำให้เกิด event on blur ก็ใช้วิธีเอาสีข้างแถ ๆ ไป

แบบนี้

*** Keyword ***
Remove Focus
    Click Element    tag=body

ตั้งใจไว้ว่า เลียนแบบพฤติกรรมตัวเองเลย คือคลิกมันที่ body ตรงไหนก็ได้ focus ที่เคยอยู่ใน input text จะต้องทำให้เกิด onblur แน่นอน และมันทำงานได้อย่างที่อยากจะให้มันเป็นจริง ๆ

ข้อดีคือ มันไม่ต้องบอก Keyword ว่า จะ blur กับ element ไหน ก็คลิกที่ body อันไหนที่มัน focus อยู่ ก็เกิดที่นั่นแหละ แต่ปัญหามันก็เกิดตรงที่ เวลามันคลิก มันคลิกตรงไหนไม่รู้ ซึ่งเราควบคุมไม่ได้ และบังเอิญปัญหานี้มาเกิดตรงที่ มันดันไปคลิกตรงที่มัน focus อยู่ มันเลยไม่เกิด event onblur ตามที่ตั้งใจ

เพราะ body มันทำหน้าที่เป็น container การคลิกของที่อยู่ใน container มันโดนที่ของ ไม่ได้โดนที่ container วิธีนี้มันเลยใช้ได้บ้างใช้ไม่ได้บ้าง เลยไปสืบเพิ่มเติมมาจนได้ว่า เฮ้ย จริง ๆ มันมีวิธีอยู่ นั่นคือ Keyword ที่ชื่อ Simulate Event (เดิมชื่อว่า Simulate เฉย ๆ แต่ตอนนี้ยกเลิกไปแล้ว)

วิธีใช้ Simulate Event ตามใน documentation มันบอกว่า Simulate Event รับ parameter 2 ตัวคือ locator กับ event นั่นคือ เวลาอยากจะให้มัน blur ก็ต้องใช้ประมาณนี้

    Simulate Event    ${locator}    blur

แต่มันต้องส่ง locator ไปด้วยทุกครั้ง แต่ใจจริงไม่อยากส่ง คือตอนนี้ focus ตัวไหนอยู่ก็ส่งตัวนั้นเลยเหอะ เลยใช้ไอเดียว่า หา locator ของ element ที่ถูก focus อยู่ เสร็จแล้วส่งไปเป็น locator ไง เลยออกมาท่านี้

*** Keywords ***
Remove Focus
    ${element}=    Get Focused Element
    Simulate Event    ${element}    blur

Get Focused Element
    ${activeElement}=    Execute JavaScript    return window.document.activeElement;
    [Return]    ${activeElement}

วิธีเรียกใช้ก็ง่ายโคตร แค่เรียก Remove Focus มันก็จะไป trigger event on blur ที่ element ที่ถูก focus อยู่ให้ทันที

อ้างอิง

Leave a Reply