Page Object Model & Factory in Selenium

โšก ะฃะผะฝะพ ะพะฑะพะฑั‰ะตะฝะธะต

ะœะพะดะตะป ะฝะฐ ะพะฑะตะบั‚ะธ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะธ ะธ ั„ะฐะฑั€ะธะบะฐ ะทะฐ ัั‚ั€ะฐะฝะธั†ะธ ะฒ Selenium ะดะตั„ะธะฝะธั€ะฐะฝะต ะฝะฐ ัั‚ั€ัƒะบั‚ัƒั€ะธั€ะฐะฝ ะผะพะดะตะป ะฝะฐ ะฟั€ะพะตะบั‚ะธั€ะฐะฝะต ะทะฐ ะธะทะณั€ะฐะถะดะฐะฝะต ะฝะฐ ัั‚ะฐะฑะธะปะฝะธ ะธ ะฟะพะดะดัŠั€ะถะฐะตะผะธ ั€ะฐะผะบะธ ะทะฐ ะฐะฒั‚ะพะผะฐั‚ะธะทะธั€ะฐะฝะพ ั‚ะตัั‚ะฒะฐะฝะต. ะขะพะน ะฐะบั†ะตะฝั‚ะธั€ะฐ ะฒัŠั€ั…ัƒ ััŠะทะดะฐะฒะฐะฝะตั‚ะพ ะฝะฐ ัะฟะตั†ะธั„ะธั‡ะฝะธ ะทะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ ะบะปะฐัะพะฒะต, ะบะพะธั‚ะพ ะบะฐะฟััƒะปะธั€ะฐั‚ WebElements ะธ ั‚ัั…ะฝะพั‚ะพ ะฟะพะฒะตะดะตะฝะธะต, ะบะฐั‚ะพ ะฟะพ ั‚ะพะทะธ ะฝะฐั‡ะธะฝ ะฝะฐะผะฐะปัะฒะฐั‚ ะดัƒะฑะปะธั€ะฐะฝะตั‚ะพ ะธ ะฟะพะดะพะฑั€ัะฒะฐั‚ ั‡ะตั‚ะธะผะพัั‚ั‚ะฐ ะธ ะผะฐั‰ะฐะฑะธั€ัƒะตะผะพัั‚ั‚ะฐ ะฝะฐ Selenium ั‚ะตัั‚ะพะฒะธ ัะบั€ะธะฟั‚ะพะฒะต.

  • ะžัะฝะพะฒะฝะฐ ะบะพะฝั†ะตะฟั†ะธั: ะ’ััะบะฐ ัั‚ั€ะฐะฝะธั†ะฐ ะฝะฐ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ ััŠะพั‚ะฒะตั‚ัั‚ะฒะฐ ะฝะฐ ัะฟะตั†ะธะฐะปะตะฝ ะบะปะฐั Page, ััŠะดัŠั€ะถะฐั‰ ะบะฐะบั‚ะพ WebElements, ั‚ะฐะบะฐ ะธ ะดะตะนัั‚ะฒะธัั‚ะฐ, ะธะทะฒัŠั€ัˆะฒะฐะฝะธ ะฒัŠั€ั…ัƒ ั‚ัั…, ะบะพะตั‚ะพ ะฟะพะทะฒะพะปัะฒะฐ ััะฝะพ ั€ะฐะทะดะตะปะตะฝะธะต ะผะตะถะดัƒ ัั‚ั€ัƒะบั‚ัƒั€ะฐั‚ะฐ ะฝะฐ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั ะธ ั‚ะตัั‚ะพะฒะฐั‚ะฐ ะปะพะณะธะบะฐ.
  • ะคะพะบัƒั ะฝะฐ ะฒะฝะตะดั€ัะฒะฐะฝะตั‚ะพ: POM ะฝะฐััŠั€ั‡ะฐะฒะฐ ัƒะฟั€ะฐะฒะปะตะฝะธะตั‚ะพ ะฝะฐ ะตะปะตะผะตะฝั‚ะธ ะทะฐ ะผะฝะพะณะพะบั€ะฐั‚ะฝะฐ ัƒะฟะพั‚ั€ะตะฑะฐ ะธ ั†ะตะฝั‚ั€ะฐะปะธะทะธั€ะฐะฝะพ ัƒะฟั€ะฐะฒะปะตะฝะธะต โ€“ ะผะพะดะธั„ะธะบะฐั†ะธะธั‚ะต ะฝะฐ ะตะปะตะผะตะฝั‚ะธั‚ะต ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ ะธะทะธัะบะฒะฐั‚ ะฐะบั‚ัƒะฐะปะธะทะฐั†ะธะธ ัะฐะผะพ ะฒ ะตะดะธะฝ ะบะปะฐั, ะฒะผะตัั‚ะพ ะฒ ะผะฝะพะถะตัั‚ะฒะพ ัะบั€ะธะฟั‚ะพะฒะต.
  • ะŸั€ะตะดะธะผัั‚ะฒะพ ะฝะฐ ะดะธะทะฐะนะฝะฐ: ะœะพะดะตะปัŠั‚ ะพัะธะณัƒั€ัะฒะฐ ะฟะพ-ั‡ะธัั‚ะธ, ะผะพะดัƒะปะฝะธ ะธ ะฝะตะทะฐะฒะธัะธะผะธ ะพั‚ ะธะฝัั‚ั€ัƒะผะตะฝั‚ะธ ั…ั€ะฐะฝะธะปะธั‰ะฐ ะทะฐ ะพะฑะตะบั‚ะธ, ะบะพะธั‚ะพ ะผะพะณะฐั‚ ะดะฐ ัะต ะธะฝั‚ะตะณั€ะธั€ะฐั‚ ั ั€ะฐะผะบะธ ะบะฐั‚ะพ TestNG, JUnit, Cucumberะธะปะธ JBehave.
  • ะšะพะฝะฒะตะฝั†ะธั ะทะฐ ะธะผะตะฝัƒะฒะฐะฝะต: ะœะตั‚ะพะดะธั‚ะต ะฒ ะบะปะฐัะพะฒะตั‚ะต ะฝะฐ ัั‚ั€ะฐะฝะธั†ะธั‚ะต ั‚ั€ัะฑะฒะฐ ะดะฐ ะพั‚ั€ะฐะทัะฒะฐั‚ ะดะตะนัั‚ะฒะธั‚ะตะปะฝะธั‚ะต ะดะตะนัั‚ะฒะธั ะฒ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั (ะฝะฐะฟั€. gotoHomePage()), ะทะฐัะธะปะฒะฐะฝะต ะฝะฐ ัะตะผะฐะฝั‚ะธั‡ะฝะฐั‚ะฐ ััะฝะพั‚ะฐ ะฒ ะฐะฒั‚ะพะผะฐั‚ะธะทะธั€ะฐะฝะธั‚ะต ั€ะฐะฑะพั‚ะฝะธ ะฟั€ะพั†ะตัะธ.
  • ะŸะพะดะพะฑั€ะตะฝะฐ ัั‚ั€ัƒะบั‚ัƒั€ะฐ: Page Factory ัƒััŠะฒัŠั€ัˆะตะฝัั‚ะฒะฐ POM ั‡ั€ะตะท ะธะทะฟะพะปะทะฒะฐะฝะต @FindBy ะฐะฝะพั‚ะฐั†ะธะธ ะธ PageFactory.initElements() ะทะฐ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะฝะฐ ะธะฝะธั†ะธะฐะปะธะทะฐั†ะธั ะฝะฐ WebElement, ะตะปะธะผะธะฝะธั€ะฐะนะบะธ ะฟะพะฒั‚ะฐั€ัั‰ะธั‚ะต ัะต findElement ะฟั€ะธะทะพะฒะฐะฒะฐ.
  • ะžะฟั‚ะธะผะธะทะธั€ะฐะฝะต ะฝะฐ ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปะฝะพัั‚ั‚ะฐ: AjaxElementLocatorFactory ะฒัŠะฒะตะถะดะฐ โ€žะปะตะฝะธะฒะพโ€œ ะทะฐั€ะตะถะดะฐะฝะต โ€” ะตะปะตะผะตะฝั‚ะธั‚ะต ัะต ะปะพะบะฐะปะธะทะธั€ะฐั‚ ัะฐะผะพ ะบะพะณะฐั‚ะพ ัะฐ ะดะพัั‚ัŠะฟะฝะธ โ€” ะฟะพะดะพะฑั€ัะฒะฐะนะบะธ ะตั„ะตะบั‚ะธะฒะฝะพัั‚ั‚ะฐ ะฝะฐ ะธะทะฟัŠะปะฝะตะฝะธะตั‚ะพ ะธ ะตะปะตะณะฐะฝั‚ะฝะพ ะพะฑั€ะฐะฑะพั‚ะฒะฐะนะบะธ ะดะธะฝะฐะผะธั‡ะฝะพั‚ะพ ะฟะพะฒะตะดะตะฝะธะต ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ.
  • ะ ะตะทัƒะปั‚ะฐั‚: ะฃะฝะธั„ะธั†ะธั€ะฐะฝะธัั‚ ะฟะพะดั…ะพะด ะฒะพะดะธ ะดะพ ะฟะพะดะดัŠั€ะถะฐะตะผะฐ, ั‡ะตั‚ะธะผะฐ ะธ ะผะฐั‰ะฐะฑะธั€ัƒะตะผะฐ ะฐั€ั…ะธั‚ะตะบั‚ัƒั€ะฐ ะทะฐ ะฐะฒั‚ะพะผะฐั‚ะธะทะธั€ะฐะฝะพ ั‚ะตัั‚ะฒะฐะฝะต, ััŠะพะฑั€ะฐะทะตะฝะฐ ััŠั ััŠะฒั€ะตะผะตะฝะฝะธั‚ะต ัั‚ะฐะฝะดะฐั€ั‚ะธ. Selenium ะฟั€ะฐะบั‚ะธะบะธ.

ะžะฑะตะบั‚ะตะฝ ะผะพะดะตะป ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ

ะšะฐะบะฒะพ ะต ะพะฑะตะบั‚ะตะฝ ะผะพะดะตะป ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐ? ะšะพะธ ัะฐ ะฝะตะณะพะฒะธั‚ะต ะบะปัŽั‡ะพะฒะธ ะบะพะผะฟะพะฝะตะฝั‚ะธ?

Page Object Model (POM) ะต ะดะธะทะฐะนะฝะตั€ัะบะธ ัˆะฐะฑะปะพะฝ, ะฟะพะฟัƒะปัั€ะฝะพ ะธะทะฟะพะปะทะฒะฐะฝ ะฒ ะฐะฒั‚ะพะผะฐั‚ะธะทะฐั†ะธัั‚ะฐ ะฝะฐ ั‚ะตัั‚ะพะฒะตั‚ะต, ะบะพะนั‚ะพ ััŠะทะดะฐะฒะฐ ั…ั€ะฐะฝะธะปะธั‰ะต ะทะฐ ะพะฑะตะบั‚ะธ ะทะฐ ะตะปะตะผะตะฝั‚ะธ ะพั‚ ัƒะตะฑ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั. ะŸั€ะตะดะธะผัั‚ะฒะพั‚ะพ ะฝะฐ ะผะพะดะตะปะฐ ะต, ั‡ะต ะฝะฐะผะฐะปัะฒะฐ ะดัƒะฑะปะธั€ะฐะฝะตั‚ะพ ะฝะฐ ะบะพะด ะธ ะฟะพะดะพะฑั€ัะฒะฐ ะฟะพะดะดั€ัŠะถะบะฐั‚ะฐ ะฝะฐ ั‚ะตัั‚ะพะฒะตั‚ะต.

ะกัŠะณะปะฐัะฝะพ ั‚ะพะทะธ ะผะพะดะตะป, ะทะฐ ะฒััะบะฐ ัƒะตะฑ ัั‚ั€ะฐะฝะธั†ะฐ ะฒ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ ั‚ั€ัะฑะฒะฐ ะดะฐ ะธะผะฐ ััŠะพั‚ะฒะตั‚ัั‚ะฒะฐั‰ ะบะปะฐั Page. ะขะพะทะธ ะบะปะฐั Page ั‰ะต ะธะดะตะฝั‚ะธั„ะธั†ะธั€ะฐ WebElements ะฝะฐ ั‚ะฐะทะธ ัƒะตะฑ ัั‚ั€ะฐะฝะธั†ะฐ ะธ ััŠั‰ะพ ั‚ะฐะบะฐ ั‰ะต ััŠะดัŠั€ะถะฐ ะผะตั‚ะพะดะธ ะฝะฐ Page, ะบะพะธั‚ะพ ะธะทะฒัŠั€ัˆะฒะฐั‚ ะพะฟะตั€ะฐั†ะธะธ ะฒัŠั€ั…ัƒ ั‚ะตะทะธ WebElements. ะ˜ะผะตะฝะฐั‚ะฐ ะฝะฐ ั‚ะตะทะธ ะผะตั‚ะพะดะธ ั‚ั€ัะฑะฒะฐ ะดะฐ ะฑัŠะดะฐั‚ ะดะฐะดะตะฝะธ ัะฟะพั€ะตะด ะทะฐะดะฐั‡ะฐั‚ะฐ, ะบะพัั‚ะพ ะธะทะฟัŠะปะฝัะฒะฐั‚, ั‚.ะต. ะฐะบะพ ะทะฐั€ะตะถะดะฐั‰ ะผะตั…ะฐะฝะธะทัŠะผ ั‡ะฐะบะฐ ะดะฐ ัะต ะฟะพัะฒะธ ะฟะปะฐั‚ะตะถะฝะธัั‚ ัˆะปัŽะท, ะธะผะตั‚ะพ ะฝะฐ POM ะผะตั‚ะพะดะฐ ะผะพะถะต ะดะฐ ะฑัŠะดะต waitForPaymentScreenDisplay().

ะšะปัŽั‡ะพะฒะธ ะบะพะผะฟะพะฝะตะฝั‚ะธ ะฝะฐ ะพะฑะตะบั‚ะฝะธั ะผะพะดะตะป ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ

  • ะšะปะฐัะพะฒะต ะฝะฐ ัั‚ั€ะฐะฝะธั†ะธ: ะŸั€ะตะดัั‚ะฐะฒะตั‚ะต ะฒััะบะฐ ัƒะตะฑ ัั‚ั€ะฐะฝะธั†ะฐ ะบะฐั‚ะพ ะพั‚ะดะตะปะตะฝ ะบะปะฐั.
  • ะ›ะพะบะฐั‚ะพั€ะธ: ะ˜ะดะตะฝั‚ะธั„ะธั†ะธั€ะฐะนั‚ะต ัƒะตะฑ ะตะปะตะผะตะฝั‚ะธ, ะธะทะฟะพะปะทะฒะฐะนะบะธ ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ะธ, XPath ะธะปะธ CSS ัะตะปะตะบั‚ะพั€ะธ.
  • ะœะตั‚ะพะดะธ: ะกัŠะดัŠั€ะถะฐั‚ ะดะตะนัั‚ะฒะธั ะธะปะธ ะพะฟะตั€ะฐั†ะธะธ, ะธะทะฒัŠั€ัˆะฒะฐะฝะธ ะฒัŠั€ั…ัƒ ะตะปะตะผะตะฝั‚ะธั‚ะต .page.
  • ะŸะพะฒั‚ะพั€ะฝะฐ ัƒะฟะพั‚ั€ะตะฑะฐ: Promoะฟะพะฒั‚ะพั€ะฝะฐ ัƒะฟะพั‚ั€ะตะฑะฐ ะฝะฐ TES ะบะพะด ะธ ะฟะพ-ะปะตัะฝะฐ ะฟะพะดะดั€ัŠะถะบะฐ ะผะตะถะดัƒ ั‚ะตัั‚ะพะฒะตั‚ะต.
  • ะ ะฐะทะดะตะปัะฝะต ะฝะฐ ะทะฐะณั€ะธะถะตะฝะพัั‚ั‚ะฐ: ะŸะพะดะดัŠั€ะถะฐ ัั‚ั€ัƒะบั‚ัƒั€ะฐั‚ะฐ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ ะฝะตะทะฐะฒะธัะธะผะฐ ะพั‚ ั‚ะตัั‚ะพะฒะฐั‚ะฐ ะปะพะณะธะบะฐ ะทะฐ ะฟะพ-ะดะพะฑั€ะฐ ะพั€ะณะฐะฝะธะทะฐั†ะธั.

ะžะฑะตะบั‚ะตะฝ ะผะพะดะตะป ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ

ะ—ะฐั‰ะพ Page Object Model?

ะกั‚ะฐั€ั‚ะธั€ะฐะฝะต ะฝะฐ ะฐะฒั‚ะพะผะฐั‚ะธะทะฐั†ะธั ะฝะฐ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั ะฒ Selenium ัƒะตะฑะดั€ะฐะนะฒะตั€ ะะ• ะต ั‚ั€ัƒะดะฝะฐ ะทะฐะดะฐั‡ะฐ. ะŸั€ะพัั‚ะพ ั‚ั€ัะฑะฒะฐ ะดะฐ ะฝะฐะผะตั€ะธั‚ะต ะตะปะตะผะตะฝั‚ะธ ะธ ะดะฐ ะธะทะฒัŠั€ัˆะธั‚ะต ะพะฟะตั€ะฐั†ะธะธ ะฒัŠั€ั…ัƒ ั‚ัั….

ะŸะพะผะธัะปะตั‚ะต ะทะฐ ั‚ะพะทะธ ะฟั€ะพัั‚ ัะบั€ะธะฟั‚ ะทะฐ ะฒะปะธะทะฐะฝะต ะฒ ัƒะตะฑัะฐะนั‚.

ะžะฑะตะบั‚ะตะฝ ะผะพะดะตะป ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ

ะšะฐะบั‚ะพ ะผะพะถะตั‚ะต ะดะฐ ะฒะธะดะธั‚ะต, ะฒัะธั‡ะบะพ, ะบะพะตั‚ะพ ะฟั€ะฐะฒะธะผ, ะต ะดะฐ ะฝะฐะผะธั€ะฐะผะต ะตะปะตะผะตะฝั‚ะธ ะธ ะดะฐ ะฟะพะฟัŠะปะฒะฐะผะต ัั‚ะพะนะฝะพัั‚ะธ ะทะฐ ั‚ะตะทะธ ะตะปะตะผะตะฝั‚ะธ.

ะขะพะฒะฐ ะต ัะบั€ะธะฟั‚, ะบะพะนั‚ะพ ะพั‚ะฝะตะผะฐ ะฒั€ะตะผะต ะธ ะต ัะบะปะพะฝะตะฝ ะบัŠะผ ะณั€ะตัˆะบะธ. ะ’ ะฝะฐั‡ะฐะปะพั‚ะพ ะธะทะณะปะตะถะดะฐ ะปะตัะฝะพ, ะฝะพ ั ั€ะฐะทัˆะธั€ัะฒะฐะฝะตั‚ะพ ะฝะฐ ั‚ะตัั‚ะพะฒะธั ะฝะฐะฑะพั€, ัƒะฟั€ะฐะฒะปะตะฝะธะตั‚ะพ ะฝะฐ ะฟั€ะพะผะตะฝะธั‚ะต ะฒ ะตะปะตะผะตะฝั‚ะธั‚ะต ัั‚ะฐะฒะฐ ั‚ั€ัƒะดะฝะพ. ะะพ ั ะฒั€ะตะผะตั‚ะพ ั‚ะตัั‚ะพะฒะธัั‚ ะฝะฐะฑะพั€ ั‰ะต ั€ะฐัั‚ะต. ะก ะดะพะฑะฐะฒัะฝะตั‚ะพ ะฝะฐ ะฒัะต ะฟะพะฒะตั‡ะต ะธ ะฟะพะฒะตั‡ะต ั€ะตะดะพะฒะต ะบัŠะผ ะบะพะดะฐ ัะธ, ะฝะตั‰ะฐั‚ะฐ ัั‚ะฐะฒะฐั‚ ั‚ั€ัƒะดะฝะธ.

ะžัะฝะพะฒะฝะธัั‚ ะฟั€ะพะฑะปะตะผ ั ะฟะพะดะดั€ัŠะถะบะฐั‚ะฐ ะฝะฐ ัะบั€ะธะฟั‚ะพะฒะต ะต, ั‡ะต ะฐะบะพ 10 ั€ะฐะทะปะธั‡ะฝะธ ัะบั€ะธะฟั‚ะฐ ะธะทะฟะพะปะทะฒะฐั‚ ะตะดะธะฝ ะธ ััŠั‰ ะตะปะตะผะตะฝั‚ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ, ั ะฒััะบะฐ ะฟั€ะพะผัะฝะฐ ะฒ ั‚ะพะทะธ ะตะปะตะผะตะฝั‚, ั‚ั€ัะฑะฒะฐ ะดะฐ ะฟั€ะพะผะตะฝะธั‚ะต ะฒัะธั‡ะบะธั‚ะต 10 ัะบั€ะธะฟั‚ะฐ. ะขะพะฒะฐ ะพั‚ะฝะตะผะฐ ะฒั€ะตะผะต ะธ ะต ะฟะพะดะฐั‚ะปะธะฒะพ ะฝะฐ ะณั€ะตัˆะบะธ.

ะŸะพ-ะดะพะฑัŠั€ ะฟะพะดั…ะพะด ะทะฐ ะฟะพะดะดั€ัŠะถะบะฐ ะฝะฐ ัะบั€ะธะฟั‚ะพะฒะต ะต ะดะฐ ัะต ััŠะทะดะฐะดะต ะพั‚ะดะตะปะตะฝ ั„ะฐะนะป ั ะบะปะฐั, ะบะพะนั‚ะพ ะดะฐ ะฝะฐะผะธั€ะฐ ัƒะตะฑ ะตะปะตะผะตะฝั‚ะธ, ะดะฐ ะณะธ ะฟะพะฟัŠะปะฒะฐ ะธะปะธ ะฟั€ะพะฒะตั€ัะฒะฐ. ะขะพะทะธ ะบะปะฐั ะผะพะถะต ะดะฐ ัะต ะธะทะฟะพะปะทะฒะฐ ะฟะพะฒั‚ะพั€ะฝะพ ะฒ ะผะฝะพะถะตัั‚ะฒะพ ั‚ะตัั‚ะพะฒะธ ัะบั€ะธะฟั‚ะพะฒะต, ะบะพะธั‚ะพ ะฒะทะฐะธะผะพะดะตะนัั‚ะฒะฐั‚ ั ะตะดะธะฝ ะธ ััŠั‰ ะตะปะตะผะตะฝั‚. ะ’ ะฑัŠะดะตั‰ะต, ะฐะบะพ ะธะผะฐ ะฟั€ะพะผัะฝะฐ ะฒ ัƒะตะฑ ะตะปะตะผะตะฝั‚ะฐ, ั‰ะต ั‚ั€ัะฑะฒะฐ ะดะฐ ะฝะฐะฟั€ะฐะฒะธะผ ะฟั€ะพะผัะฝะฐั‚ะฐ ัะฐะผะพ ะฒ 1 ั„ะฐะนะป ั ะบะปะฐั, ะฐ ะฝะต ะฒ 10 ั€ะฐะทะปะธั‡ะฝะธ ัะบั€ะธะฟั‚ะฐ.

ะขะพะทะธ ะฟะพะดั…ะพะด ัะต ะฝะฐั€ะธั‡ะฐ Page Object Model in Seleniumะขะพะฒะฐ ะฟะพะผะฐะณะฐ ะบะพะดัŠั‚ ะดะฐ ะฑัŠะดะต ะฟะพ-ั‡ะตั‚ะปะธะฒ, ะฟะพ-ะปะตัะฝะพ ะฟะพะดะดัŠั€ะถะฐะตะผ ะธ ะฟะพ-ะปะตัะฝะพ ะธะทะฟะพะปะทะฒะฐะตะผ.

 ะžะฑะตะบั‚ะตะฝ ะผะพะดะตะป ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ

๐Ÿ‘‰ ะ—ะฐะฟะธัˆะตั‚ะต ัะต ะทะฐ ะฑะตะทะฟะปะฐั‚ะตะฝ ะบะพะฝั†ะตั€ั‚ Selenium ะŸั€ะพะตะบั‚

ะŸั€ะตะดะธะผัั‚ะฒะฐ ะฝะฐ POM

  1. ะจะฐะฑะปะพะฝัŠั‚ ะทะฐ ะฟั€ะพะตะบั‚ะธั€ะฐะฝะต ะฝะฐ ะพะฑะตะบั‚ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐ ะบะฐะทะฒะฐ, ั‡ะต ะพะฟะตั€ะฐั†ะธะธั‚ะต ะธ ะฟะพั‚ะพั†ะธั‚ะต ะฒ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั ั‚ั€ัะฑะฒะฐ ะดะฐ ะฑัŠะดะฐั‚ ะพั‚ะดะตะปะตะฝะธ ะพั‚ ะฟั€ะพะฒะตั€ะบะฐั‚ะฐ. ะขะฐะทะธ ะบะพะฝั†ะตะฟั†ะธั ะฟั€ะฐะฒะธ ะฝะฐัˆะธั ะบะพะด ะฟะพ-ั‡ะธัั‚ ะธ ะปะตัะตะฝ ะทะฐ ั€ะฐะทะฑะธั€ะฐะฝะต.
  2. ะ’ั‚ะพั€ะพั‚ะพ ะฟั€ะตะดะธะผัั‚ะฒะพ ะต, ั‡ะต ั…ั€ะฐะฝะธะปะธั‰ะตั‚ะพ ะทะฐ ะพะฑะตะบั‚ะธ ะต ะฝะตะทะฐะฒะธัะธะผะพ ะพั‚ ั‚ะตัั‚ะพะฒะธั‚ะต ัะปัƒั‡ะฐะธ, ั‚ะฐะบะฐ ั‡ะต ะผะพะถะตะผ ะดะฐ ะธะทะฟะพะปะทะฒะฐะผะต ะตะดะฝะพ ะธ ััŠั‰ะพ ั…ั€ะฐะฝะธะปะธั‰ะต ะทะฐ ะพะฑะตะบั‚ะธ ะทะฐ ั€ะฐะทะปะธั‡ะฝะธ ั†ะตะปะธ ั ั€ะฐะทะปะธั‡ะฝะธ ะธะฝัั‚ั€ัƒะผะตะฝั‚ะธ. ะะฐะฟั€ะธะผะตั€, ะผะพะถะตะผ ะดะฐ ะธะฝั‚ะตะณั€ะธั€ะฐะผะต Page Object Model ะฒ Selenium ั TestNG/JUnit ะทะฐ ั„ัƒะฝะบั†ะธะพะฝะฐะปะฝะธ ะขะตัั‚ะฒะฐะฝะต ะธ ะฒ ััŠั‰ะพั‚ะพ ะฒั€ะตะผะต ั JBehave/Cucumber ะทะฐ ั‚ะตัั‚ะฒะฐะฝะต ะทะฐ ะฟั€ะธะตะผะฐะฝะต.
  3. Code ัั‚ะฐะฒะฐ ะฟะพ-ะผะฐะปะบะพ ะธ ะพะฟั‚ะธะผะธะทะธั€ะฐะฝะพ, ะทะฐั‰ะพั‚ะพ ะธะทะฟะพะปะทะฒะฐ ะฟะพะฒั‚ะพั€ะฝะพ ะผะตั‚ะพะดะธั‚ะต ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ ะฒ POM ะบะปะฐัะพะฒะตั‚ะต.
  4. ะœะตั‚ะพะดะธั‚ะต ะฟะพะปัƒั‡ะฐะฒะฐั‚ ะฟะพ-ั€ะตะฐะปะธัั‚ะธั‡ะฝะธ ะธะผะตะฝะฐ, ะบะพะธั‚ะพ ะผะพะณะฐั‚ ะปะตัะฝะพ ะดะฐ ะฑัŠะดะฐั‚ ััŠะฟะพัั‚ะฐะฒะตะฝะธ ั ะพะฟะตั€ะฐั†ะธัั‚ะฐ, ะธะทะฒัŠั€ัˆะฒะฐะฝะฐ ะฒ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั. ะะฐะฟั€ะธะผะตั€, ะฐะบะพ ัะปะตะด ั‰ั€ะฐะบะฒะฐะฝะต ะฒัŠั€ั…ัƒ ะฑัƒั‚ะพะฝะฐ ัะต ะพะทะพะฒะตะผ ะฝะฐ ะฝะฐั‡ะฐะปะฝะฐั‚ะฐ ัั‚ั€ะฐะฝะธั†ะฐ, ะธะผะตั‚ะพ ะฝะฐ ะผะตั‚ะพะดะฐ ั‰ะต ะฑัŠะดะต ะบะฐั‚ะพ โ€žgotoHomePage()โ€œ.

ะšะฐะบ ะดะฐ ะฒะฝะตะดั€ะธะผ POM ะฒ Selenium?

ะŸั€ะพัั‚ PLog ะฒ ะพัะฝะพะฒะฝะฐั‚ะฐ ัั‚ั€ัƒะบั‚ัƒั€ะฐ ะฝะฐ ั€ะฐะผะบะฐั‚ะฐ ะฝะฐ Page Object Model, ะบัŠะดะตั‚ะพ whereManagereIDElements ะฝะฐ AUT ะธ ะผะตั‚ะพะดัŠั‚, ะบะพะนั‚ะพ ั€ะฐะฑะพั‚ะธ ั ั‚ะตะทะธ ัƒะตะฑ ะตะปะตะผะตะฝั‚ะธ, ัะต ะฟะพะดะดัŠั€ะถะฐ ะฒัŠะฒ ั„ะฐะนะป clog. ะ—ะฐะดะฐั‡ะฐ ะบะฐั‚ะพ ะฟั€ะพะฒะตั€ะบะฐ ั‚ั€ัะฑะฒะฐ ะดะฐ ะฑัŠะดะต ะพั‚ะดะตะปะฝะฐ ะบะฐั‚ะพ ั‡ะฐัั‚ ะพั‚ ะผะตั‚ะพะดะธั‚ะต ะทะฐ ั‚ะตัั‚ะฒะฐะฝะต.

ะ’ะฝะตะดั€ะตั‚ะต POM

ะŸัŠะปะตะฝ ะฟั€ะธะผะตั€

ั‚ะตัั‚ะพะฒ ัะปัƒั‡ะฐะน: ะžั‚ะธะดะธ Guru99 ะ”ะตะผะพ ัะฐะนั‚.

ะกั‚ัŠะฟะบะฐ 1) ะžั‚ะธะดะตั‚ะต ะฝะฐ Guru99 ะ”ะตะผะพ ัะฐะนั‚

ะ’ะฝะตะดั€ะตั‚ะต POM

ะกั‚ัŠะฟะบะฐ 2) ะะฐ ะฝะฐั‡ะฐะปะฝะฐั‚ะฐ ัั‚ั€ะฐะฝะธั†ะฐ ะฟั€ะพะฒะตั€ะตั‚ะต ะดะฐะปะธ ั‚ะตะบัั‚ัŠั‚ โ€žGuruโ€ž99 Bankโ€œ ะต ะฝะฐะปะธั†ะต

ะ’ะฝะตะดั€ะตั‚ะต POM

ะกั‚ัŠะฟะบะฐ 3) ะ’ะปะตะทั‚ะต ะฒ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ

ะ’ะฝะตะดั€ะตั‚ะต POM

ะกั‚ัŠะฟะบะฐ 4) ะŸั€ะพะฒะตั€ะตั‚ะต ะดะฐะปะธ ะฝะฐั‡ะฐะปะฝะฐั‚ะฐ ัั‚ั€ะฐะฝะธั†ะฐ ััŠะดัŠั€ะถะฐ ั‚ะตะบัั‚ ะบะฐั‚ะพ โ€žะ˜ะดะตะฝั‚ะธั„ะธะบะฐั†ะธะพะฝะตะฝ ะฝะพะผะตั€ ะฝะฐ ะผะตะฝะธะดะถัŠั€: ะดะตะผะพะฝัั‚ั€ะฐั†ะธัโ€œ

ะ’ะฝะตะดั€ะตั‚ะต POM

ะ’ ั‚ะพะทะธ ะฟั€ะธะผะตั€ ะธะผะฐะผะต ั€ะฐะฑะพั‚ะฐ ั ะดะฒะต ัั‚ั€ะฐะฝะธั†ะธ:

  1. ะ›ะพะณะธะฝ ัั‚ั€ะฐะฝะธั†ะฐ
  2. ะะฐั‡ะฐะปะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐ (ะฟะพะบะฐะทะฒะฐ ัะต ัะปะตะด ะบะฐั‚ะพ ะฒะปะตะทะตั‚ะต)

ะกัŠะพั‚ะฒะตั‚ะฝะพ ััŠะทะดะฐะฒะฐะผะต 2 POM ะฒ Selenium ะบะปะฐัะพะฒะต

Guru99 ะกั‚ั€ะฐะฝะธั†ะฐ ะทะฐ ะฒั…ะพะด POM

package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99Login {
    WebDriver driver;
    By user99GuruName = By.name("uid");
    By password99Guru = By.name("password");
    By titleText =By.className("barone");
    By login = By.name("btnLogin");
    public Guru99Login(WebDriver driver){
        this.driver = driver;
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        driver.findElement(user99GuruName).sendKeys(strUserName);
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
         driver.findElement(password99Guru).sendKeys(strPassword);
    }
    //Click on the login button
    public void clickLogin(){
            driver.findElement(login).click();
    }
    //Get the title of Login Page
    public String getLoginTitle(){
     return    driver.findElement(titleText).getText();
    }
    /**
     * This POM method allows the test case to perform the login operation
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();        
    }
}

Guru99 ะะฐั‡ะฐะปะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐ POM ะฒ Selenium

package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99HomePage {
    WebDriver driver;
    By homePageUserName = By.xpath("//table//tr[@class='heading3']");
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
    }
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    driver.findElement(homePageUserName).getText();
        }
}

Guru99 ะพะฑะธะบะฝะพะฒะตะฝะธ POM ะฒ Selenium ะขะตัั‚ะพะฒ ัะปัƒั‡ะฐะน

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import pages.Guru99HomePage;
import pages.Guru99Login;
public class Test99GuruLogin {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage;
    @BeforeTest
    public void setup(){
	System.setProperty("webdriver.gecko.driver", driverPath);        
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test case will login in https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }

ะ’ ะบะฐะบะฒะพ ะต Page Factory Selenium?

Page Factory ะฒ Selenium ะต ะฒะณั€ะฐะดะตะฝะฐ ะบะพะฝั†ะตะฟั†ะธั ะทะฐ ั€ะฐะผะบะฐ ะฝะฐ Page Object Model ะทะฐ Selenium WebDriver, ะบะพะนั‚ะพ ะฟะพะดะพะฑั€ัะฒะฐ ะฟะพะดะดั€ัŠะถะบะฐั‚ะฐ ั‡ั€ะตะท ะฝะฐะผะฐะปัะฒะฐะฝะต ะฝะฐ ะฟะพะฒั‚ะฐั€ัั‰ะธั‚ะต ัะต ั‚ัŠั€ัะตะฝะธั ะฝะฐ ะตะปะตะผะตะฝั‚ะธ ั ะฟะพะผะพั‰ั‚ะฐ ะฝะฐ ะฐะฝะพั‚ะฐั†ะธะธ, ะฐ ะฝะต ั‡ั€ะตะท ัะบะพั€ะพัั‚ ะฝะฐ ะธะทะฟัŠะปะฝะตะฝะธะต. ะ˜ะทะฟะพะปะทะฒะฐ ัะต ะทะฐ ะธะฝะธั†ะธะฐะปะธะทะธั€ะฐะฝะต ะฝะฐ ะพะฑะตะบั‚ะธ Page ะธะปะธ ะทะฐ ััŠะทะดะฐะฒะฐะฝะต ะฝะฐ ะธะฝัั‚ะฐะฝั†ะธะธ ะฝะฐ ัะฐะผะธั ะพะฑะตะบั‚ Page. ะ˜ะทะฟะพะปะทะฒะฐ ัะต ััŠั‰ะพ ะทะฐ ะธะฝะธั†ะธะฐะปะธะทะธั€ะฐะฝะต ะฝะฐ ะตะปะตะผะตะฝั‚ะธ ะพั‚ ะบะปะฐัะฐ Page ะฑะตะท ะธะทะฟะพะปะทะฒะฐะฝะต ะฝะฐ โ€žFindElement/sโ€œ.

ะขัƒะบ ััŠั‰ะพ ัะปะตะดะฒะฐะผะต ะบะพะฝั†ะตะฟั†ะธัั‚ะฐ ะทะฐ ั€ะฐะทะดะตะปัะฝะต ะฝะฐ Page Object Repository ะธ Test Methods. ะžัะฒะตะฝ ั‚ะพะฒะฐ, ั ะฟะพะผะพั‰ั‚ะฐ ะฝะฐ ะบะปะฐั PageFactory ะฒ Selenium, ะธะทะฟะพะปะทะฒะฐะผะต ะฐะฝะพั‚ะฐั†ะธะธ @FindBy ะทะฐ ะดะฐ ะฝะฐะผะตั€ะธะผ WebElement. ะ˜ะทะฟะพะปะทะฒะฐะผะต ะผะตั‚ะพะดะฐ initElements ะทะฐ ะธะฝะธั†ะธะฐะปะธะทะธั€ะฐะฝะต ะฝะฐ ัƒะตะฑ ะตะปะตะผะตะฝั‚ะธ.

Page Factory In Selenium

@FindBy ะผะพะถะต ะดะฐ ะฟั€ะธะตะผะต tagName, partialLinkText, ะธะผะต, linkText, id, css, className, xpath ะบะฐั‚ะพ ะฐั‚ั€ะธะฑัƒั‚ะธ.

ะะตะบะฐ ั€ะฐะทะณะปะตะดะฐะผะต ััŠั‰ะธั ะฟั€ะธะผะตั€ ะบะฐั‚ะพ ะฟะพ-ะณะพั€ะต, ะธะทะฟะพะปะทะฒะฐะนะบะธ Page Factory

Guru99 ะกั‚ั€ะฐะฝะธั†ะฐ ะทะฐ ะฒั…ะพะด ั Page Factory

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99Login {
    /**
     * All WebElements are identified by @FindBy annotation
     */
    WebDriver driver;
    @FindBy(name="uid")
    WebElement user99GuruName;
    @FindBy(name="password")
    WebElement password99Guru;    
    @FindBy(className="barone")
    WebElement titleText;
    @FindBy(name="btnLogin")
    WebElement login;
    public Guru99Login(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        user99GuruName.sendKeys(strUserName);     
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
    password99Guru.sendKeys(strPassword);
    }
    //Click on login button
    public void clickLogin(){
            login.click();

    }  
    //Get the title of Login Page
    public String getLoginTitle(){
     return    titleText.getText();
    }
    /**
     * This POM method will be exposed in test case to login in the application
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();           
    }
}

Guru99 ะะฐั‡ะฐะปะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐ ั Page Factory

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99HomePage {
    WebDriver driver;
    @FindBy(xpath="//table//tr[@class='heading3']")
    WebElement homePageUserName;    
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }   
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    homePageUserName.getText();
        }
}

Guru99 ะขะตัั‚ะพะฒะธ ัะปัƒั‡ะฐะธ ั ะบะพะฝั†ะตะฟั†ะธัั‚ะฐ ะฝะฐ Page Factory

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import PageFactory.Guru99HomePage;
import PageFactory.Guru99Login;
public class Test99GuruLoginWithPageFactory {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage; 
    @BeforeTest
    public void setup(){
        System.setProperty("webdriver.gecko.driver", driverPath);       
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test go to https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }
}

ะŸัŠะปะฝะฐั‚ะฐ ัั‚ั€ัƒะบั‚ัƒั€ะฐ ะฝะฐ ะฟั€ะพะตะบั‚ะฐ ั‰ะต ะธะทะณะปะตะถะดะฐ ะบะฐั‚ะพ ะดะธะฐะณั€ะฐะผะฐั‚ะฐ:

Page Factory ะฒ Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory ะต ะบะพะฝั†ะตะฟั†ะธั ะทะฐ ะผัŠั€ะทะตะปะธะฒะพ ะทะฐั€ะตะถะดะฐะฝะต ะฝะฐ PageFactory ะฒ Seleniumะ˜ะทะฟะพะปะทะฒะฐ ัะต ะทะฐ ะฝะฐะผะธั€ะฐะฝะต ะฝะฐ ัƒะตะฑ ะตะปะตะผะตะฝั‚ะธ ัะฐะผะพ ะบะพะณะฐั‚ะพ ะตะปะตะผะตะฝั‚ะธั‚ะต ัะต ะธะทะฟะพะปะทะฒะฐั‚ ะฒ ะฝัะบะฐะบะฒะฐ ะพะฟะตั€ะฐั†ะธั. ะŸั€ะธัะฒะพัะฒะฐ ะฒั€ะตะผะต ะทะฐ ะธะทั‡ะฐะบะฒะฐะฝะต ะทะฐ WebElements ะฝะฐ ะบะปะฐัะฐ ะฝะฐ ะพะฑะตะบั‚ะฐ ัั‚ั€ะฐะฝะธั†ะฐ. ะ•ะดะฝะพ ะพั‚ ะบะปัŽั‡ะพะฒะธั‚ะต ะฟั€ะตะดะธะผัั‚ะฒะฐ ะฝะฐ ะธะทะฟะพะปะทะฒะฐะฝะตั‚ะพ ะฝะฐ ัˆะฐะฑะปะพะฝะฐ PageFactory ะฒ Selenium ะต AjaxElementLocatorFactory ะบะปะฐั.

ะขัƒะบ, ะบะพะณะฐั‚ะพ ัะต ะธะทะฒัŠั€ัˆะฒะฐ ะพะฟะตั€ะฐั†ะธั ะฒัŠั€ั…ัƒ ะตะปะตะผะตะฝั‚, ั‡ะฐะบะฐะฝะตั‚ะพ ะทะฐ ะฝะตะณะพะฒะฐั‚ะฐ ะฒะธะดะธะผะพัั‚ ะทะฐะฟะพั‡ะฒะฐ ะตะดะฒะฐ ะพั‚ ั‚ะพะทะธ ะผะพะผะตะฝั‚. ะะบะพ ะตะปะตะผะตะฝั‚ัŠั‚ ะฝะต ะฑัŠะดะต ะฝะฐะผะตั€ะตะฝ ะฒ ะดะฐะดะตะฝะธั ะธะฝั‚ะตั€ะฒะฐะป ะพั‚ ะฒั€ะตะผะต, ะขะตัั‚ะพะฒ ัะปัƒั‡ะฐะน ะธะทะฟัŠะปะฝะตะฝะธะตั‚ะพ ั‰ะต ั…ะฒัŠั€ะปะธ ะธะทะบะปัŽั‡ะตะฝะธะต โ€žNoSuchElementExceptionโ€œ.

ะคะฐะฑั€ะธะบะฐ ะทะฐ ะปะพะบะฐั‚ะพั€ ะฝะฐ AjaxElement

ะะฐะฟั€ะธะผะตั€:

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

ะ˜ะทั‚ะตะณะปะตั‚ะต Selenium ะŸั€ะพะตะบั‚ะฝะธ ั„ะฐะนะปะพะฒะต ะทะฐ ะดะตะผะพะฝัั‚ั€ะฐั†ะธัั‚ะฐ ะฒ ั‚ะพะทะธ ัƒั€ะพะบ

ะ’ัŠะฟั€ะพัะธ ะธ ะžั‚ะณะพะฒะพั€ะธ

ะœะพะดะตะปัŠั‚ ะฝะฐ ะพะฑะตะบั‚ะธั‚ะต ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ ะต ะดะธะทะฐะนะฝะตั€ัะบะธ ัˆะฐะฑะปะพะฝ, ะบะพะนั‚ะพ ะฐะฑั.tracts ั€ะฐะทะดะตะปั ะตะปะตะผะตะฝั‚ะธั‚ะต ะฝะฐ ัƒะตะฑ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ ะฒ ะพั‚ะดะตะปะฝะธ ะบะปะฐัะพะฒะต. ะขะพะฒะฐ ะพะฟั€ะพัั‚ัะฒะฐ ะฐะฒั‚ะพะผะฐั‚ะธะทะฐั†ะธัั‚ะฐ, ะบะฐั‚ะพ ะพั‚ะดะตะปั ะฒะทะฐะธะผะพะดะตะนัั‚ะฒะธัั‚ะฐ ั ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั ะพั‚ ั‚ะตัั‚ะพะฒะฐั‚ะฐ ะปะพะณะธะบะฐ, ะฝะฐััŠั€ั‡ะฐะฒะฐะนะบะธ ััะฝะพั‚ะฐ, ะผะฐั‰ะฐะฑะธั€ัƒะตะผะพัั‚ ะธ ะฝะฐะผะฐะปัะฒะฐะนะบะธ ะดัƒะฑะปะธั€ะฐะฝะตั‚ะพ ะฝะฐ ะบะพะด.

In SeleniumPOM ะฟั€ะตะดัั‚ะฐะฒั ะฒััะบะฐ ัƒะตะฑ ัั‚ั€ะฐะฝะธั†ะฐ ะบะฐั‚ะพ ัะฟะตั†ะธะฐะปะตะฝ ะบะปะฐั, ััŠะดัŠั€ะถะฐั‰ ะปะพะบะฐั‚ะพั€ะธ ะธ ะดะตะนัั‚ะฒะธั. ะขะพะน ะบะฐะฟััƒะปะธั€ะฐ ะตะปะตะผะตะฝั‚ะธ ะพั‚ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั, ะฟะพะทะฒะพะปัะฒะฐะนะบะธ ะฝะฐ ั‚ะตัั‚ะพะฒะธั‚ะต ัะบั€ะธะฟั‚ะพะฒะต ะดะฐ ะพัั‚ะฐะฝะฐั‚ ะฝะตะทะฐะฒะธัะธะผะธ ะพั‚ ะฟั€ะพะผะตะฝะธั‚ะต ะฒ ัั‚ั€ัƒะบั‚ัƒั€ะฐั‚ะฐ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ.

POM ะฝะต ะต ัะฐะผะพัั‚ะพัั‚ะตะปะฝะฐ ั€ะฐะผะบะฐ, ะฐ ัˆะฐะฑะปะพะฝ ะทะฐ ะฟั€ะพะตะบั‚ะธั€ะฐะฝะต. ะขั ะผะพะถะต ะดะฐ ะฑัŠะดะต ะธะฝั‚ะตะณั€ะธั€ะฐะฝะฐ ะฒัŠะฒ ะฒััะบะฐ ั€ะฐะผะบะฐ ะทะฐ ะฐะฒั‚ะพะผะฐั‚ะธะทะฐั†ะธั, ะทะฐ ะดะฐ ัั‚ั€ัƒะบั‚ัƒั€ะธั€ะฐ ั‚ะตัั‚ะพะฒะตั‚ะต ะตั„ะตะบั‚ะธะฒะฝะพ, ะพัะธะณัƒั€ัะฒะฐะนะบะธ ะฟะพ-ะดะพะฑั€ะฐ ะพั€ะณะฐะฝะธะทะฐั†ะธั, ะฒัŠะทะผะพะถะฝะพัั‚ ะทะฐ ะผะฝะพะณะพะบั€ะฐั‚ะฝะฐ ัƒะฟะพั‚ั€ะตะฑะฐ ะธ ะฟะพะดะดั€ัŠะถะบะฐ.

POM ะต ะฟั€ะธะฝั†ะธะฟ ะฝะฐ ะฟั€ะพะตะบั‚ะธั€ะฐะฝะต, ะฟั€ะธ ะบะพะนั‚ะพ ะฒััะบะฐ ัƒะตะฑ ัั‚ั€ะฐะฝะธั†ะฐ ัะต ะผะพะดะตะปะธั€ะฐ ะบะฐั‚ะพ ะบะปะฐั ั ะดะตั„ะธะฝะธั€ะฐะฝะธ ะปะพะบะฐั‚ะพั€ะธ ะธ ะผะตั‚ะพะดะธ. ะขะพะน ะพั‚ะดะตะปั ั‚ะตัั‚ะพะฒะฐั‚ะฐ ะปะพะณะธะบะฐ ะพั‚ ะตะปะตะผะตะฝั‚ะธั‚ะต ะฝะฐ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั, ะฟะพะดะพะฑั€ัะฒะฐะนะบะธ ั‡ะตั‚ะธะผะพัั‚ั‚ะฐ, ะผะฐั‰ะฐะฑะธั€ัƒะตะผะพัั‚ั‚ะฐ ะธ ะดัŠะปะณะพัั€ะพั‡ะฝะฐั‚ะฐ ะฟะพะดะดั€ัŠะถะบะฐ.

POM ะพะฟั€ะตะดะตะปั ัั‚ั€ัƒะบั‚ัƒั€ะฐั‚ะฐ ะฝะฐ ะดะธะทะฐะนะฝะฐ ะทะฐ ัั‚ั€ะฐะฝะธั†ะฐั‚ะฐ abstracั†ะธั, ะดะพะบะฐั‚ะพ Page Factory ะฟั€ะตะดะพัั‚ะฐะฒั ะฐะฝะพั‚ะฐั†ะธะธ ะธ ะผะตั‚ะพะดะธ (@FindBy) ะทะฐ ะตั„ะธะบะฐัะฝะพ ะธะฝะธั†ะธะฐะปะธะทะธั€ะฐะฝะต ะฝะฐ ัƒะตะฑ ะตะปะตะผะตะฝั‚ะธ. Page Factory ะต ะฟะพะดะพะฑั€ะตะฝะธะต ะฝะฐ ะธะผะฟะปะตะผะตะฝั‚ะฐั†ะธัั‚ะฐ ะฝะฐ POM.

POM ั†ะตะฝั‚ั€ะฐะปะธะทะธั€ะฐ ะปะพะบะฐั‚ะพั€ะธั‚ะต ะฝะฐ ะตะปะตะผะตะฝั‚ะธ ะธ ะดะตะนัั‚ะฒะธัั‚ะฐ ะฝะฐ ัั‚ั€ะฐะฝะธั†ะธั‚ะต ะฒ ั€ะฐะผะบะธั‚ะต ะฝะฐ ัะฟะตั†ะธะฐะปะฝะธ ะบะปะฐัะพะฒะต. ะ’ััะบะฐ ะฟั€ะพะผัะฝะฐ ะฝะฐ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั ะธะทะธัะบะฒะฐ ะฐะบั‚ัƒะฐะปะธะทะฐั†ะธะธ ัะฐะผะพ ะฝะฐ ะตะดะฝะพ ะผััั‚ะพ, ะบะพะตั‚ะพ ะผะธะฝะธะผะธะทะธั€ะฐ ะฟั€ะตั€ะฐะฑะพั‚ะบะฐั‚ะฐ, ะฟะพะดะพะฑั€ัะฒะฐ ะฟะพะฒั‚ะพั€ะฝะฐั‚ะฐ ัƒะฟะพั‚ั€ะตะฑะฐ ะฝะฐ ะบะพะดะฐ ะธ ัƒัะบะพั€ัะฒะฐ ะฟะพะดะดั€ัŠะถะบะฐั‚ะฐ ะฝะฐ ั‚ะตัั‚ะพะฒะตั‚ะต.

ะ”ะฐ. ะ“ะตะฝะตั€ะฐั‚ะพั€ะธั‚ะต ะฝะฐ ั‚ะตัั‚ะพะฒะต, ัƒะฟั€ะฐะฒะปัะฒะฐะฝะธ ะพั‚ ะธะทะบัƒัั‚ะฒะตะฝ ะธะฝั‚ะตะปะตะบั‚, ะผะพะณะฐั‚ ะดะฐ ััŠะทะดะฐะฒะฐั‚ POM ะบะปะฐัะพะฒะต ะฐะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ, ะบะฐั‚ะพ ะฐะฝะฐะปะธะทะธั€ะฐั‚ ะนะตั€ะฐั€ั…ะธะธั‚ะต ะฝะฐ ะฟะพั‚ั€ะตะฑะธั‚ะตะปัะบะธั ะธะฝั‚ะตั€ั„ะตะนั, ะฟะพะดะดัŠั€ะถะฐะนะบะธ ะปะพะณะธั‡ะตัะบะพ ั€ะฐะทะดะตะปัะฝะต ะฝะฐ ะทะฐะดะฐั‡ะธั‚ะต, ะบะฐั‚ะพ ััŠั‰ะตะฒั€ะตะผะตะฝะฝะพ ัƒัะบะพั€ัะฒะฐั‚ ััŠะทะดะฐะฒะฐะฝะตั‚ะพ ะฝะฐ ั‚ะตัั‚ะพะฒะต ะพั‚ ะบั€ะฐะน ะดะพ ะบั€ะฐะน.

POM ะฝะฐััŠั€ั‡ะฐะฒะฐ ะผะพะดัƒะปะฝะธั‚ะต ะธ ะผะฝะพะณะพะบั€ะฐั‚ะฝะพ ะธะทะฟะพะปะทะฒะฐะตะผะธ ั‚ะตัั‚ะพะฒะธ ะบะพะผะฟะพะฝะตะฝั‚ะธ, ะฟะพะทะฒะพะปัะฒะฐะนะบะธ ะธะฝั‚ะตะณั€ะฐั†ะธั ั ะธะฝัั‚ั€ัƒะผะตะฝั‚ะธ ะทะฐ ะฟะพะดะดั€ัŠะถะบะฐ ะฝะฐ ั‚ะตัั‚ะพะฒะต, ะฑะฐะทะธั€ะฐะฝะธ ะฝะฐ ะธะทะบัƒัั‚ะฒะตะฝ ะธะฝั‚ะตะปะตะบั‚, ะบะพะธั‚ะพ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฐะบั‚ัƒะฐะปะธะทะธั€ะฐั‚ ะปะพะบะฐั‚ะพั€ะธั‚ะต, ะฝะฐะผะฐะปัะฒะฐะนะบะธ ะฝะตัั‚ะฐะฑะธะปะฝะพัั‚ั‚ะฐ ะฝะฐ ัะบั€ะธะฟั‚ะพะฒะตั‚ะต ะธ ั€ะฐะทั…ะพะดะธั‚ะต ะทะฐ ะฟะพะดะดั€ัŠะถะบะฐ.

ะžะฑะพะฑั‰ะตั‚ะต ั‚ะฐะทะธ ะฟัƒะฑะปะธะบะฐั†ะธั ั: