Wydaje się, starasz się zbudować ramy kluczowego napędzane. Szczerze mówiąc, byłbym bardzo zaskoczony, słysząc jakąś udaną historię na ten temat. Czy zawsze zastanawiałeś się, jaki jest prawdziwy cel tego rodzaju ram? Kto z niego skorzysta? Menedżerowie, manualne kontrole jakości lub interesariusze? Dla mnie nie ma sensu angażować osób nietechnicznych w czynności automatyzacji testów. Każda automatyzacja wymaga dobrych umiejętności technicznych (w tym programowanie i tworzenie aplikacji). W przeciwnym razie prawdopodobieństwo niepowodzenia jest dość wysokie.
W każdym razie twoje pytanie dotyczy bardziej mapowania strings
vs functional interfaces
lub bardzo inteligentnego użycia refleksji. Ale głównym problemem jest to, że wybrałeś złe API [input] dla tego. Następujący wiersz:
driver.findElement(locator).doSmth();
jest właściwa droga, by upaść, jak findElement
wykorzystuje ukryte czeka. I jestem w 100% pewien, że zaczniesz globalne refaktoryzowanie/rewizję wdrożonego podejścia, gdy natkniesz się na NoSuchElementException
/StaleElementReferenceException
.
Zdrowy rozsądek sugeruje używanie płynnego czekania z ExpectedConditions
. Ale to sprawi, że twoje zadanie będzie jeszcze bardziej skomplikowane, ponieważ oprócz lokalizatorów i działań musisz myśleć o warunkach, które powinny być dostarczane przez użytkowników.
Najpierw utworzę typowe opakowania, aby zamknąć wywołania interfejsu API WebDriver niskiego poziomu.Znacznie łatwiej byłoby odwzorować lub odzwierciedlić takie funkcje w porównaniu z nieprzetworzonymi połączeniami. Na przykład. spodziewane warunki mogą być ukryte na poziomie enum:
@Getter
@RequiredArgsConstructor
public enum WaitCondition {
visible(ExpectedConditions::visibilityOfElementLocated),
enabled(ExpectedConditions::elementToBeClickable);
private final Function<By, ExpectedCondition<WebElement>> type;
}
Łatwo będzie odzyskać wymaganą stałą, dzwoniąc np. WaitCondition.valueOf("visible")
, gdzie ciąg wejściowy może być przekazywany z zewnątrz.
Wspólny interfejs API owijka może wyglądać następująco, a następnie: Przykłady
protected void click(By locator) {
click(locator, enabled);
}
protected void click(By locator, WaitCondition condition) {
waitFor(locator, condition).click();
}
private WebElement waitFor(By locator, WaitCondition condition) {
return wait.until(condition.getType().apply(locator));
}
przekształcenia/odbicie już dostarczone przez innych, w tym nici. Uwaga: jeśli wolisz refleksję, polecam przejrzeć bibliotekę jOOR, co upraszcza ten proces.
Bardzo mi przykro, ponieważ zadaję kolejne pytanie w tym samym pytaniu. Co zrobić, jeśli mój "identyfikator" jest również zapisany w zmiennej. Na przykład: zmienna zawierająca 'id' lub' xpath', na podstawie której muszę wykonać operację: 'driver.findElement (przez. (" id1 ")). ' W tej sytuacji, w jaki sposób można rozszerzyć swoje rozwiązanie? –
@OmSao Zmieniłem trochę kod i dodałem dla ciebie odpowiedź na drugie pytanie. Proszę mi powiedzieć, czy ten kod działa, ponieważ go nie testowałem. –