เคยไหม… ที่พยามเช็ค state ของ element โดยใช้ฟังชันเช่น
browser.isEnabled('div.#login-id');
แต่ทว่า… เช็คยังไงก็ได้ true, ทั้งๆที่ตาเรามันฟ้องว่ามัน disabled อยู่เห็นๆ.
หลังจากเสียเวลากับมันสองวันเต็มๆ, ก็ตัดสินใจล้วงลึกเข้าไปที่ chromedriver โดยไม่ผ่าน WebDriverIO.
เครื่องมือและเอกสารที่ใช้
หาได้ตามกูเกิ้ล.
WDIO
netstat
Postman
https://www.w3.org/TR/webdriver1/#dfn-find-element
https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelementidenabled
ขั้นตอน
เราก็รันเทสของเราไปตามปกติ. จนมันเปิด browser และเปิด app ของเรา.
เราต้องหา sessionID ที่เทสของเราเปิดไว้.โดยใช้โปรแกรมดังนี้.
let ssid = '';
await browser.sessions().then((sess) => {
sess.value.forEach((ses) => {
ssid = ses.id;
});
});
console.log('SessionID : ' + ssid);
เมื่อเราได้ sessionID มา, ให้เราไปหาว่า webdriver ของเราเปิด service ไว้ที่ไหน. สามารถใช้ netstat เพื่อดูว่าเราเปิด port อะไรไว้มั่ง.
netstat -a | grep "LISTEN"
จากนั้นก็สุ่ม port ไปทีละอัน โดยเปิด URL ใน web browser เลย. ตัวอย่างข้างล่างสุ่ม port หมายเลข 9515.
http://localhost:9515/wd/hub/session/:sessionId/element/xxx/enabled
ถ้าเจอเข้ากับ chromedriver service, มันจะตอบกลับมาว่า
{"sessionId":":sessionId","status":6,"value":{"message":"no such session\n (Driver info: chromedriver=2.29 (8e8216e581c512667203931f81c1a1ead47222e5),platform=Mac OS X 10.14.1 x86_64)"}}
คราวนี้เราเปิด Postman.
เริ่มต้นจากการหา element. ให้ใช้สร้าง POST request.
URL: http://localhost:<port ที่เราได้มาจาก step 3-4>/wd/hub/session/<sessionID ที่เราได้มาจาก step2>/element
Post body ให้ใช้ raw. ส่งข้อมูลเป็น JSON.
{ "using": "css selector", "value": "coral-panel coral-list-item" }
ถ้าเจอ element, มันจะตอบกลับมาเป็น JSON แบบนี้.
{
"sessionId": "87edfc2e515dc6c39b469edbb31a4228",
"status": 0,
"value": {
"ELEMENT": "0.8506124488032647-15"
}
}
ต่อมาให้เอา ELEMENT ที่ได้จาก Step 6.3 ไปใช้หา state ของมัน. เราต้องสร้าง request GET ใน Postman.
URL: http://localhost:<port ที่เราได้มาจาก step 3-4>/wd/hub/session/<sessionID ที่เราได้มาจาก step2>/element/<ELEMENT ที่ได้จาก step 6.3>/enabledเราจะเห็น state ในรูปแบบ JSON แบบนี้.
{
"sessionId": "87edfc2e515dc6c39b469edbb31a4228",
"status": 0,
"value": true
}
จะเห็นได้ว่า ChromeDriver มันตอบมาเป็น TRUE!!! ทั้งๆที่มัน disabled อยู่อย่างถูกต้องตามกฎเกณฑ์. เฮ้อออ บัดซบ.
บัวบานใช้ Sublime บ้างในบางโอกาส. และประสบปัญหาอย่างแรง เวลาจะเรียกใช้ plugin แต่จำ shortcut key ไม่ได้! ต้อง google ทุกครั้งไป. น่าเบื่อ!
วันนี้ขอจบปัญหานี้อย่างถาวร ด้วยการเพิ่มเมนูเข้าไปให้ Sublime เลย. จะขอยกตัวอย่าง Plugin Pretty JSON ซึ่งมีหน้าที่จัดเว้นวรรค เว้นบรรทัด ให้ JSON อ่านง่ายขึ้นนะฮะ.
Install Plugin
กด Preferences > Package Control
เลือก Package Control: Install package
พิมพ์ “Pretty JSON” แล้วกด Enter
หลังจากที่มันลงเสร็จแล้วเราจะเห็น package นั้นบนเครื่องเรา.
Windows: %userprofile%\AppData\Roaming\Sublime Text 3\Packages\Pretty JSON
Mac: /Users/your-user/Library/Application Support/Sublime Text 3/Packages/Pretty JSON
Add a Menu
ณ จุดนี้ เราจะเพิ่มเมนู “PrettyPrint” และภายใต้นั้นเราจะใส่ “Pretty JSON” เอาไว้.
เปิดไฟล์ Main.sublime-menu
เพิ่ม object เข้าไปดังบรรทัดที่ 38-48
[
{
"mnemonic": "n",
"caption": "Preferences",
"id": "preferences",
"children": [
{
"mnemonic": "P",
"caption": "Package Settings",
"id": "package-settings",
"children": [
{
"caption": "Pretty JSON",
"children": [
{
"caption": "Settings – Default",
"args": {
"file": "${packages}/Pretty JSON/Pretty JSON.sublime-settings"
},
"command": "open_file"
},
{
"caption": "Settings – User",
"args": {
"file": "${packages}/User/Pretty JSON.sublime-settings"
},
"command": "open_file"
},
{
"caption": "-"
}
]
}
]
}
]
},
{
"caption": "PrettyPrint",
"mnemonic": "p",
"id": "prettyJson",
"children": [
{
"command": "pretty_json",
"caption": "Pretty JSON"
}
]
}
]
Save file และ Restart Sublime. จะเห็น Menu โผล่มา พร้อมกดใช้ได้เลยนะฮะ.
Google Chrome has released a new awesome feature, “HEADLESS”. It was delivered with Chrome 59 on MacOS and Chrome 60 on Windows.
Headless browser is an invisible browser. It doesn’t have GUI.
So you have a couple choices to interact with the Chrome headless. Continue reading Selenium with Chrome Headless →
Javascript Executor in Selenium have a lot of benefits that normal Selenium API cannot provide.
For instance,
You want to fetch data from server but it needs an authentication.
You want data inside a response of fetch or AJAX (XHR).
You want to get value from Javascript such as data from performance API (Navigation Timing, User Timing, etc.)
Continue reading Selenium JavaScript Executor (English version) →
MSDN Subscription download in Thailand is too slow! With 50 Mbps banwidth, I have to wait for 7 hours for Windows 10 (4.6 GB)!
I have found two ways to speed up the download. Continue reading Speed up downloading from MSDN Subscription →
วันนี้อยู่ๆก็มีอารมณ์อยากลองทำ performance test ของ websocket ขึ้นมา. ก็เลยทดลองเล่น JMeter 3 with plugin JMeter-WebSocketSampler.
เชิญชมวิธีการทำ performance test บน websocket (ws/wss) กัน. Continue reading WebSocket Performance Test on JMeter →
มี tools จำนวนมากในตลาดที่ช่วยในการทำ performance test นะฮะ. JMeter (by apache) น่าจะเป็นตัวเก๋าที่ทุกๆคนรู้จัก. มีข้อดีหลักๆคือ อยู่มานาน ทำให้มี tutorial เยอะ, รองรับการใช้งานหลากหลาย เช่น http, SOAP, JDBC, MongoDB, LDAP, TCP, …, และมีลูกเล่นเยอะแยะ เช่นใส่ script นู่นนี่เพื่อประมวลผล response, assert response, monitor response.
บัวบานขอนำเสนอวิธีการใช้ JMeter ทำ performance test Web Application แบบง่ายๆ. Continue reading JMeter – การใช้ JMeter แบบง่ายๆ →
กำแพงทิศเหนือของพระราชวังต้องห้าม
หลังจากเดินทางมาถึงปักกิ่ง และเยี่ยมชมกำแพงเมืองจีนในวันแรก ซึ่งเป็นวันจันทร์. วันที่สองเราก็ตื่นเช้ามาทานอาหารเช้าในโรงแรม. อาหารจะจืดๆ มันๆ, หาอาหารเค็มได้ยาก, อยากจะหาซีอิ๊วขาวมาหยดลงบนไข่ดาวสักหน่อยก็ไม่มี. เริ่มสงสัยว่าไอ้ซีอิ๊วขาวนี่มันเครื่องปรุงของจีนหรือของไทยกันแน่. Continue reading บันทึกบัวบานเยือนสาธารณรัฐประชาชนจีน – day 2 – พระราชวังต้องห้าม เฉียนเหมิน และหวังฝูจิ่ง →
บ่อยครั้งที่ request message นั้นต้องการเอาค่าจาก response ของอีก service หนึ่ง. ยกตัวอย่างเช่น เว็บไซต์ห้องสมุดต้องการแสดงรายการ favourite books, จะต้องมีการเรียกข้อมูล id หนังสือจาก FavouriteBookService ก่อนแล้วจึงเรียกข้อมูลหนังสือจาก BookInfoService ดัง sequence diagram ใน Figure 1.
Figure 1. Sequence diagram แสดงการเรียกข้อมูล Favourite Books
Continue reading JMeter – Process JSON response with BeanShell Processor →
ครอบครัวบัวบานเดินทางเยือนสาธารณรัฐประชาชนจีน เพื่อร่วมเป็นเกียรติในงานแต่งงานพี่สาวที่จีน ระหว่างวันที่ 28 – 4 พฤษภาคม 2557 โดยมีเป้าหมายสองอย่างคือเที่ยวเมืองปักกิ่ง (Beijing) และไปงานแต่งงานที่เมืองจ้าวจวง (Zaozhuang) มณฑลซานตง (Shandong).
Continue reading บันทึกบัวบานเยือนสาธารณรัฐประชาชนจีน – day 1 – กำแพงเมืองจีนและหม้อไฟเจ้าแรกของโลก →
Software QA, Network & Security, and stories of mine