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 }