Headless Robot Framework

แต่ก่อนตอนรัน robot framework ทดสอบเว็บทีไร หน้าจอ browser ก็จะเปิดกันพรึ่บพรั่บ จนไปได้เทคนิคจากดิวมา 2 ท่าคือ โยนไปรันใน docker hub กับ รันใน xvfb (X virtual framebuffer) ไม่งั้นก็ต้องหนีไปใช้ phantomjs ที่เป็น headless browser โดยกำเนิด แต่ปัญหาคือ target user ไม่ได้ใช้ phantomjs เลยต้องกลับไป focus ที่ browser หลัก ๆ อย่าง chrome หรือ firefox

จนมาหลัง ๆ ก็เห็นว่า chrome ตั้งแต่ version 59 มีความสามารถ headless ออกมาให้ใช้ ก็ไปได้สูตรในการเรียกใช้ chrome แบบ headless มา เอาไปลอง run บน server แล้ว โอเคเลยทีเดียว

ล่าสุด ก็เพิ่งเห็นว่า firefox ก็ทำได้เหมือนกัน เลยไปหาวิธีจนทำให้ robot framework สามารถใช้งาน firefox แบบ headless ได้

อันนี้ของ chrome จุดสำคัญคือตรง chrome options ต้องใส่ทั้ง headless และ disable-gpu ไอ้ตัว disable-gpu มีเพื่อปิดไม่ให้ chrome พยายามไปใช้ gpu lib บางตัว โดยไม่จำเป็น  ถ้าเปิดไว้ แล้วใส่แต่ headless มันจะมี error เกี่ยวกับ gpu lib พ่นออกมาเต็มไปหมด

*** Variables ***
@{CHROME_OPTIONS}    headless    disable-gpu

*** Keywords ***
Open Headless Browser
    [Arguments]    ${url}
    ${options}=    Set Chrome Options
    Create WebDriver    Chrome    chrome_options=${options} 
    Go To    ${url}

Set Chrome Options
    ${options}=    Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
    : FOR    ${option}    IN    @{CHROME_OPTIONS}
    \    Call Method    ${options}    add_argument    ${option}
    [Return]    ${options}

ส่วนอันนี้ของ firefox จุดที่น่าสนใจอีกอย่างของ firefox คือ ใน option ที่เขียนว่า headless ใน firefox ต้องใส่ – นำหน้าด้วย แต่ใน chrome ไม่ต้อง

*** Variables ***
@{FIREFOX_OPTIONS}    -headless

*** Keywords ***
Open Headless Browser
    [Arguments]    ${url}
    ${options}=    Set Firefox Options
    Create WebDriver    Firefox    firefox_options=${options} 
    Go To    ${url}

Set Firefox Options
    ${options}=    Evaluate    sys.modules['selenium.webdriver'].firefox.options.Options()    sys, selenium.webdriver
    : FOR    ${option}    IN    @{FIREFOX_OPTIONS}
    \    Call Method    ${options}    add_argument    ${option}
    [Return]    ${options}

ทั้งสองวิธีข้างบน มันจะไปเอา browser ที่อยู่ในเครื่องมาใช้เลย ถ้าใช้แบบ portable หรืออยากระบุ binary ให้ไปใช้ตัวอื่น ก็ต้องทำเพิ่ม

อันนี้ของ chrome

*** Variables ***
@{CHROME_OPTIONS}    headless    disable-gpu
${CHROME_BINARY}    /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome

*** Keywords ***
Open Headless Browser
    [Arguments]    ${url}
    ${options}=    Set Chrome Options
    ${options.set_binary}=    Set Variable    set_binary=${CHROME_BINARY}
    Create WebDriver    Chrome    chrome_options=${options} 
    Go To    ${url}

Set Chrome Options
    ${options}=    Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
    : FOR    ${option}    IN    @{CHROME_OPTIONS}
    \    Call Method    ${options}    add_argument    ${option}
    [Return]    ${options}

ส่วนอันนี้ของ firefox

*** Variables ***
@{FIREFOX_OPTIONS}    -headless
${FIREFOX_BINARY}    /Applications/Firefox.app/Contents/MacOS/firefox

*** Keywords ***
Open Headless Browser
    [Arguments]    ${url}
    ${options}=    Set Firefox Options
    Create WebDriver    Firefox    firefox_binary=${FIREFOX_BINARY}    firefox_options=${options} 
    Go To    ${url}

Set Firefox Options
    ${options}=    Evaluate    sys.modules['selenium.webdriver'].firefox.options.Options()    sys, selenium.webdriver
    : FOR    ${option}    IN    @{FIREFOX_OPTIONS}
    \    Call Method    ${options}    add_argument    ${option}
    [Return]    ${options}

 

Leave a Reply