From b43f99f1f457f227b968a18949629312a9715743 Mon Sep 17 00:00:00 2001 From: io42630 Date: Mon, 10 Jun 2024 21:26:54 +0200 Subject: [PATCH] add tests & use selenium:4 & restore tab functionality --- .gitignore | 3 +- pom.xml | 12 +- .../tabdriver/DefaultTabDriverConfig.java | 2 +- .../java/com/olexyn/tabdriver/ITabDriver.java | 8 ++ .../java/com/olexyn/tabdriver/Purpose.java | 15 +++ src/main/java/com/olexyn/tabdriver/Tab.java | 11 +- .../java/com/olexyn/tabdriver/TabDriver.java | 104 ++++-------------- .../com/olexyn/tabdriver/TabDriverTest.java | 39 +++++++ .../olexyn/tabdriver/TestTabDriverConfig.java | 21 ++++ 9 files changed, 123 insertions(+), 92 deletions(-) create mode 100644 src/main/java/com/olexyn/tabdriver/ITabDriver.java create mode 100644 src/main/java/com/olexyn/tabdriver/Purpose.java create mode 100644 src/test/java/com/olexyn/tabdriver/TabDriverTest.java create mode 100644 src/test/java/com/olexyn/tabdriver/TestTabDriverConfig.java diff --git a/.gitignore b/.gitignore index 65479bc..225fba4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /.idea/ /target/ -*.iml \ No newline at end of file +*.iml +**/chromedriver_** diff --git a/pom.xml b/pom.xml index 84727a2..c35d3a9 100644 --- a/pom.xml +++ b/pom.xml @@ -8,13 +8,13 @@ jdk17-0.0 tabdriver - 1.2.4 + 1.3.0 jar tabdriver - 3.141.59 + 4.21.0 0.9.7376 @@ -75,7 +75,13 @@ com.olexyn min-prop - + + org.junit.jupiter + junit-jupiter + RELEASE + test + + diff --git a/src/main/java/com/olexyn/tabdriver/DefaultTabDriverConfig.java b/src/main/java/com/olexyn/tabdriver/DefaultTabDriverConfig.java index 517934d..b69fbbc 100644 --- a/src/main/java/com/olexyn/tabdriver/DefaultTabDriverConfig.java +++ b/src/main/java/com/olexyn/tabdriver/DefaultTabDriverConfig.java @@ -12,7 +12,7 @@ public abstract class DefaultTabDriverConfig implements TabDriverConfigProvider public ChromeOptions getOptions() { ChromeOptions options = new ChromeOptions(); - options.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + options.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true); options.addArguments("--start-maximized"); if (isHeadless()) { options.addArguments("--window-size=1920,1080"); diff --git a/src/main/java/com/olexyn/tabdriver/ITabDriver.java b/src/main/java/com/olexyn/tabdriver/ITabDriver.java new file mode 100644 index 0000000..b4c3fde --- /dev/null +++ b/src/main/java/com/olexyn/tabdriver/ITabDriver.java @@ -0,0 +1,8 @@ +package com.olexyn.tabdriver; + +public interface ITabDriver { + + void goToTab(Purpose purpose); + + void newTab(Purpose purpose); +} diff --git a/src/main/java/com/olexyn/tabdriver/Purpose.java b/src/main/java/com/olexyn/tabdriver/Purpose.java new file mode 100644 index 0000000..0b3a003 --- /dev/null +++ b/src/main/java/com/olexyn/tabdriver/Purpose.java @@ -0,0 +1,15 @@ +package com.olexyn.tabdriver; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public record Purpose(String name) { + + @Override + public boolean equals(Object obj) { + return obj instanceof Purpose && ((Purpose) obj).name.equals(name); + } + +} diff --git a/src/main/java/com/olexyn/tabdriver/Tab.java b/src/main/java/com/olexyn/tabdriver/Tab.java index 473c849..94abbf9 100644 --- a/src/main/java/com/olexyn/tabdriver/Tab.java +++ b/src/main/java/com/olexyn/tabdriver/Tab.java @@ -1,20 +1,17 @@ package com.olexyn.tabdriver; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @Setter @Getter +@AllArgsConstructor public class Tab { - String handle; - String name; - String url; - String purpose; + private String handle; + private Purpose purpose; - public Tab(String handle) { - this.handle = handle; - } } diff --git a/src/main/java/com/olexyn/tabdriver/TabDriver.java b/src/main/java/com/olexyn/tabdriver/TabDriver.java index e1c6dfa..1e30d2a 100644 --- a/src/main/java/com/olexyn/tabdriver/TabDriver.java +++ b/src/main/java/com/olexyn/tabdriver/TabDriver.java @@ -1,6 +1,7 @@ package com.olexyn.tabdriver; import com.olexyn.min.log.LogU; +import org.checkerframework.checker.nullness.qual.Nullable; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.Keys; @@ -8,6 +9,7 @@ import org.openqa.selenium.NoSuchFrameException; import org.openqa.selenium.SearchContext; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.openqa.selenium.WindowType; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; @@ -20,10 +22,9 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; -import static com.olexyn.tabdriver.Constants.ABOUT_BLANK; @SuppressWarnings("unused") -public class TabDriver implements JavascriptExecutor { +public class TabDriver implements JavascriptExecutor, ITabDriver { private final Map tabs = new HashMap<>(); private final ChromeDriver chromeDriver; @@ -80,89 +81,32 @@ public class TabDriver implements JavascriptExecutor { return chromeDriver.findElements(by); } - public synchronized void registerCurrentTab(String purpose) { - Tab tab = new Tab(getWindowHandle()); - tab.setName(getTitle()); - tab.setUrl(getCurrentUrl()); - tab.setPurpose(purpose); - tabs.put(tab.getHandle(), tab); - } - public synchronized Tab getCurrentTab() { + + private synchronized Tab getCurrentTab() { return tabs.get(getWindowHandle()); } - public synchronized List getTabByPurpose(String purpose) { - return tabs.values().stream() + @Override + public synchronized void goToTab(Purpose purpose) { + tabs.values().stream() .filter(x -> Objects.equals(x.getPurpose(), purpose)) - .toList(); - } - - public synchronized String registerBlankTab(String purpose) { - Set openTabHandles = getWindowHandles(); - for (String openTabHandle : openTabHandles) { - if (!tabs.containsKey(openTabHandle)) { - Tab blankTab = new Tab(openTabHandle); - blankTab.setName(ABOUT_BLANK); - blankTab.setUrl(ABOUT_BLANK); - blankTab.setPurpose(purpose); - tabs.put(openTabHandle, blankTab); - return openTabHandle; - } - } - LogU.warnPlain("Not unregistered tab found."); - return null; + .findFirst() + .ifPresent(this::switchToTab); } - public synchronized String registerExistingTab(String purpose) { - String handle = getWindowHandle(); - Tab tab = new Tab(handle); - tab.setName(getTitle()); - tab.setUrl(getCurrentUrl()); - tab.setPurpose(purpose); - tabs.put(handle, tab); - return handle; - } - - public synchronized void switchToTab(String handle) { - for (Entry entry : tabs.entrySet()) { - String tabHandle = entry.getKey(); - if (tabHandle.equals(handle)) { - switchTo().window(tabHandle); - } - } - } - - public synchronized void switchToTab(Tab tab) { + private synchronized void switchToTab(Tab tab) { switchTo().window(tab.getHandle()); } - /** - * Opens a new tab, and "moves" the WebDriver to the new tab. - * If the current tab is empty, it is registered - this happens usually only with the initial tab of the session. - */ - public synchronized void newTab(String purpose) { - String currentUrl = getCurrentUrl(); // TODO this throws error, just get a new window - if (currentUrl.isEmpty() - || currentUrl.equals("data:,") - || currentUrl.equals(ABOUT_BLANK)) { - registerExistingTab(purpose); - } else { - executeScript("window.open(arguments[0])"); - Optional.ofNullable(registerBlankTab(purpose)) - .ifPresent(this::switchToTab); - } + @Override + public synchronized void newTab(Purpose purpose) { + switchTo().newWindow(WindowType.TAB); + String handle = getWindowHandle(); + Tab tab = new Tab(handle, purpose); + tabs.put(handle, tab); } - public synchronized void switchToTabByPurpose(String purpose) { - List existingTabs = getTabByPurpose(purpose); - if (!existingTabs.isEmpty()) { - switchToTab(existingTabs.get(0)); - } else { - Tab currentTab = getCurrentTab(); - - } - } public synchronized void refresh() { navigate().refresh(); @@ -186,7 +130,7 @@ public class TabDriver implements JavascriptExecutor { } } - public synchronized WebElement filterElementListBy(List list, CRITERIA criteria, String text) { + public synchronized @Nullable WebElement filterElementListBy(List list, CRITERIA criteria, String text) { for (WebElement element : list) { String toEvaluate = switch (criteria) { case CLASS -> element.getClass().getName(); @@ -234,12 +178,12 @@ public class TabDriver implements JavascriptExecutor { } @Override - public Object executeScript(String script, Object... args) { + public @Nullable Object executeScript(String script, Object... args) { return null; } @Override - public Object executeAsyncScript(String script, Object... args) { + public @Nullable Object executeAsyncScript(String script, Object... args) { return null; } @@ -281,13 +225,13 @@ public class TabDriver implements JavascriptExecutor { /** * Return the first occurrence of specified class that has specified label. */ - public synchronized WebElement getWhere(String className, CRITERIA criteria, String text) { + public synchronized @Nullable WebElement getWhere(String className, CRITERIA criteria, String text) { switchToFrameContainingCharSeq(text); List elements = findElements(By.className(className)); return filterElementListBy(elements, criteria, text); } - public synchronized WebElement getWhere(String className) { + public synchronized @Nullable WebElement getWhere(String className) { switchToFrameContainingCharSeq(className); List elements = findElements(By.className(className)); return filterElementListBy(elements, CRITERIA.NONE, Constants.EMPTY); @@ -300,7 +244,7 @@ public class TabDriver implements JavascriptExecutor { public synchronized void setRadio(WebElement element, boolean checked) { - ((JavascriptExecutor) this).executeScript("arguments[0].checked = " + checked + ";", element); + ((JavascriptExecutor) this).executeScript("arguments[0].checked = " + checked + ';', element); } public synchronized void setComboByDataValue(By comboBy, String dataValue) { @@ -360,7 +304,7 @@ public class TabDriver implements JavascriptExecutor { */ public synchronized WebElement getByFieldValue(SearchContext searchContext, String type, String field, String value) { - return searchContext.findElement(By.cssSelector(type + "[" + field + "='" + value + "']")); + return searchContext.findElement(By.cssSelector(type + '[' + field + "='" + value + "']")); } public synchronized WebElement getByText(String text) { diff --git a/src/test/java/com/olexyn/tabdriver/TabDriverTest.java b/src/test/java/com/olexyn/tabdriver/TabDriverTest.java new file mode 100644 index 0000000..3a94c38 --- /dev/null +++ b/src/test/java/com/olexyn/tabdriver/TabDriverTest.java @@ -0,0 +1,39 @@ +package com.olexyn.tabdriver; + + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + + +public class TabDriverTest { + + + TabDriver tabDriver; + + + @BeforeEach + public void setUp() { + tabDriver = new TabDriver(new TestTabDriverConfig()); + } + + + @Test + public void test() { + var google = new Purpose("GOOGLE"); + var youtube = new Purpose("YOUTUBE"); + tabDriver.newTab(google); + tabDriver.get("https://www.google.com"); + tabDriver.newTab(youtube); + tabDriver.get("https://www.youtube.com"); + tabDriver.goToTab(google); + int br = 0; + } + + + @AfterEach + public void tearDown() { + tabDriver.quit(); + } + +} diff --git a/src/test/java/com/olexyn/tabdriver/TestTabDriverConfig.java b/src/test/java/com/olexyn/tabdriver/TestTabDriverConfig.java new file mode 100644 index 0000000..4738980 --- /dev/null +++ b/src/test/java/com/olexyn/tabdriver/TestTabDriverConfig.java @@ -0,0 +1,21 @@ +package com.olexyn.tabdriver; + +import java.nio.file.Path; + +public class TestTabDriverConfig extends DefaultTabDriverConfig { + + @Override + public Path getDriverPath() { + return Path.of(System.getProperties().getProperty("user.dir"), "/src/test/resources/chromedriver_124"); + } + + @Override + public String getDownloadDir() { + return ""; + } + + @Override + public boolean isHeadless() { + return false; + } +}