WebDriver بولسا Selenium دا ئىشلىتىدىغان تور كۆرگۈزگۈچ قوزغاتقۇچى، ئەگەر WebDriver قوزغۇلۇپ مەلۇم بىر ئېلمىنىتنى ( WebElement) نى تاپالمىسا بىزگە بۇنداق ئېلمىنىت يوق ( NoSuchelementexception ) خاتالىقى بېرىدۇ. بەزىدە بۇ خاتالىقنى بىزگە توربەتتە ھەقىقەتەن بىز ئىزدىگەن ئېلمىنىت يوق بولسا بەرسە، بەزىدە قىسقا ۋاقىت ئىچىدە توربەتتىكى ئېلمىنىتلارنى تولۇق چۈشۈپ بولالماسلىقى سەۋەبىدىن ئېلمىنىتنى تاپالماي بېرىدۇ. بىز ئېلمىنىت بار تۇرۇپمۇ بۇ خاتالىققا ئۇچۇرشىمىز تەبئىي ئەھۋال. بۇ مەسىلىنى ھەل قىلىش ئۈچۈن Seleniumدا ھەرخىل WebDriver ساقلاش ( Wait ) تۈرلىرى بار. ئۇنداقتا بىز بۇ ساقلاش تۈرلىرىگە قاراپ باقايلى.
Seleniumدا ئۈچ خىل ساقلاش تۈرى بولۇپ، بۇلار Implicit , Explicit ۋە Fluent Wait قاتارلىقلار. ئۇنداقتا بۇلارغا بىر-بىرلەپ قاراپ باقايلى.
Implicit Wait دىگەن نىمە؟
Implicit Wait بولسا WebDriver مەلۇم بىر ئېلمىنىتنى ئىزدىگەندە ياكى بۇ ئېلمىنىتلار دەرھال كۆرۈلمىگەندە WebDriver نىڭ HMTL DOM ئېلمىنىتلىرىنىڭ تولۇق چۈشۈپ بولىشى ئۈچۈن مەلۇم بىر ۋاقىت ساقلىشىنى كۆرسىتىدۇ. بۇنى تۆۋەندىكىدەك ئىشلىتىمىز:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/slow_loading_url");
WebElement dynamicElement = driver.findElement(By.id("dynamicElement"));
Explicit Wait دىگەن نىمە؟
Explicit Wait بولسا سىزنىڭ يازغان كودىڭىزنىڭ ئىجرا بولىشىدىن ئىلگىرى مەلۇم بىر شەرتنىڭ يۈز بېرىشىنى ساقلاش تۈرىنى كۆرسىتىدۇ. WebDriverWait سۈكۈتتىكى ھالەتتە ھەر 500 مىللىمېتىردا مۆلچەرلەنگەن شەرتنى ئىجرا قىلىدۇ. بۇ ساقلاش تۈرىنى تۆۋەندىكىدەك ئىشلىتىمىز:
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/someurl");
WebElement element = (new WebDriverWait(driver, 10))
.until(ExpectedConditions. ElementToBeClickable(By.id("btn_click")));
element.click();
بىز بۇ يەردە ساقلاش ئۈچۈن بېرىلگەن ۋاقىت يەنى 10 سېكىنوت بىلەن مۆلچەرلەنگەن شەرتنى (ExpectedConditions ) نى ئۆزگەرتسەك بولىدۇ. مۆلچەرلەنگەن شەرتنىڭ (ExpectedConditions ) ھەرخىل شەرت شەكىللىرى بولۇپ ئۇلار تۆۋەندىكىچە:
AlertIsPresent()
ElementIsVisible()
ElementExists()
ElementToBeClickable(By)
ElementToBeClickable(IWebElement)
ElementToBeSelected(By)
ElementToBeSelected(IWebElement)
ElementToBeSelected(IWebElement, Boolean)
TitleContains()
UrlContains()
UrlMatches()
VisibilityOfAllElementsLocatedBy(By)
VisibilityOfAllElementsLocatedBy(ReadOnlyCollection)
StalenessOf(IWebElement)
TextToBePresentInElement()
TextToBePresentInElementValue(IWebElement, String)
Fluent Wait دىگەن نىمە؟
Fluent Wait بولسا Selenium WebDriver نىڭ مەلۇم بىر ئەھۋالنىڭ كۆرۈلۈشىنى ساقلاش ئۈچۈن ئەڭ كۆپ ۋاقىت بەلگىلەيدۇ.
Selenium دىكى Fluent Wait مەلۇم بىر شەرتنىڭ كۈچكە بولىشى ئۈچۈن بېرىلگەن ئەك يۇقىرى ۋاقىتى ۋە ElementNotVisibleException نى بېرىشتىن بۇرۇن بىز تەكشۈرمەكچى بولغان شەرتنىڭ تەكشۈرۈش چاستۇتا ( frequency) ۋاقتىنى بەلگىلەش ئۈچۈن ئىشلىتىلىدۇ. ئۇ تور ئېلېمېنتىنى ئوبيېكت تېپىلغۇچە ياكى ۋاقىت توشقۇچە قەرەللىك تەكشۈرۈپ تۇرىدۇ. Fluent Wait نى ئىشلىتىش ئۇسۇلى تۆۋەندىكىچە:
WebDriverManager.chromedriver().setup();
ChromeDriver driver =new ChromeDriver();
FluentWait wait = new FluentWait(driver)
.withTimeout(Duration.ofSeconds(10))
.pollingEvery(Duration.ofMillis(500))
.ignoring(NoSuchElementException.class);
WebElement element=wait.until(new Function<WebDriver, WebElement>() {
public WebElement applyy(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
element.click();