· 8 years ago · Dec 20, 2017, 04:14 PM
1package main
2
3import (
4 "fmt"
5 "github.com/tebeka/selenium"
6 "github.com/tebeka/selenium/sauce"
7 "github.com/blang/semver"
8 "net"
9 "flag"
10 "log"
11 "time"
12 "errors"
13 "github.com/tebeka/selenium/firefox"
14 "math/rand"
15)
16
17const (
18 vkAuthUrl string = "https://oauth.vk.com/authorize?client_id=5614546&scope=photos,audio,video,docs,notes,pages,status,offers,questions,wall,groups,messages,email,notifications,stats,ads,offline,docs,pages,stats,notifications&response_type=token&redirect_uri=http://oauth.vk.com/blank.html&display=page"
19)
20
21var (
22 firefoxBinarySelenium3 = flag.String("firefox_binary_for_selenium3", "vendor/firefox-nightly/firefox", "The name of the Firefox binary for Selenium 3 tests or the path to it. If the name does not contain directory separators, the PATH will be searched.")
23 geckoDriverPath = flag.String("geckodriver_path", "vendor/geckodriver-v0.18.0-linux64", "The path to the geckodriver binary. If empty of the file is not present, the Geckodriver tests will not be run.")
24 startFrameBuffer = flag.Bool("start_frame_buffer", true, "If true, start an Xvfb subprocess and run the browsers in that X server.")
25
26 vkLoginUrl = flag.String("vk_login_url", "https://vk.com/login", "Vk Login Url, default: https://vk.com/login")
27 emailSelector = flag.String("email_selector", "#email", "Email Selector, default: #email")
28 passSelector = flag.String("pass_selector", "#pass", "Email Selector, default: #pass")
29 loginButtonSelector = flag.String("login_button_selector", "#login_button", "Pass Selector, default: #login_button")
30 pageNameSelector = flag.String("page_name_selector", ".page_name", "Page name Selector, default: .page_name")
31
32 vkUserEmail = flag.String("vk_user_email", "*@gmail.com", "Usage for email input")
33 vkUserPass = flag.String("vk_user_pass", "*", "Usage for pass input")
34
35 caps selenium.Capabilities
36 service *selenium.Service
37 wd selenium.WebDriver
38
39 vkUserInfo VkUserInfo
40)
41
42type config struct {
43 addr, browser, path string
44 sauce *sauce.Capabilities
45 seleniumVersion semver.Version
46 serviceOptions []selenium.ServiceOption
47}
48
49type VkUserInfo struct {
50 email, password string
51}
52
53func main() {
54 var err error
55
56 fmt.Println("Start script...")
57
58 // ПарÑим заполненные ключи из командной Ñтроки
59 flag.Parse()
60
61 // загружаем данные Ñ„Ñйка Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° по нему
62 loadVkUserInfo()
63
64 // загружаем вÑе Ð´Ð»Ñ Firefox драйвера
65 loadFirefoxDriver(*geckoDriverPath, config{
66 path: *firefoxBinarySelenium3,
67 })
68
69 /*if err = checkUserAgent(); err != nil {
70 time.Sleep(time.Second * 1000)
71 return
72 }*/
73
74 // Проходим авторизацию в вк
75 if err = authVk(); err != nil {
76 log.Fatalln(err)
77 //log.Println(err)
78 }
79}
80
81func loadVkUserInfo() {
82 vkUserInfo.email = *vkUserEmail
83 vkUserInfo.password = *vkUserPass
84}
85
86func authVk() (error) {
87 var err error
88
89 // Отложенное закрытие драйвера и ÑервиÑа.
90 defer service.Stop()
91 defer wd.Quit()
92
93 // Переходим на форму авторизации
94 if err = loadVkLoginPage(); err != nil {
95 return err
96 }
97
98 if err = printCurrentUrl(); err != nil {
99 return err
100 }
101
102 // ЗаполнÑем поле email
103 if err = fillEmail(); err != nil {
104 return err
105 }
106
107 time.Sleep(500 * time.Millisecond)
108
109 // ЗаполнÑем поле pass
110 if err = fillPassword(); err != nil {
111 return err
112 }
113
114 time.Sleep(500 * time.Millisecond)
115
116 //return errors.New("before submitForm")
117 //log.Fatalln("before submitForm")
118
119 // Сабмитим форму авторизации Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²Ðº
120 if err = submitForm(); err != nil {
121 return err
122 }
123
124 time.Sleep(1500 * time.Millisecond)
125
126 //return errors.New("after submitForm")
127 //log.Fatalln("after submitForm")
128
129 if err = checkLoginSuccess(); err != nil {
130 return err
131 }
132
133 // Переходим на Ñтраницу (Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¾ÐºÐµÐ½Ð°)|(привÑзку Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ðº профилю и получение токена)
134 if err = loadAuthVkPage(); err != nil {
135 return err
136 }
137
138 time.Sleep(1500 * time.Millisecond)
139
140 if err = loadAuthToken(); err != nil {
141 return err
142 }
143
144 return nil
145}
146
147func loadAuthToken() (error) {
148 var (
149 err error
150 acceptButton selenium.WebElement
151 currentUrl string
152 )
153
154 for i := 0; i < 5; i++ {
155 acceptButton, err = wd.FindElement(selenium.ByCSSSelector, ".flat_button.fl_r.button_indent")
156 if err != nil {
157 err = errors.New("WebDriver can not acceptButton, returned error: " + err.Error())
158 time.Sleep(1 * time.Second)
159 continue
160 }
161
162 break
163 }
164
165 if err != nil {
166
167 }
168
169 if err == nil {
170 if err = acceptButton.Click(); err != nil {
171 return err
172 } else if err = printCurrentUrl(); err != nil {
173 return err
174 }
175
176 return nil
177 } else if err = printCurrentUrl(); err != nil {
178 return err
179 }
180
181 return nil
182}
183
184func loadVkLoginPage() (error) {
185 var err error
186
187 if err = wd.Get(*vkLoginUrl); err != nil {
188 //log.Fatalf("WebDriver can not Get(someUrl) returned error: %v", err)
189 return errors.New("WebDriver can not Get(someUrl) returned error: " + err.Error())
190 }
191
192 if err = setPageLoadTimeout(); err != nil {
193 //log.Fatalln(err)
194 return err
195 }
196
197 return nil
198}
199
200func printCurrentUrl() (error) {
201 currentURL, err := wd.CurrentURL()
202 if err != nil {
203 //log.Fatalln("WebDriver can not CurrentURL() returned error: %v", err)
204 return errors.New("WebDriver can not CurrentURL() returned error: " + err.Error())
205 }
206
207 log.Println("currentURL: ", currentURL)
208
209 return nil
210}
211
212func getCurrentUrl() (string, error) {
213 currentURL, err := wd.CurrentURL()
214 if err != nil {
215 return "", errors.New("WebDriver can not CurrentURL() returned error: " + err.Error())
216 }
217
218 return currentURL, nil
219}
220
221func fillEmail() (error) {
222 emailField, err := wd.FindElement(selenium.ByCSSSelector, *emailSelector)
223 if err != nil {
224 //log.Fatalf("WebDriver can not FindElement, returned error: %v", err)
225 return errors.New("WebDriver can not FindElement, returned error: " + err.Error())
226 }
227
228 if err := emailField.Clear(); err != nil {
229 //log.Fatalf("WebDriver can not Clear emailField, returned error: %v", err)
230 return errors.New("WebDriver can not Clear emailField, returned error: " + err.Error())
231 }
232
233 err = emailField.SendKeys(vkUserInfo.email)
234 if err != nil {
235 //log.Fatalf("WebDriver can not SendKeys to emailField, returned error: %v", err)
236 return errors.New("WebDriver can not SendKeys to emailField, returned error: " + err.Error())
237 }
238
239 return nil
240}
241
242func fillPassword() (error) {
243 passField, err := wd.FindElement(selenium.ByCSSSelector, *passSelector)
244 if err != nil {
245 //log.Fatalf("WebDriver can not FindElement, returned error: %v", err)
246 return errors.New("WebDriver can not FindElement, returned error: " + err.Error())
247 }
248
249 if err := passField.Clear(); err != nil {
250 //log.Fatalf("WebDriver can not Clear passField, returned error: %v", err)
251 return errors.New("WebDriver can not Clear passField, returned error: " + err.Error())
252 }
253
254 err = passField.SendKeys(vkUserInfo.password)
255 if err != nil {
256 //log.Fatalf("WebDriver can not SendKeys to passField, returned error: %v", err)
257 return errors.New("WebDriver can not SendKeys to passField, returned error: " + err.Error())
258 }
259
260 //printPassInputValue(passField)
261
262 return nil
263}
264
265func submitForm() (error) {
266 btn, err := wd.FindElement(selenium.ByCSSSelector, *loginButtonSelector)
267 if err != nil {
268 //log.Fatalln(err)
269 return err
270 }
271
272 if err := btn.Click(); err != nil {
273 //log.Fatalln(err)
274 return err
275 }
276
277 return nil
278}
279
280func checkLoginSuccess() (error) {
281 log.Println("start checkLoginSuccess")
282
283 var (
284 err error
285 pageName selenium.WebElement
286 pageNameText string
287 )
288
289 for i := 0; i < 5; i++ {
290 pageName, err = wd.FindElement(selenium.ByCSSSelector, *pageNameSelector)
291 if err != nil {
292 time.Sleep(1 * time.Second)
293 continue
294 }
295
296 break
297 }
298
299 for i := 0; i < 5; i++ {
300 pageNameText, err = pageName.Text()
301 if err != nil {
302 continue
303 }
304 if pageNameText != "Waiting for remote server..." {
305 break
306 }
307 time.Sleep(1 * time.Second)
308 }
309
310 if err != nil {
311 return err
312 }
313
314 log.Println(pageNameText)
315
316 return nil
317}
318
319func loadAuthVkPage() (error) {
320 var err error
321
322 if err = wd.Get(vkAuthUrl); err != nil {
323 //log.Fatalln(err)
324 return err
325 }
326
327 /*if err = setPageLoadTimeout(); err != nil {
328 //log.Fatalln(err)
329 return err
330 }*/
331
332 return nil
333}
334
335func printPassInputValue(passField selenium.WebElement) {
336 var output string
337 for {
338 output, err := passField.GetAttribute("value")
339 if err != nil {
340 log.Fatalln(err)
341 }
342 if output != "Waiting for remote server..." {
343 break
344 }
345 time.Sleep(time.Millisecond * 100)
346 }
347 fmt.Println("output: ", output)
348}
349
350func setPageLoadTimeout() (error) {
351 if err := wd.SetPageLoadTimeout(1 * time.Second); err != nil {
352 //log.Fatalf("wd.SetImplicitWaitTimeout() returned error: %v", err)
353 return errors.New("wd.SetImplicitWaitTimeout() returned error: " + err.Error())
354 }
355
356 return nil
357}
358
359func loadFirefoxDriver(webDriverPath string, c config) {
360 c.browser = "firefox"
361
362 if *startFrameBuffer {
363 c.serviceOptions = append(c.serviceOptions, selenium.StartFrameBuffer())
364 }
365
366 port, err := pickUnusedPort()
367 if err != nil {
368 log.Fatalf("pickUnusedPort() returned error: %v", err)
369 }
370 c.addr = fmt.Sprintf("http://127.0.0.1:%d", port)
371
372 /*if s, err := os.Stat(c.path); err != nil || !s.Mode().IsRegular() {
373 if path, err := exec.LookPath(c.path); err == nil {
374 c.path = path
375 } else {
376 t.Skipf("Skipping Firefox tests because binary %q not found", c.path)
377 }
378 }*/
379
380 /*if testing.Verbose() {
381 SetDebug(true)
382 c.serviceOptions = append(c.serviceOptions, Output(os.Stderr))
383 }*/
384
385 service, err = selenium.NewGeckoDriverService(webDriverPath, port, c.serviceOptions...)
386 if err != nil {
387 log.Fatalln(err)
388 }
389 //defer service.Stop()
390
391 wd, err = selenium.NewRemote(getFirefoxCapabilities(), c.addr)
392 if err != nil {
393 log.Fatalln(err)
394 }
395 //defer wd.Quit()
396
397
398
399 /*runFirefoxSubTests(t, c)
400
401 if err := s.Stop(); err != nil {
402 t.Fatalf("Error stopping the Selenium service: %v", err)
403 }*/
404}
405
406func getFirefoxCapabilities() (selenium.Capabilities) {
407 caps = selenium.Capabilities{"browserName": "firefox"}
408
409 f, ok := caps[firefox.CapabilitiesKey].(firefox.Capabilities)
410 if !ok || f.Prefs == nil {
411 f.Prefs = make(map[string]interface{})
412 }
413
414 f.Prefs["general.useragent.override"] = getRandomUserAgent()
415 caps.AddFirefox(f)
416
417 return caps
418}
419
420func getRandomUserAgent() (string) {
421
422 userAgentList := map[int]string{
423 0: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
424 1: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36",
425 2: "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36",
426
427 3: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0",
428 4: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0",
429 5: "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0",
430 }
431
432 randomKey := randomInt(0, len(userAgentList) - 1);
433
434 return userAgentList[randomKey]
435}
436
437func randomInt(min, max int) int {
438 rand.Seed(time.Now().Unix())
439 return rand.Intn(max - min) + min
440}
441
442func pickUnusedPort() (int, error) {
443 addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:0")
444 if err != nil {
445 return 0, err
446 }
447
448 l, err := net.ListenTCP("tcp", addr)
449 if err != nil {
450 return 0, err
451 }
452 port := l.Addr().(*net.TCPAddr).Port
453 if err := l.Close(); err != nil {
454 return 0, err
455 }
456 return port, nil
457}
458
459
460func checkUserAgent() (error) {
461 var err error
462
463 if err = wd.Get("http://www.useragentstring.com/"); err != nil {
464 //log.Fatalf("WebDriver can not Get(someUrl) returned error: %v", err)
465 return errors.New("WebDriver can not Get(someUrl) returned error: " + err.Error())
466 }
467
468 if err = setPageLoadTimeout(); err != nil {
469 return err
470 }
471
472 userAgentField, err := wd.FindElement(selenium.ByCSSSelector, "#uas_textfeld")
473 if err != nil {
474 //log.Fatalf("WebDriver can not FindElement, returned error: %v", err)
475 return errors.New("WebDriver can not userAgentField, returned error: " + err.Error())
476 }
477
478 var userAgentFieldText string
479 for {
480 userAgentFieldText, err = userAgentField.Text()
481 if err != nil {
482 return err
483 }
484 if userAgentFieldText != "Waiting for remote server..." {
485 break
486 }
487 time.Sleep(time.Millisecond * 100)
488 }
489
490 fmt.Println("userAgentFieldText: ", userAgentFieldText)
491
492 return nil
493}