Dzisiaj w kąciku technicznym bonus dotyczący Selenium - znany, powszechny i popularny.
Gdy szukamy elementów na stronie, czasem zdarza się, że chcemy działać na elemencie który się
jeszcze nie pojawił, bo strona się doczytuje. Selenium, robi wiele rzeczy "instant", dlatego warto
używać waitów (ważne - nie mieszamy implicite wait z explicit wait!). Ale po co pisać wiele razy to
samo (DRY - Don't Repeat Yourself). Aby tego uniknąć, można napisać funkcje (ew. metody)
odpowiednio szybkie do wprowadzania, a powodujące, że nie piszemy x razy tego samego kodu,
poniżej przykłady dla Kotlina i Pythona 3. Funkcja odpowiadająca za klikanie, po uprzednim
oczekiwaniu aż element będzie klikalny, a także funkcja zwracająca WebElement gdy będzie on
widoczny. Obie wyszukujące po By.
W Kotlin:
</p>
import org.openqa.selenium.By
import org.openqa.selenium.support.ui.WebDriverWait
import org.openqa.selenium.support.ui.ExpectedConditions
val webDriverWait = WebDriverWait(driver, timeInSeconds)
fun clickBy(by: By){
webDriverWait.until(Expected.conditions.elementToBeClickable(by).click()
}
fun webElementBy(by: By): WebElement{
return webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(by))
}
<p>
Przykład użycia:
fun testKlikania(){
clickBy(By.id("id"))
}
val webElementTestowy = webElementBy(By.name("name"))
W Python 3:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
web_driver_wait = WebDriverWait(driver, time_in_seconds)
def click_by(by, argument):
web_driver_wait.until(EC.element_to_be_clickable((by, argument))).click()
def web_element_by(by, argument):
return web_driver_wait.until(EC.visibility_of_element_located((by, argument)))
przykład użycia:
def test_klikania():
click_by(By.ID, "id")
web_element_testowy = web_element_by(By.NAME, "name")