feature-image-robot-framework-in-action-tricks
feature-image-robot-framework-in-action-tricks

หลายๆคนที่ได้อ่าน Robot Framework 101 สําหรับมือใหม่ ไปแล้วก็คงจะพอเข้าใจโครงสร้างหลักๆของ Robot Framework แล้วล่ะ เพียงแต่พอลงมือทําจริงๆมันไม่ได้ง่ายอย่างนั้นน่ะสิ

เวลาพอถึงหน้างานจริงๆ เราจะต้องมาสร้าง Logic ในการหาจับ Element ต่างๆเอง ซึ่งหลักๆเลยก็คงไม่พ้นการแมนเนตโค้ดของเรานั้นเอง

  • Clean Code
  • Resuable

ฟังแล้วอาจจะตลกว่าเขียน Robot Framework ทําเทส จะสนใจเรื่องพวกนี้ทําไม แต่พอถึงเวลาที่เราเขียนเทสกับ Application จริงๆจะเข้าใจว่า Keywords, Variables, Settings และ Library ต่างๆเป็นเรื่องที่ปวดหัวมาก เพราะมันจะบวมขึ้นเรื่อยๆๆและแตกในที่สุด (สมองเราน่ะแตกตาย)

ดังนั้น Tips เล็กๆที่จะมาแนะนําในการลงมือทําจริงๆก็จะมีเรื่องต่อไปนี้

  1. For Loop
  2. For Loop & Nested If
  3. Nested For Loop
  4. WebElements Mapping
  5. Asssign ค่า Elements
  6. การ Incremental ตัวแปร
  7. การเว้นบรรทัดโค้ดเมื่อยาวเกินไป
  8. การดึง Elements ใสใน List
  9. Log Variables ทั้งหมด
  10. การ Get Attribute ของ WebElement
  11. Run Keyword And Ignore Error
  12. Return From Keyword
  13. Call Method

For Loop

ยิ่งฟังดูเหมือนตลก…แต่ For Loop แบบที่เราคุ้นเคยกันเวลาเขียนโปรแกรม ไม่มีใน Robot Framework น่ะจร้าาา

จะมา for(int i = 0;i<10;i++) อะไร ไม่มี๊ #เสียงสูง

example-java-for-loop
example-java-for-loop

สิ่งที่ Robot Framework มีก็คือ

example-for-loop-robotframework
example-for-loop-robotframework

งงเลยปะล่ะ! รูปแบบนี้ คือ for-loop ใน robot framework นั้นเอง (ตัวอย่างคือวนลูป 1 ถึง 3)

เนี่ยเวลาใช้งาน มันมีรูปแบบการวนลูปที่หลากหลาย เช่น

  • IN RANGE
  • List of elements เช่น @{elements}
  • etc.

ไปอ่านเพิ่มเติมที่นี้ Robot Framework Loop มันยังมีอกหลายอย่างให้ใช้ แต่ๆหลักวนใน list อะใช้บ่อยสุดล่ะ

For Loop & Nested If

โดยปกติเราใช้มาก็จะไม่พ้น

example-java-for-loop-with-break
example-java-for-loop-with-break

ก็มักจะเป็นแบบนี้กันไปในสไตล์ Java

แต่ถ้ามาของ Robot Framework ต้องปรับหัวนิดหน่อย เพราะมันเป็น ATDD ทําจาก Keywords เลยจะเป็น

example-robotframework-exit-for-loop-keyword
example-robotframework-exit-for-loop-keyword

เห็นไหมว่ามันจะใช้ Keyword ว่า “Run Keyword If” หรือมีค่าเท่ากับ “If” นั้นเอง แต่อย่าหลงระเริงไป แล้วใส่ Keyword อื่นๆเข้าไปอีกเยอะน่ะ เพราะเวลาเราทํา Robot Framework เราต้องคํานึงถึงเสมอว่ามันจะรับกี่ arguments ต่อ Keyword

ในกรณีนี้ Run Keyword If จะรับแค่ 3* เท่านั้น เราจะไปใส่ Keyword เพื่อให้มันทํางานต่อๆกันไม่ได้ (อ่านต่อที่นี้ Robot Framework “Run Keyword If”)

แล้วงี้เราจะทําไงล่ะ? ถ้าต้องการให้ทํางานแบบ Java ด้านล่าง

example-java-loop-with-nested-if
example-java-loop-with-nested-if

วิธีมัน tricky หน่อย แต่เราจะใช้ท่านี้กัน

robotframework-nested-keyword-in-if
robotframework-nested-keyword-in-if

งงไหม? บอกเลยว่างงแน่ๆครั้งแรก….

คืออย่างที่บอกว่าเวลาใช้ Keyword ต้องสังเกตุว่ามันรับ Arguments กี่ตัว? ในที่นี้ “Run Keyword If” มันรับแค่ 3 เราเลยต้องไปใช้ “Run Keywords” ที่มันรับ Arguments ไม่จํากัด แล้วใช้ AND เป็นตัวเชื่อม! ด้วยวิธีนี้เราก็จะสามารถส่งต่อ Keyword ไปได้เรื่อยๆแบบ Sequential

จริงๆยังไม่พอกับเรื่อง Run Keyword If เราสามารถใช้มันทํา If-else แบบธรรมดาไม่ต้องอยู่ในโน For-Loop ได้ด้วย เช่น

if-else-robotframework-example
if-else-robotframework-example

Nested For Loop

อีกอย่างนึงที่เราชอบใข้กันคือเรื่องของ For-loop ซ้อน For-loop เพื่อจัดการงานบางอย่าง

แต่ใน RobotFramework ไม่สามารใช้ For-loop ตรงๆแบบ Java ได้

java-nested-for-loop
java-nested-for-loop (https://mathbits.com/MathBits/Java/Looping/NestedFor.htm)

แต่วิธีการของเราคือต้องแยก Keyword ออกมาต่างหาก แบบตัวอย่างข้างล่าง

robotframework-nested-for-loop
robotframework-nested-for-loop

จะเห็นว่าเรามี Keyword Handle Table แล้วเราก็แยกจัดการกับ Row และ Cell ลงไป 🙂 แยก Keyword ลงไปเรื่อยๆๆๆๆ ไปเรื่อยๆคือ technique ของ robot framework

Web Element Mapping

เทคนิคตัวนี้ไม่ได้อยากอะไร แค่อยากจะให้ระลึกถึงเรื่องของการ Mange Code ไว้ การแยกตัวแปรออกมาเพื่อให้เกิด Reuse able มากที่สุด

webelement-mapping-in-robotframework
webelement-mapping-in-robotframework

เจ้านี้ก็เหมือนกัน เราแยกไฟล์ออกมาไฟล์นึงเป็น Resources ไฟล์ แล้วสร้าง Dictionary ที่ key map พวกชื่อ Div และ Xpath ไว้ จะได้ reuseable มากที่สุด แบบตัวอย่างด้านล่าง

Assign ค่า Elements ต่างๆ

คือตัวนี้ไม่ได้ยากอะไร เพียงแต่ไม่อยากให้ลืมว่า Robot Framework และ python มันดู Indent เป็นหลัก

เราต้องสร้างตัวแปร

set-variable-robotframework
set-variable-robotframework

ต่างกันแค่เว้นวรรคเล็กๆเนี่ย เล่นเอาเครียดเลยน่ะอยากจะบอก!

เวลาเราไปอ่าน Document ของ Robot Framework ก็สังเกตุด้วยว่ามันเป็น Return Value กลับมารึเปล่า เพราะถ้า Return กลับมา เราสามารถสร้างตัวแปรรับค่าได้เลย เช่น  Get Text ลองกดไปอ่านดูได้มันจะเขียน “Returns the text value of element identified”  เราก็แค่สร้างตัวแปรรับแบบนี้

get-text-element-return-rbotframework
get-text-element-return-rbotframework

การ Incremental ตัวแปร

ทริคเล็กๆน้อยว่าอย่าลืมน่ะ ว่าเราจะไปใช้แบบ Java ไม่ได้

java-incremental-in-loop
java-incremental-in-loop

ไรแบบนี้ทําไม่ได้ เราต้องสร้างตัวแปร แล้วบวกในตัวแปรเลย

robotframework-manage-index-manually
robotframework-manage-index-manually

เป็นต้น

การเว้นบรรทัดของโค้ดเมื่อยาวเกินไป

ปกติเวลาเราใช้ Keyword เนี่ย โค้ดมันจะยาวมากๆๆ ยาวเกินไปด้วยซำ้ เพราะฉะนั้นวิธีเว้นบรรทัด มันก็มีเทคนิคของมันคือ ใช้ ไข่ปลา! อร่อยมาก! ไม่ใช่เว่ย ใช้ “…” ในการเว้นบรรทัด เช่น

robotframework-long-form
robotframework-long-form

อ่านบทความจริงที่นี้ Robot Framework Dividing Test data

การดึง Elements ใสใน List

เทคนิคสุดเจ๋งเลยในการจัดการกับ Element ต่างๆ โดยมีให้ใช้ตั้งแต่ version 1.7 ขึ้นมาคือ เราจะมอง ก้อนต่างๆบนหน้าเว็ปเป็น Web Elements และ เป็น instance ก้อนๆนึงที่แทน object และจะมีค่าพวก Attributes ต่างๆ ของก้อนนั้นทั้งหมด

โดยเราสามารถใช้ได้โดยการใช้คําสั่ง

get-web-element-robotframework
get-web-element-robotframework

โดยมันจะส่งกลับให้เราโดยมองว่าเป็น List ของข้อมูล แล้วเราค่อยนําไปวนลูปที่หลังได้เลย โดยใช้คําสั่ง

robotframework-get-attribute-from-webelement
robotframework-get-attribute-from-webelement

ตัวอย่างข้างบนคือ เมื่อได้ค่า WebElements มาแล้ว เราก็จะทําการดึง Attribute ของมันออกมาด้วยคําสั่ง get attribute ซึ่งกรณีนี้ใช้ในกรณีที่ต้องการจะดึงค่าอื่นๆที่ไม่ใช่ Get Text หรือ Get Attribute ออกมา

โดยทริคนิดนึงคือมันไปผูกกับ selenium.webdriver นั่นเอง เราสามารถดูคําสั่งทั้งหมดได้ที่นี้ (เพราะมันเป็น WebElements นิเนอะ)

Log Variables ทั้งหมด

การใช้ Keywords Log Variables ทั้งหมดเป็นอีกเทคนิคนึงที่ดีเลย เพราะเวลาเราจัดการกับ multiple file ทั้งหลายเนี่ย มันมักจะมี Variables ของ ไฟล์อื่นๆมาปนกัน current scope ด้วย เพราะฉะนั้นถ้าเรา Log ออกมาเนี่ย จะเห็นหมดเลยว่ามีอะไรบ้าง และ debug ได้ง่ายขึ้นมากๆ

example-of-robotframework-log-variables
example-of-robotframework-log-variables

การ Get Attribute ของ WebElement

เวลาเราเขียนเทสเพื่อทดสอบระบบต่างๆเนี่ย นอกจากพวก Text ของ element นั้นๆ เราก็มักจะทําการดึงค่า Value ของมันออกมาใช้ หรือ title ของ element นั้นๆเอง

robot-framework-get-value-of-elements
robot-framework-get-value-of-elements

แต่ตัวหลักๆจริงๆที่เราควรรู้จักก็คือตัวครอบจักวาลก็คือ “Get Element Attribute” เพราะว่าตัวนี้จะสามารถดึงค่า Element ทุกตัวออกมาได้เลย ขอเพียงให้เราส่งชื่อ Attribute นั้นไปให้มัน เช่น

robotframework-standard-get-web-attribute
robotframework-standard-get-web-attributes

ซึ่งจริงๆโดยส่วนตัวก็ยังรู้สึกว่ามันยุ่งยากเกินไป จริงๆแล้วเราควรทําให้ง่ายกว่านี้ ดังนั้นเราเอามาเขียนใหม่ใน Robot ก็จะได้แบบนี้

example-of-get-web-element-with-locator
example-of-get-web-element-with-locator

จากตัวอย่างจะเห็นได้ว่า เราส่ง locator กับชื่อ attribute_name ที่เราต้องการเข้ามา แล้วก็ใช้คําสั่ง Evaluate เพื่อให้มันทํางาน python expressions ได้ และดึงค่าของ web elemenet ออกมา โดยทําเป็น keyword แยกไว้เพื่อเรียกใช้

Noted:

  • method ที่ใช้ get_attribute คือมาจาก selenium-python ดูจากที่นี้ได้
  • เหตุผลที่ $elem.get_attribute สามารถ acces variables โดยไม่ใส่ curly braces เป็นเพราะ feature ของ robot framework 2.9 ขึ้นมานั่นเอง ที่ทําให้เราไม่ต้องมานั่งใส่ quote “${output}” เพื่อทํา expressions สําหรับ string อีกแล้ว แต่สามารถ access ตรงๆได้เลย เช่น $ouput รายละเอียดเพิ่มเติมที่นี้เลย หัวข้อ Evaluating expressions
    before-robot-framework-2.9-evaluating-expressions
    before-robot-framework-2.9-evaluating-expressions

    after-robot-framework-2.9-evaluating-expressions
    after-robot-framework-2.9-evaluating-expressions

ดังนั้นเราจะใช้วิธีไหนก็ได้ที่จะดึง Attribute ออกมาตามแล้วแต่เราสะดวกได้เลย

Run Keyword And Ignore Error 

เทคนิคสุดลำ้สำหรับในการจัดการกับ scenarios แบบต่างๆ ที่เราควรจะรู้จัก คือ Keyword ตัวนี้เลย สิ่งที่มันทําคือ Run Keyword ที่เราเลือกไว้ และไม่ต้องสนใจ Error ที่เกิดขึ้น

ฟังดูแล้วแปลกๆ แล้วจะปล่อย Error ไปทําไม ไม่จัดการมันละ……จริงๆแล้วถ้ามองในมุมโปรแกรมมิ่งแบบ Java ก็คือการจัดการ exception นั่นแหละ เพียงแค่ใน Robot Framework ใช้ keyword นี้เป็นตัวควบคุม

keyword-robot-framework-run-keyword-and-ignore-error
keyword-robot-framework-run-keyword-and-ignore-error

สิ่งที่ทําคือมันจะ Return Value กลับมา 2 ตัวคือ

  1. ตัวแรก Status ที่เป็นผลของการรัน Keyword นั้น จะได้ออกมาเป็น “PASS” หรือ “FAIL
  2. ตัวที่สอง Return หรือผลลัพธ์ของการรัน Keyword ที่กําหนดนั้นเอง

เพราะฉะนั้นท่านี้เหมาะมาก เมื่อเจอเงื่อนไขที่จําเป็นในการควบคุม Exception ที่อาจจะเกิดขึ้นกับ Keyword นั้นๆได้

Return From Keyword

เทคนิคในการ return เพื่อให้จบ Loop หรือ Keyword ใดๆเลย โดยไม่ต้องรอให้ทํางานครบก่อนเหมือน continue for loop

return-from-keyword-exit-keyword-immediately
return-from-keyword-exit-keyword-immediately

Keyword ตัวนี้จะค่อนข้างจําเป็นมากๆเมื่อเวลาจัดการกับ Loop เลยละ เพราะเมื่อมันตรง condition ใดๆ เราสามารถให้มันจบ Loop นั้นๆ และส่งค่ากลับออกมาได้เลย (เราสามารถใช้ Tag [Return] แบบนี้ในการจัดการส่งค่ากลับก็ได้ แต่ไม่สามารถใช้ในลูปได้น่ะ)

Call Method

พอดีไปเจอเจ้าตัวนี้ตอนที่กําลังตั้งค่าขอ chromedriver เพื่อให้มันรับ argument เพิ่มจาก robotframework ได้ เลยคิดว่าน่าสนใจที่ต้องรู้ไว้

robotframework-call-method-built-in
robotframework-call-method-built-in

เจ้า Keyword นี้มันจะทํษหน้าที่ในการไปเรียก method จาก object ใดๆที่เราสร้างขึ้นมาได้ เปรียบเสมือนเราไป object ฒันตรงๆเลย ในตัวอย่างที่ผมจะทําคือ ส่ง arguments ให้ Chromedriver นั้นเอง

example-call-method
example-call-method

จะเห็นว่ามัน call method จาก object ที่สร้าง chromedriver ขึ้นมาเลย 🙂 ทีนี้เราก็เรียกและส่ง arguments –disable-web-security ไป เพื่อให้มันสามารถทํา cross origin ได้นั้นเอง

สรุปแล้ว

Robot Framework มีประโยชน์มากๆ เมื่อเอามาใช้งานจริง มันมีการ Integrate เข้ากับหลายอย่างมาก Jenkins ยังได้เลย แต่เราควรที่จะจําทริคเล้กๆน้อยๆเวลาไปใช้งานจริง เพราะเวลาใช้จริงๆ จะมีปัญหาจุกจิกเยอะแยะ แบบที่อธิบายไปนี้นเอง ลองอ่านดูครับ จำได้ก็ดี จำไม่ได้ก็อ่านใหม่ เพราะทริคพวกนี้มีประโยชน์มาก

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.