GOPHERSPACE.DE - P H O X Y
gophering on sdf.org
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.By
import org.openqa.selenium.Keys
import org.openqa.selenium.support.ui.WebDriverWait
import org.openqa.selenium.support.ui.ExpectedConditions
 
System.setProperty("webdriver.chrome.driver", "c:/u/chromedriver.exe")
val chdr = ChromeDriver()
val HOST = "https://www.sports-tracker.com/login"
val wait = WebDriverWait(chdr, 10)
chdr.get(HOST)
chdr.findElement(By.id("username")).sendKeys("kkwoo")
chdr.findElement(By.id("password")).sendKeys("m0rujamn", Keys.ENTER)
// wait on a particular element: https://stackoverflow.com/questions/20009211/getting-selenium-to-pause-for-x-seconds
//                               http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button/span[text()='Menu']"))).click()
// how to find button via xpath: https://stackoverflow.com/questions/27529967/how-to-find-button-element-with-webdriver
// chdr.findElement(By.xpath("//button/span[text()='Menu']")).click()
 
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[text()='Diary']"))).click()
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[text()='List']"))).click()
// chdr.findElement(By.xpath("//*[text()='List']")).click() // needs explicit wait
// TODO: repeatedly click "Show more" until there's no more to show
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[text()='Show more']"))).click()
 
val all_workouts = chdr.findElements(By.xpath("//a[contains(@href, '/workout/kkwoo/')]"))
val some_workouts = all_workouts.take(50)
 
some_workouts.forEach {
    // opens in new window, not prone to screen position changes like it.click()
            it.sendKeys(Keys.ENTER)
            // convert getWindowHandles set object to arraylist
            chdr.switchTo().window(ArrayList(chdr.getWindowHandles()).get(1))
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Edit']"))).sendKeys(Keys.ENTER)
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Export']"))).sendKeys(Keys.ENTER)
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Cancel']"))).sendKeys(Keys.ENTER)
            // close tab and return to main list
            // chdr.close()
            chdr.switchTo().window(ArrayList(chdr.getWindowHandles()).get(0))
}
 
some_workouts.forEach {
            it.sendKeys(Keys.ENTER)
            chdr.switchTo().window(ArrayList(chdr.getWindowHandles()).get(1))
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Edit']"))).sendKeys(Keys.ENTER)
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Export']"))).sendKeys(Keys.ENTER)
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Cancel']"))).sendKeys(Keys.ENTER)
            chdr.close()
            chdr.switchTo().window(ArrayList(chdr.getWindowHandles()).get(0))
}
 
 
// TODO: repeatedly click "Show more" until there's no more to show
chdr.findElement(By.xpath("//*[text()='Show more']")).click()
// xpath contains function with selenium: https://stackoverflow.com/questions/13124942/xpath-for-href-element
chdr.findElements(By.xpath("//a[contains(@href, '/workout/kkwoo/')]"))
// FYI:
// innerHTML for investigation: https://stackoverflow.com/questions/7263824/get-html-source-of-webelement-in-selenium-webdriver
-using-python
// >>> val button_list = chdr.findElements(By.xpath("//button"))
// >>> button_list.forEach {println(it.getAttribute("innerHTML"))}
 
// logout and exit
chdr.findElement(By.partialLinkText("Logout")).click()
chdr.quit()