1 module amazontests; 2 3 import std.conv; 4 import std.string; 5 import std.algorithm; 6 7 import selenium.session; 8 import selenium.workflow; 9 import selenium.api; 10 11 import trial.step; 12 13 class Steps { 14 void search(immutable SeleniumSession session, string value) 15 { 16 auto step = Step("Search " ~ value); 17 session.findOne(ElementLocator(LocatorStrategy.Id, 18 "twotabsearchtextbox")).click.sendKeys(value); 19 20 session.findOne(ElementLocator(LocatorStrategy.CssSelector, 21 ".nav-search-submit input")).click; 22 } 23 24 void selectResultNumber(immutable SeleniumSession session, int index) 25 { 26 auto step = Step("Select result number " ~ index.to!string); 27 session.findMany(ElementLocator(LocatorStrategy.CssSelector, 28 "li.s-result-item"))[index].findOne(ElementLocator(LocatorStrategy.CssSelector, 29 "a.s-access-detail-page")).click; 30 } 31 32 void selectFirstResult(immutable SeleniumSession session) { 33 auto step = Step("Select the first result"); 34 selectResultNumber(session, 0); 35 } 36 37 auto eachResult(immutable SeleniumSession session) { 38 return session.historyCue(&this.getResult); 39 } 40 41 auto getResult(immutable SeleniumSession session, ulong index) { 42 auto step = Step("Get result " ~ index.to!string); 43 44 auto list = session.findMany("li.s-result-item a.s-access-detail-page".cssLocator); 45 46 if(index >= list.length) { 47 return null; 48 } 49 50 auto element = list[index]; 51 auto position = element.position; 52 53 session.currentWindow.execute("window.scrollTo(" ~ position.x.to!string ~ "," ~ position.y.to!string ~ ")"); 54 element.click; 55 56 class ResultPage { 57 private immutable SeleniumSession session; 58 59 this(immutable SeleniumSession session) { 60 this.session = session; 61 } 62 63 string getTitle() { 64 auto step = Step("get title: " ~ session.findOne("productTitle".idLocator).text); 65 return session.findOne("productTitle".idLocator).text; 66 } 67 } 68 69 return new ResultPage(session); 70 } 71 } 72 73 class ProductPage : SeleniumPage { 74 this(immutable SeleniumSession session) { 75 super(session); 76 } 77 78 override bool isPresent() { 79 return session.findOne("#title".cssLocator).text.indexOf("Maggy London Women's") != -1; 80 } 81 } 82 83 auto getWorkflow(immutable SeleniumSession session) { 84 SeleniumPage productPage = new ProductPage(session); 85 86 return define(session) 87 .define!"productPage"(productPage) 88 .define(new Steps) 89 .define(new WebNavigation); 90 } 91 92 @("Check the second result on amazon.com") 93 unittest { 94 auto session = new immutable SeleniumSession("http://127.0.0.1:4444/wd/hub", 95 Capabilities.chrome); 96 scope(exit) session.close; 97 98 getWorkflow(session) 99 .goTo("https://www.amazon.com") 100 .search("Maggy London Womens") 101 .selectResultNumber(2) 102 .productPage 103 .check 104 .isPresent; 105 } 106 107 @("Check the first result on amazon.com") 108 unittest { 109 auto session = new immutable SeleniumSession("http://127.0.0.1:4444/wd/hub", 110 Capabilities.chrome); 111 scope(exit) session.close; 112 113 getWorkflow(session) 114 .goTo("https://www.amazon.com") 115 .search("Maggy London Womens") 116 .selectFirstResult 117 .check 118 .productPage.isPresent; 119 } 120 121 @("Check all the results from amazon.com") 122 unittest { 123 auto session = new immutable SeleniumSession("http://127.0.0.1:4444/wd/hub", 124 Capabilities.chrome); 125 scope(exit) session.close; 126 127 getWorkflow(session) 128 .goTo("https://www.amazon.com") 129 .search("Maggy London Womens") 130 .eachResult 131 .map!(a => a.getTitle.canFind("Maggy London Women's")) 132 .reduce!((a, b) => a && b); 133 }