{"id":269873,"date":"2015-12-08T13:08:03","date_gmt":"2015-12-08T10:08:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=269873"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=269873","title":{"rendered":"\u0427\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0441\u0430\u0439\u0442 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c. \u041e\u0441\u043d\u043e\u0432\u044b webdriver API"},"content":{"rendered":"<p>       <a href=\"http:\/\/habrahabr.ru\/post\/237869\/\">\u041f\u043e\u0438\u0441\u043a \u0436\u0438\u043b\u044c\u044f<\/a>, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u0432\u0430\u0440\u0430\u0445, \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0439, <a href=\"http:\/\/habrahabr.ru\/post\/244193\/\">\u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432<\/a>, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0444\u0438\u0440\u043c\u044b \u0441 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c\u0438, \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u0432 \u0441\u0435\u0442\u0438.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/023\/f78\/7cc\/023f787cc19746b7906d9fa1abdd335f.png\"\/><br \/>  \u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0443\u043c\u0435\u043d\u0438\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432 \u0436\u0438\u0437\u043d\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0435. \u041d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e webdriver API. \u0412 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 github. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u043a\u0440\u0438\u043d\u043a\u0430\u0441\u0442 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u0431\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0432\u043e\u0434 \u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c, \u0449\u0435\u043b\u0447\u043e\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0435\u0451 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0441\u0430\u0439\u0442\u0430 \u0438 \u0442.\u043f.<\/p>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b webdriver \u043d\u0443\u0436\u043d\u043e \u0434\u0432\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430: \u0431\u0440\u0430\u0443\u0437\u0435\u0440\/\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c webdriver API \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d: <a href=\"http:\/\/www.seleniumhq.org\/download\/#client-drivers\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b<\/a> webdriver \u0435\u0441\u0442\u044c \u0434\u043b\u044f C#, Ruby, Python, Javascript(Node), \u0430 \u0442\u0430\u043a \u0436\u0435 <a href=\"http:\/\/www.seleniumhq.org\/download\/#thirdPartyLanguageBindings\">\u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430<\/a> \u0434\u043b\u044f Perl, Perl 6, PHP, Haskell, Objective-C, Javascript, R, Dart, Tcl. <br \/>  \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 Webdriver \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c W3C, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0441\u0435 \u0435\u0449\u0435 <a href=\"http:\/\/www.w3.org\/TR\/webdriver\/\">\u0438\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430<\/a>. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e Webdriver API \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 selenium \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 Selenium-RC API.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u00ab\u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439\u00bb \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c. \u0415\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430:  <\/p>\n<ul>\n<li>AndroidDriver<\/li>\n<li>ChromeDriver<\/li>\n<li>FirefoxDriver<\/li>\n<li>InternetExplorerDriver<\/li>\n<li>SafariDriver<\/li>\n<\/ul>\n<p>  \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430:  <\/p>\n<ul>\n<li>HtmlUnitDriver \u2014 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 HtmlUnit-\u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0442\u043e\u043c \u0436\u0435 java \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u0447\u0442\u043e \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c  <\/li>\n<li>PhantomJSDriver \u2014 \u044d\u0442\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 webkit \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 (headless) \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.  <\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0443\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438&#8230;<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/8a4\/1e4\/719\/8a41e4719de04453849e15466632d266.png\"\/>  <\/div>\n<\/div>\n<h2>\u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0435<\/h2>\n<p>  \u0418\u0442\u0430\u043a, \u043d\u0430\u0448 \u0432\u044b\u0431\u043e\u0440 <a href=\"http:\/\/phantomjs.org\">phantomjs<\/a>. \u042d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 webdriver. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f javascript (\u0432 \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 htmlunit). \u0415\u0441\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043d\u0430 javascript \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435, \u0442\u043e phantomJS \u043c\u043e\u0436\u0435\u0442 \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438 \u0431\u0435\u0437 \u0432\u0435\u0431\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0438 \u0434\u0430\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c5b\/625\/8dc\/c5b6258dccb14526adf15f8c73ba513b.png\"\/><br \/>  \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0438\u0436\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a API \u0434\u043b\u044f java\/groovy. \u0412 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0445\u043e\u0436.<\/p>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0432\u0435\u0431\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c.<\/h3>\n<p>  <\/p>\n<blockquote><p>String phantomJsPath = PhantomJsDowloader.getPhantomJsPath() <\/p><\/blockquote>\n<p>  \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 phantomjs \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f maven, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u044d\u0442\u043e\u043c\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443. \u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0438\u0437 maven: com.github.igor-suhorukov:phantomjs-runner:1.1<\/p>\n<p>  \u042d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u0435\u0431\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c\u0441\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c<\/h3>\n<p>  <\/p>\n<blockquote><p>WebDriver driver = new PhantomJSDriver(settings)<\/p><\/blockquote>\n<p>  \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u043f\u043e webdriver \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 phantomjs \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443<\/p>\n<h3>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443<\/h3>\n<p>  <\/p>\n<blockquote><p>driver.get(url)<\/p><\/blockquote>\n<p>  \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430<\/p>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0443 \u043d\u0430\u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e<\/h3>\n<p>  <\/p>\n<pre><code class=\"java\">WebElement leftmenu = driver.findElement(By.id(&quot;leftmenu&quot;)) List&lt;WebElement&gt; linkList = leftmenu.findElements(By.tagName(&quot;a&quot;)) <\/code><\/pre>\n<p>  \u0423 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 driver \u0438 \u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0435\u0433\u043e, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430: findElement, findElements. \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u0431\u0440\u043e\u0441\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 NoSuchElementException, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u0412\u0442\u043e\u0440\u043e\u0439 \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c org.openqa.selenium.By:  <\/p>\n<ul>\n<li>id<\/li>\n<li>name<\/li>\n<li>tagName<\/li>\n<li>xpath<\/li>\n<li>className<\/li>\n<li>cssSelector<\/li>\n<li>linkText<\/li>\n<li>partialLinkText<\/li>\n<\/ul>\n<p>  \u042f \u0431\u0443\u0434\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c id, tagName \u0438 xpath. \u0414\u043b\u044f \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u0441 xpath \u2014 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 <a href=\"http:\/\/zvon.org\/comp\/r\/tut-XPath_1.html#intro\">\u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445<\/a> \u0438\u043b\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u044c\u044f\u043c, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0447\u0442\u0435\u043d\u0438\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<h3>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0438 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439<\/h3>\n<p>  \u0421 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:  <\/p>\n<ul>\n<li>menuItem.click() \u2014 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043a\u043b\u0438\u043a<\/li>\n<li>inputField.sendKeys(\u00abblah-blah\u00bb) \u2014 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448<\/li>\n<li>formButton.submit() \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435 submit<\/li>\n<\/ul>\n<p>  <\/p>\n<blockquote><p>driver.getScreenshotAs(type)<\/p><\/blockquote>\n<p>  \u0414\u0435\u043b\u0430\u0435\u0442 \u0441\u043d\u0438\u043c\u043e\u043a \u043e\u043a\u043d\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043d\u0438\u043c\u043a\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/github.com\/yandex-qatools\/ashot\">aShot<\/a> \u2014 \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043e\u043a\u043d\u0435 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0430\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u043a:  <\/p>\n<ul>\n<li>OutputType.BASE64 \u2014 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u044d\u0442\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 HTML embedded \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443<\/li>\n<li>OutputType.BYTES \u2014 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442 \u0438 \u0432\u0435\u0440\u0442\u0438\u0441\u044c \u0441 \u043d\u0438\u043c \u043a\u0430\u043a \u0443\u043c\u0435\u0435\u0448\u044c<\/li>\n<li>OutputType.FILE \u2014 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0430\u043c\u044b\u0439 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431<\/li>\n<\/ul>\n<h3>\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c<\/h3>\n<p>  <\/p>\n<blockquote><p>driver.quit()<\/p><\/blockquote>\n<p>  \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 phantomjs<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 1: \u0413\u0443\u043b\u044f\u0435\u043c groovy \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u043f\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u044f\u043c \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438<\/h2>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443  <\/p>\n<blockquote><p>java -jar <a href=\"http:\/\/central.maven.org\/maven2\/com\/github\/igor-suhorukov\/groovy-grape-aether\/2.4.5.1\/groovy-grape-aether-2.4.5.1.jar\">groovy-grape-aether-2.4.5.1.jar<\/a> <a href=\"https:\/\/raw.githubusercontent.com\/igor-suhorukov\/crawler-example\/master\/crawler.groovy\">crawler.groovy<\/a> http: \/\/??.com\/catalog.php<\/p><\/blockquote>\n<p>  \u0421\u043a\u0440\u0438\u043f\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a html \u0444\u0430\u0439\u043b\u0443, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u0412 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0446\u0441\u0435\u0442\u0438 \u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0417\u0430\u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0433\u0440\u0443\u0432\u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e groovy-grape-aether-2.4.5.1<\/b><\/p>\n<div class=\"spoiler_text\">\u041f\u0440\u043e \u0441\u0431\u043e\u0440\u043a\u0443 \u0433\u0440\u0443\u0432\u0438 <a href=\"http:\/\/central.maven.org\/maven2\/com\/github\/igor-suhorukov\/groovy-grape-aether\/2.4.5.1\/groovy-grape-aether-2.4.5.1.jar\">groovy-grape-aether-2.4.5.1.jar<\/a> \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/270145\/\">\u00ab\u0423\u043b\u0438\u0447\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u0438\u043b\u0438 \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 Groovy, Ivy \u0438 Maven?\u00bb<\/a>. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 groovy-all-2.4.5.jar \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 Grape \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <a href=\"http:\/\/ant.apache.org\/ivy\/\">ivy<\/a> \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"http:\/\/www.eclipse.org\/aether\/\">aether<\/a>, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f\u043c \u0432 \u0441\u0431\u043e\u0440\u043a\u0435.  <\/div>\n<\/div>\n<p>  <a href=\"https:\/\/github.com\/igor-suhorukov\/crawler-example\/blob\/master\/crawler.groovy\">crawler.groovy<\/a>  <\/p>\n<pre><code>package com.github.igorsuhorukov.phantomjs  @Grab(group='commons-io', module='commons-io', version='2.2') import org.apache.commons.io.IOUtils @Grab(group='com.github.detro', module='phantomjsdriver', version='1.2.0') import org.openqa.selenium.* import org.openqa.selenium.phantomjs.PhantomJSDriver import org.openqa.selenium.phantomjs.PhantomJSDriverService import org.openqa.selenium.remote.DesiredCapabilities @Grab(group='com.github.igor-suhorukov', module='phantomjs-runner', version='1.1') import com.github.igorsuhorukov.phantomjs.PhantomJsDowloader  public class Crawler {     public static final java.lang.String USER_AGENT = &quot;Mozilla\/5.0 (Windows NT 6.1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/41.0.2228.0 Safari\/537.36&quot;      public static void run(String baseUrl) {          def phantomJsPath = PhantomJsDowloader.getPhantomJsPath()          def DesiredCapabilities settings = new DesiredCapabilities()         settings.setJavascriptEnabled(true)         settings.setCapability(&quot;takesScreenshot&quot;, true)         settings.setCapability(&quot;userAgent&quot;, com.github.igorsuhorukov.phantomjs.Crawler.USER_AGENT)         settings.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, phantomJsPath)          def WebDriver driver = new PhantomJSDriver(settings)          def randomUrl = null         def lastVisited=null         def name=null          boolean pass=true         while (pass){             try {                 randomUrl = getUrl(driver, baseUrl)                 driver.get(randomUrl)                 def titleElement = driver.findElement(By.id(&quot;title&quot;))                 lastVisited = titleElement.findElement(By.id(&quot;profile_time_lv&quot;)).getText()                 name = titleElement.findElement(By.tagName(&quot;a&quot;)).getText()                 pass=false             } catch (NoSuchElementException e) {                 System.out.println(e.getMessage()+&quot;. Try again.&quot;)             }         }         String screenshotAs = driver.getScreenshotAs(OutputType.BASE64)         File resultFile = File.createTempFile(&quot;phantomjs&quot;, &quot;.html&quot;)         OutputStreamWriter streamWriter = new OutputStreamWriter(new FileOutputStream(resultFile), &quot;UTF-8&quot;)         IOUtils.write(&quot;&quot;&quot;&lt;html&gt;&lt;head&gt;&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text\/html; charset=UTF-8&quot;&gt;&lt;\/head&gt;&lt;body&gt;                                 &lt;p&gt;${name}&lt;\/p&gt;&lt;p&gt;${lastVisited}&lt;\/p&gt;                                 &lt;img alt=&quot;Embedded Image&quot; src=&quot;data:image\/png;base64,${screenshotAs}&quot;&gt;&lt;\/body&gt;                         &lt;\/html&gt;&quot;&quot;&quot;, streamWriter)         IOUtils.closeQuietly(streamWriter)          println &quot;html ${resultFile} created&quot;          driver.quit();     }      static String getUrl(WebDriver driver, String baseUrl) {          driver.get(baseUrl)          def elements =  driver.findElements(By.xpath(&quot;\/\/div[@id='content']\/\/a&quot;))         def element = elements.get((int) Math.ceil(Math.random() * elements.size()))         String randomUrl = element.getAttribute(&quot;href&quot;)         randomUrl.contains(&quot;catalog&quot;) ? getUrl(driver, randomUrl) : randomUrl     } }  Crawler.run(this.args.getAt(0)) <\/code><\/pre>\n<p>  \u0425\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u044e\u0449\u0438\u0435 \u0433\u0440\u0443\u0432\u0438, \u0437\u0430\u043c\u0435\u0442\u044f\u0442 \u0447\u0442\u043e <a href=\"http:\/\/www.gebish.org\">Geb<\/a> \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u043e \u043f\u0440\u044f\u0447\u0435\u0442 \u0437\u0430 \u0441\u0432\u043e\u0438\u043c DSL \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 webdriver, \u0442\u043e \u0432 \u043d\u0430\u0448\u0438\u0445 \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445 Geb \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0418\u0437 \u044d\u0441\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0436\u0435 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u044f \u0441 \u0432\u0430\u043c\u0438 \u0441\u043e\u0433\u043b\u0430\u0448\u0443\u0441\u044c!<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 2: \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438\u0437 java-source \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043d\u0430 java<\/h2>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <a href=\"https:\/\/github.com\/igor-suhorukov\/java-webdriver-example\">github.com\/igor-suhorukov\/java-webdriver-example<\/a><br \/>  \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0443\u0436\u043d\u0430 java8, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u0438\u043c\u044b \u0438 try-with-resources<\/p>\n<blockquote><p>git clone https:\/\/ github.com\/igor-suhorukov\/java-webdriver-example.git<br \/>  mvn clean package -Dexec.args=\u00abhttp:\/\/ java-source.net\u00bb  <\/p><\/blockquote>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e xpath \u0438 axis \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/github.com\/igor-suhorukov\/java-webdriver-example\/blob\/master\/src\/main\/java\/com\/github\/igorsuhorukov\/webdriver\/example\/Project.java\">Project<\/a>  <\/p>\n<pre><code class=\"java\">WebElement main = driver.findElement(By.id(&quot;main&quot;)); name = main.findElement(By.tagName(&quot;h3&quot;)).getText(); description = main.findElement(By.xpath(&quot;\/\/h3\/following-sibling::table\/tbody\/tr\/td[1]&quot;)).getText(); link = main.findElement(By.xpath(&quot;\/\/td[text()='HomePage']\/following-sibling::*&quot;)).getText(); license = main.findElement(By.xpath(&quot;\/\/td[text()='License']\/following-sibling::*&quot;)).getText(); <\/code><\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0427\u0430\u0441\u0442\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u0430\u0439\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u0424\u0430\u0439\u043b\u0430 projects.xml &#8212; \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt; &lt;projects source=&quot;http:\/\/java-source.net&quot;&gt;     &lt;category&gt;         &lt;category&gt;Open Source Ajax Frameworks&lt;\/category&gt;         &lt;project&gt;             &lt;name&gt;DWR&lt;\/name&gt;             &lt;description&gt;DWR is a Java open source library which allows you to write Ajax web sites. It allows code in a browser to use Java functions running on a web server just as if it was in the browser. DWR works by dynamically generating Javascript based on Java classes. The code does some Ajax magic to make it feel like the execution is happening on the browser, but in reality the server is executing the code and DWR is marshalling the data back and forwards.&lt;\/description&gt;             &lt;license&gt;Apache Software License&lt;\/license&gt;             &lt;link&gt;http:\/\/getahead.org\/dwr&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;Google Web Toolkit&lt;\/name&gt;             &lt;description&gt;Google Web Toolkit (GWT) is an open source Java software development framework that makes writing AJAX applications like Google Maps and Gmail easy for developers who don't speak browser quirks as a second language. Writing dynamic web applications today is a tedious and error-prone process; you spend 90% of your time working around subtle incompatibilities between web browsers and platforms, and JavaScript's lack of modularity makes sharing, testing, and reusing AJAX components difficult and fragile. GWT lets you avoid many of these headaches while offering your users the same dynamic, standards-compliant experience. You write your front end in the Java programming language, and the GWT compiler converts your Java classes to browser-compliant JavaScript and HTML.&lt;\/description&gt;             &lt;license&gt;Apache Software License&lt;\/license&gt;             &lt;link&gt;http:\/\/code.google.com\/webtoolkit\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;Echo2&lt;\/name&gt;             &lt;description&gt;Echo2 is the next-generation of the Echo Web Framework, a platform for developing web-based applications that approach the capabilities of rich clients. The 2.0 version holds true to the core concepts of Echo while providing dramatic performance, capability, and user-experience enhancements made possible by its new Ajax-based rendering engine.&lt;\/description&gt;             &lt;license&gt;Mozilla Public License&lt;\/license&gt;             &lt;link&gt;http:\/\/www.nextapp.com\/platform\/echo2\/echo\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;ICEfaces&lt;\/name&gt;             &lt;description&gt;ICEfaces is an integrated Ajax application framework that enables Java EE application developers to easily create and deploy thin-client rich Internet applications (RIA) in pure Java. ICEfaces leverages the entire standards-based Java EE ecosystem of tools and execution environments. Rich enterprise application features are developed in pure Java, and in a pure thin-client model. There are no Applets or proprietary browser plug-ins required. ICEfaces applications are JavaServer Faces (JSF) applications, so Java EE application development skills apply directly and Java developers are isolated from doing any JavaScript related development.&lt;\/description&gt;             &lt;license&gt;Mozilla Public License&lt;\/license&gt;             &lt;link&gt;http:\/\/www.icefaces.org&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;SweetDEV RIA&lt;\/name&gt;             &lt;description&gt;SweetDEV RIA is a complete set of world-class Ajax tags in Java\/J2EE. It helps you to design Rich GUI in a thin client. SweetDEV RIA provides you Out-Of-The-Box Ajax tags. Continue to develop your application with frameworks like Struts or JSF. SweetDEV RIA tags can be plugged into your JSP pages.&lt;\/description&gt;             &lt;license&gt;Apache Software License&lt;\/license&gt;             &lt;link&gt;http:\/\/sweetdev-ria.ideotechnologies.com&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;ItsNat, Natural AJAX&lt;\/name&gt;             &lt;description&gt;ItsNat is an open source (dual licensed GNU Affero General Public License v3\/commercial license for closed source projects) Java AJAX Component based Web Framework. It offers a natural approach to the modern Web 2.0 development. ItsNat simulates a Universal W3C Java Browser in the server. The server mimics the behavior of a web browser, containing a W3C DOM Level 2 node tree and receiving W3C DOM Events using AJAX. Every DOM server change is automatically sent to the client and updated the client DOM accordingly. Consequences: pure (X)HTML templates and pure Java W3C DOM for the view logic. No JSP, no custom tags, no XML meta-programming, no expression languages, no black boxed components where the developer has absolute control of the view. ItsNat provides an, optional, event based (AJAX) Component System, inspired in Swing and reusing Swing as far as possible such as data and selection models, where every DOM element or element group can be easily a component.&lt;\/description&gt;             &lt;license&gt;GNU General Public License (GPL)&lt;\/license&gt;             &lt;link&gt;http:\/\/www.itsnat.org&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;ThinWire&lt;\/name&gt;             &lt;description&gt;ThinWire is an development framework that allows you to easily build applications for the web that have responsive, expressive and interactive user interfaces without the complexity of the alternatives. While virtually any web application can be built with ThinWire, when it comes to enterprise applications, the framework excels with its highly interactive and rich user interface components.&lt;\/description&gt;             &lt;license&gt;GNU Library or Lesser General Public License (LGPL)&lt;\/license&gt;             &lt;link&gt;http:\/\/www.thinwire.com\/&lt;\/link&gt;         &lt;\/project&gt;     &lt;\/category&gt;     &lt;category&gt;         &lt;category&gt;Open Source Aspect-Oriented Frameworks&lt;\/category&gt;         &lt;project&gt;             &lt;name&gt;AspectJ&lt;\/name&gt;             &lt;description&gt;AspectJ is a seamless aspect-oriented extension to the Java programming language, Java platform compatible and easy to learn and use. AspectJ enables the clean modularization of crosscutting concerns such as: error checking and handling, synchronization, context-sensitive behavior, performance optimizations, monitoring and logging, debugging support, multi-object protocols.&lt;\/description&gt;             &lt;license&gt;Mozilla Public License&lt;\/license&gt;             &lt;link&gt;http:\/\/eclipse.org\/aspectj\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;AspectWerkz&lt;\/name&gt;             &lt;description&gt;AspectWerkz is a dynamic, lightweight and high-performant AOP framework for Java. AspectWerkz offers both power and simplicity and will help you to easily integrate AOP in both new and existing projects. AspectWerkz utilizes runtime bytecode modification to weave your classes at runtime. It hooks in and weaves classes loaded by any class loader except the bootstrap class loader. It has a rich and highly orthogonal join point model. Aspects, advices and introductions are written in plain Java and your target classes can be regular POJOs. You have the possibility to add, remove and re-structure advice as well as swapping the implementation of your introductions at runtime. Your aspects can be defined using either an XML definition file or using runtime attributes.&lt;\/description&gt;             &lt;license&gt;GNU Library or Lesser General Public License (LGPL)&lt;\/license&gt;             &lt;link&gt;http:\/\/aspectwerkz.codehaus.org\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;Nanning&lt;\/name&gt;             &lt;description&gt;Nanning Aspects is a simple yet scaleable aspect-oriented framework for Java.&lt;\/description&gt;             &lt;license&gt;BSD License&lt;\/license&gt;             &lt;link&gt;http:\/\/nanning.codehaus.org\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;JBossAOP&lt;\/name&gt;             &lt;description&gt;JBoss-AOP allows you to apply interceptor technology and patterns to plain Java classes and Dynamic Proxies. It includes: * Java Class Interception. Field, constructor, and method interception, public, private, protected, and package protected, static and class members. * Fully compositional pointcuts caller side for methods and constructors, control flow, annotations. * Aspect classes Advices can be incapsulated in scoped Java classes * Hot-Deploy. Interceptors can be deployed, undeployed, and redeployed at runtime for both dynamic proxies and classes.(working) * Introductions. The ability to add any arbitrary interface to a Java class. Either an interceptor or a 'mixin' class can service method calls for the attached interfaces. * Dynamic Proxies. The ability to define a dynamic proxy and an interceptor chain for it. Proxies can either be created from an existing class, or from a set of interfaces ala java.lang.reflect.Proxy. * Metadata and Attribute Programming. The ability to define and attach metadata configuration to your classes or dynamic proxies. Interceptors can be triggered when metadata is added to a class. We also have Metadata Chains, the ability to define defaults at the cluster and application level, as well as the ability to override configuration at runtime for a specific method call. * Dynamic AOP. All aspected objects can be typecasted to an AOP api. You can do things like add\/remove new interceptors to a specific instance or add\/remove instance configuration\/metadata at runtime.&lt;\/description&gt;             &lt;license&gt;GNU Library or Lesser General Public License (LGPL)&lt;\/license&gt;             &lt;link&gt;http:\/\/www.jboss.org\/products\/aop&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;dynaop&lt;\/name&gt;             &lt;description&gt;dynaop, a proxy-based Aspect-Oriented Programming (AOP) framework, enhances Object-Oriented (OO) design in the following areas: code reuse decomposition dependency reduction&lt;\/description&gt;             &lt;license&gt;Apache Software License&lt;\/license&gt;             &lt;link&gt;https:\/\/dynaop.dev.java.net\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;CAESAR&lt;\/name&gt;             &lt;description&gt;CAESAR is a new aspect-oriented programming language compatible to Java, that is, all Java programs will run with CAESAR.&lt;\/description&gt;             &lt;license&gt;GNU General Public License (GPL)&lt;\/license&gt;             &lt;link&gt;http:\/\/caesarj.org\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;EAOP&lt;\/name&gt;             &lt;description&gt;Event-based Aspect-Oriented Programming (EAOP) for Java. EAOP 1.0 realizes the EAOP model through the following characteristics: * Expressive crosscuts: execution points can be represented by events and crosscuts can be expressed which denote arbitrary relations between events. * Explicit aspect composition: Aspects may be combined using a (extensible) set of aspect composition operators. * Aspects of aspects: Aspects may be applied to other aspects. * Dynamic aspect management: Aspects may be instantiated, composed and destroyed at runtime.&lt;\/description&gt;             &lt;license&gt;GNU General Public License (GPL)&lt;\/license&gt;             &lt;link&gt;http:\/\/www.emn.fr\/x-info\/eaop\/tool.html&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;JAC&lt;\/name&gt;             &lt;description&gt;JAC (Java Aspect Components) is a project consisting in developing an aspect-oriented middleware layer.&lt;\/description&gt;             &lt;license&gt;GNU Library or Lesser General Public License (LGPL)&lt;\/license&gt;             &lt;link&gt;http:\/\/jac.objectweb.org\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;Colt&lt;\/name&gt;             &lt;description&gt;Open Source Libraries for High Performance Scientific and Technical Computing in Java&lt;\/description&gt;             &lt;license&gt;The Artistic License&lt;\/license&gt;             &lt;link&gt;http:\/\/hoschek.home.cern.ch\/hoschek\/colt\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;DynamicAspects&lt;\/name&gt;             &lt;description&gt;DynamicAspects enables you to do aspect-oriented programming in pure Java. Using the \\&quot;instrumentation\\&quot; and \\&quot;agent\\&quot; features introduced with Sun JDK 1.5, aspects can be installed and deinstalled during runtime!&lt;\/description&gt;             &lt;license&gt;BSD License&lt;\/license&gt;             &lt;link&gt;http:\/\/dynamicaspects.sourceforge.net\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;PROSE&lt;\/name&gt;             &lt;description&gt;The PROSE system (PROSE stands for PROgrammable extenSions of sErvices) is a dynamic weaving tool (allows inserting and withdrawing aspects to and from running applications) PROSE aspects are regular JAVA objects that can be sent to and be received from computers on the network. Signatures can be used to guarantee their integrity. Once an aspect has been inserted in a JVM, any occurrence of the events of interest results in the execution of the corresponding aspect advice. If an aspect is withdrawn from the JVM, the aspect code is discarded and the corresponding interception(s) will no longer take place.&lt;\/description&gt;             &lt;license&gt;Mozilla Public License&lt;\/license&gt;             &lt;link&gt;http:\/\/prose.ethz.ch\/Wiki.jsp?page=AboutProse&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;Azuki Framework&lt;\/name&gt;             &lt;description&gt;The Azuki Framework is a java application framework, designed to reduce the development, deployment and maintenance costs of software systems. The Azuki Framework provides also an unique combination of powerful design patterns (decorator, injection, intercepter, command, proxy...). It provides a rapid application assembly from known components in order to build large systems. The software conception is split into two main stages : * Creation of independent components (technical &amp; business service). * Definition of component dependencies (weaving)&lt;\/description&gt;             &lt;license&gt;GNU Library or Lesser General Public License (LGPL)&lt;\/license&gt;             &lt;link&gt;http:\/\/www.azuki-framework.org\/&lt;\/link&gt;         &lt;\/project&gt;         &lt;project&gt;             &lt;name&gt;CALI&lt;\/name&gt;             &lt;description&gt;CALI is a framework to prototype and compose Aspect-Oriented Programming Languages on top of Java. It is based on an abstract aspect language that its extensible to implement new AOPL. As proof of approach and methodology, the following language have been implemented: -AspectJ (Dynamic part of AspectJ, where intertype declartion can be implemented using regular AspectJ); -EAOPJ : An implementation of Event-Based AOP for Java; -COOL: A DSAL for coordination; -Decorator DSAL. You can use CALI to implement your new AOPL and compose it with existing implementation or using existing implementation to write your applications with aspects form different AOPL.&lt;\/description&gt;             &lt;license&gt;Other&lt;\/license&gt;             &lt;link&gt;http:\/\/www.emn.fr\/x-info\/cali\/&lt;\/link&gt;         &lt;\/project&gt;     &lt;\/category&gt; &lt;\/projects&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u044d\u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c ChromeDriver (org.seleniumhq.selenium:selenium-chrome-driver:2.48.2). \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 PhantomJS \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b: \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<p>  <iframe loading=\"lazy\" width=\"420\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/ZE5moQfe1qA?feature=oembed\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434<\/h2>\n<p>  Webdriver API \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u043e Id \u0442\u0435\u0433\u0430, CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0443 \u0438\u043b\u0438 XPath \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0438\u043c\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043d\u0435\u0439. \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0430\u0439\u0442\u043e\u043c. \u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438 \u0432\u0435\u0431\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f \u043d\u0435\u0433\u043e. \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 PhantomJS.<\/p>\n<p>  \u0423\u0434\u0430\u0447\u0438 \u0432 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 \u0432\u0435\u0431!               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/272105\/\"> http:\/\/habrahabr.ru\/post\/272105\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <a href=\"http:\/\/habrahabr.ru\/post\/237869\/\">\u041f\u043e\u0438\u0441\u043a \u0436\u0438\u043b\u044c\u044f<\/a>, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u0432\u0430\u0440\u0430\u0445, \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0439, <a href=\"http:\/\/habrahabr.ru\/post\/244193\/\">\u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432<\/a>, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0444\u0438\u0440\u043c\u044b \u0441 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c\u0438, \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u0432 \u0441\u0435\u0442\u0438.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/023\/f78\/7cc\/023f787cc19746b7906d9fa1abdd335f.png\"\/><br \/>  \u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0443\u043c\u0435\u043d\u0438\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432 \u0436\u0438\u0437\u043d\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0435. \u041d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e webdriver API. \u0412 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 github. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u043a\u0440\u0438\u043d\u043a\u0430\u0441\u0442 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-269873","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/269873","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=269873"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/269873\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=269873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=269873"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=269873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}