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()