{"id":395043,"date":"2024-06-29T11:59:00","date_gmt":"2024-06-29T11:59:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=395043"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=395043","title":{"rendered":"<span>\u041a\u0430\u043a \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c Jmeter \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u043b\u044c\u044f \u0423\u043b\u0438\u0437\u043a\u043e, \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0414\u0411\u041e \u042e\u041b \u0432 \u0431\u043b\u043e\u043a\u0435 \u0426\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u00ab\u0420\u0421\u0425\u0411-\u0418\u043d\u0442\u0435\u0445\u00bb. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u043e\u043f\u044b\u0442\u043e\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0431\u043e\u0440\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0432 Grafana \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e grafana-image-render \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0443\u0447\u0438\u0442\u044c Apache Jmeter \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u0432 Grafana, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/\">Selenium <\/a>\u0438 <a href=\"https:\/\/github.com\/lightbody\/browsermob-proxy\">Browsermob-proxy<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/3dc\/012\/3ec\/3dc0123ec6c709b30a7f5074a63a99a7.jpg\" alt=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445.\" title=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445.\" width=\"1000\" height=\"839\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3dc\/012\/3ec\/3dc0123ec6c709b30a7f5074a63a99a7.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445.<\/figcaption><\/div>\n<\/figure>\n<ol>\n<li>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0421\u0430\u043c\u0438 jar \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 Maven \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043b\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u0430\u043c\u0438\u0445 \u044d\u0442\u0438\u0445 jar&#8217;\u043d\u0438\u043a\u043e\u0432. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 <a href=\"https:\/\/jar-download.com\/online-maven-download-tool.php\">\u0441\u0435\u0440\u0432\u0438\u0441<\/a> Jar-Download. \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043e\u043a\u043d\u043e Maven XML  3 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 <a href=\"https:\/\/mvnrepository.com\/artifact\/org.seleniumhq.selenium\/selenium-java\/3.141.59\">selenium<\/a>, <a href=\"https:\/\/mvnrepository.com\/artifact\/net.lightbody.bmp\/browsermob-core\/2.1.5\">proxy<\/a>, <a href=\"https:\/\/mvnrepository.com\/artifact\/io.github.bonigarcia\/webdrivermanager\/5.2.0\">webdrivermanager<\/a>. <\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c20\/f09\/f70\/c20f09f70b45efc2f6d943028a25f3e9.png\" alt=\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 Submit, \u0437\u0430\u0442\u0435\u043c Download project.\" title=\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 Submit, \u0437\u0430\u0442\u0435\u043c Download project.\" width=\"902\" height=\"863\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c20\/f09\/f70\/c20f09f70b45efc2f6d943028a25f3e9.png\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 Submit, \u0437\u0430\u0442\u0435\u043c Download project.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0440\u0445\u0438\u0432 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c 40 jar \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043b\u0430\u0434\u0451\u043c \u0432 apache-jmeter-5.4.3\/lib\/junit\/.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c webdriver&#8217;\u044b \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b: <a href=\"https:\/\/chromedriver.chromium.org\/downloads\">Firefox <\/a>\u0438 <a href=\"https:\/\/chromedriver.chromium.org\/downloads\">Chrome<\/a>. \u0421 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f Chrome \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e: \u043a\u0430\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430, \u0442\u0430\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 Google Chrome 111, \u0442\u043e \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0443\u0436\u0435\u043d \u0432\u0435\u0440\u0441\u0438\u0438 111. \u0410 \u0432\u043e\u0442 \u0441 Firefox \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442\u0441\u044f, \u043d\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Mozilla \u0435\u0441\u0442\u044c <a href=\"https:\/\/firefox-source-docs.mozilla.org\/testing\/geckodriver\/Support.html\">\u0442\u0430\u0431\u043b\u0438\u0446\u0430 <\/a>\u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440.<br \/>\u0414\u043b\u044f \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043e\u0431\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. <br \/>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0432\u0441\u0451 \u0441\u043a\u0430\u0447\u0430\u043d\u043e, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 WebDriver\/bin.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/grafana.com\/docs\/grafana\/latest\/administration\/api-keys\/\">API <\/a>\u043a\u043b\u044e\u0447 \u0432 Grafana, \u0435\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0441\u044b\u043b\u0430\u0442\u044c \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Grafana \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Configuration =>  API keys => New API key. \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0443 \u0441\u0435\u0431\u044f \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c API \u043a\u043b\u044e\u0447. \u0415\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e API_KEY.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u044c \u0434\u043e webdriver&#8217;\u043e\u0432 \u0438 API-\u043a\u043b\u044e\u0447\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0441\u0451 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u044b Jmeter. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Linux, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u041e\u0421:<br \/> <code>echo 'export PATH=$PATH:\/path\/to\/WebDriver\/bin' >> ~\/.profile<br \/> echo 'export API_GRAFANA=eyJblablablablablablablablabla9' >> ~\/.profile<br \/> source ~\/.profile<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 id&#8217;\u0448\u043d\u0438\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u0438\u0437 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430. \u0423 \u043d\u0430\u0441 \u0432\u0441\u0435 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u0432\u0435\u0437\u0434\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435. \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 Dashboard settings => Json model. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JSONPath <code>$.panels[*].[id,title]<\/code> \u0438 \u043e\u043d\u043b\u0430\u0439\u043d <a href=\"https:\/\/jsonpath.com\/\">\u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/a> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 id&#8217;\u0448\u043d\u0438\u043a\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0435\u0439. \u042d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u044b \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e PANELIDS.<\/p>\n<\/li>\n<li>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u043d\u0435\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0438\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430. \u041c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0431\u044b\u043b \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043d \u0430\u0442\u0440\u0438\u0431\u0443\u0442 class=&#187;panel-container&#187;, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 css selector, &#8212; \u043e\u043d \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0430\u043d\u0435\u043b\u044f\u0445. \u0415\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e SELECTOR.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432 Jmeter. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0442\u0435\u0441\u0442 \u043f\u043b\u0430\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u043c setUp Thread Group, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u043c JSR223 Sampler. \u0412 \u043d\u0451\u043c \u043c\u044b \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0435\u0441\u0442\u0430 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e FROM:<br \/><code>props.put(\"TESTSTART\",'${__time()}')<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u0442\u0435\u0441\u0442 \u043f\u043b\u0430\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u043c tearDown Thread Group, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c JSR223 Sampler. \u0412 \u043d\u0451\u043c \u043f\u0438\u0448\u0435\u043c \u0432\u0435\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434.<br \/>\u0417\u0430\u0442\u0435\u043c \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<br \/><code>final String URL = \"http:\/\/10.10.10.10:3000\/d\/\"; <br \/> final String DASHBOARD = \"VQB0x5pVz\/settings\"; <br \/> final int[] PANELIDS = new int[]{26,28,38,37,29,4,2,23,39,40,36,25,27};    final String FROM = '${__P(TESTSTART)}'; <br \/> final String TO = '${__time()}'; <br \/> final String SELECTOR = \"panel-container\"; <br \/> final String API_KEY = System.getenv(\"API_GRAFANA\");  <br \/> final double SCALE_MONITOR = 1; <br \/> final SimpleDateFormat formatter = new SimpleDateFormat(\"'_'dd.MM.yyyy\"); <br \/><\/code>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e SCALE_MONITOR, \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u043e\u0432 \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 4K \u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0432 150%, \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 1.5, \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0432 125% \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c &#8212; 1.25, \u043d\u0443 \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 BrowserMobProxy, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u0438\u0437 Selenium \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u043e API \u043a\u043b\u044e\u0447\u0443:<br \/><code>BrowserMobProxy proxy = new BrowserMobProxyServer();<br \/> proxy.setTrustAllServers(true);<br \/> proxy.start();<br \/> proxy.addHeader(\"Authorization\", \"Bearer \".concat(API_KEY));<\/code><\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0435\u0431 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 Firefox \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u043d\u0430\u0448 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:<br \/> <code>WebDriver driver;<br \/> DesiredCapabilities caps = new DesiredCapabilities();<br \/> Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);<br \/> System.setProperty(\"sun.java2d.uiScale\", \"1\");<br \/> System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE, \"null\");<br \/> FirefoxOptions firefoxOptions = new FirefoxOptions();<br \/> firefoxOptions.addArguments(\"-private\");<br \/> caps.setCapability(\"moz:firefoxOptions\", firefoxOptions);<br \/> caps.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);<br \/> caps.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);<br \/> caps.setCapability(CapabilityType.PROXY, seleniumProxy);<br \/> driver = new FirefoxDriver(caps);<\/code><\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0440\u0435\u0437 \u0432\u0435\u0431 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d, \u0434\u0435\u043b\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 URL \u0430\u0434\u0440\u0435\u0441 Grafana. \u0417\u0430\u0442\u0435\u043c \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0432\u0441\u0435\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439, id \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0432 \u043f. 5. <br \/>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u043e\u0434 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e:<br \/><code>driver.manage().window().maximize();<br \/> for (int i = 0; i &lt; PANELIDS.length; i++) {<br \/> driver.navigate().to(URL<br \/>     .concat(DASHBOARD)<br \/>     .concat(\"?orgId=1&amp;viewPanel=\")<br \/>     .concat(String.valueOf(PANELIDS[i]))<br \/>     .concat(\"&amp;from=\")<br \/>     .concat(FROM)<br \/>     .concat(\"&amp;to=\")<br \/>     .concat(TO));<br \/> Thread.sleep(2000);<br \/> WebElement elem = new WebDriverWait(driver, 5)<br \/>     .until(ExpectedConditions<br \/>     .visibilityOfElementLocated(By.className(SELECTOR)));<br \/> File screenshot = ((org.openqa.selenium.TakesScreenshot) driver)<br \/>     .getScreenshotAs(org.openqa.selenium.OutputType.FILE);<br \/> BufferedImage image = ImageIO.read(screenshot);<br \/> int x = (int) (elem.getLocation().getX() * SCALE_MONITOR);<br \/> int y = (int) (elem.getLocation().getY() * SCALE_MONITOR);<br \/> int width = (int) (elem.getSize().getWidth() * SCALE_MONITOR);<br \/> int height = (int) (elem.getSize().getHeight() * SCALE_MONITOR);<br \/> BufferedImage elemScreenshot = image.getSubimage(x, y, width, height);<br \/> ImageIO.write(elemScreenshot, \"png\", new File(\"\/path\/GrafanaScreenshots\/\"<br \/>     .concat(elem.getAttribute(\"aria-label\")<br \/>     .substring(0,elem.getAttribute(\"aria-label\").length()-6))<br \/>     .concat(formatter.format(System.currentTimeMillis()))<br \/>     .concat(\".png\")));<br \/> }<\/code><\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u043a\u0441\u0438:<br \/> <code>driver.quit();<br \/> proxy.stop();<br \/><\/code><\/p>\n<\/li>\n<li>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 JSR223 Sampler \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>java code<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">import net.lightbody.bmp.BrowserMobProxy; import net.lightbody.bmp.BrowserMobProxyServer; import net.lightbody.bmp.core.har.HarEntry; import net.lightbody.bmp.client.ClientUtil; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat;            final String URL = \"http:\/\/10.10.10.10:3000\/d\/\";     final String DASHBOARD = \"VQB0x5pVz\/settings\";     final int[] PANELIDS = new int[]{4,23};     final String FROM = '${__P(TESTSTART)}';     final String TO = '${__time()}';     final String SELECTOR = \"panel-container\";     final String API_KEY = System.getenv(\"API_GRAFANA\");      final double SCALE_MONITOR = 1;     final SimpleDateFormat formatter = new SimpleDateFormat(\"'_'dd.MM.yyyy\");      BrowserMobProxy proxy = new BrowserMobProxyServer();     proxy.setTrustAllServers(true);     proxy.start();     proxy.addHeader(\"Authorization\", \"Bearer \".concat(API_KEY));          try {                WebDriver driver = getDriver(proxy);         driver.manage().window().maximize();         for (int i = 0; i &lt; PANELIDS.length; i++) {         driver.navigate().to(URL             .concat(DASHBOARD)             .concat(\"?orgId=1&amp;viewPanel=\")             .concat(String.valueOf(PANELIDS[i]))             .concat(\"&amp;from=\")             .concat(FROM)             .concat(\"&amp;to=\")             .concat(TO));                  WebElement elem = new WebDriverWait(driver, 5)             .until(ExpectedConditions.visibilityOfElementLocated(By.className(SELECTOR)));         File screenshot = ((org.openqa.selenium.TakesScreenshot) driver).getScreenshotAs(org.openqa.selenium.OutputType.FILE);         BufferedImage image = ImageIO.read(screenshot);         int x = (int) (elem.getLocation().getX() * SCALE_MONITOR);         int y = (int) (elem.getLocation().getY() * SCALE_MONITOR);         int width = (int) (elem.getSize().getWidth() * SCALE_MONITOR);         int height = (int) (elem.getSize().getHeight() * SCALE_MONITOR);         BufferedImage elemScreenshot = image.getSubimage(x, y, width, height);         ImageIO.write(elemScreenshot, \"png\", new File(\"\/path\/to\/GrafanaScreenshots\/\"                     .concat(elem.getAttribute(\"aria-label\").substring(0,elem.getAttribute(\"aria-label\").length()-6))                     .concat(formatter.format(System.currentTimeMillis()))                     .concat(\".png\")));     }         driver.quit();     } catch (IOException | InterruptedException ignored) {       } finally {         proxy.stop();     }      final WebDriver getDriver(BrowserMobProxy proxy) {         WebDriver driver;         DesiredCapabilities caps = new DesiredCapabilities();         Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);         System.setProperty(\"sun.java2d.uiScale\", \"1\");         System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE, \"null\");         FirefoxOptions firefoxOptions = new FirefoxOptions();         firefoxOptions.addArguments(\"-private\");         caps.setCapability(\"moz:firefoxOptions\", firefoxOptions);         caps.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);         caps.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);         caps.setCapability(CapabilityType.PROXY, seleniumProxy);         driver = new FirefoxDriver(caps);         return driver;     }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0438\u0437 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 Grafana \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e grafana-image-render \u043f\u043b\u0430\u0433\u0438\u043d\u0430. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/38c\/f00\/523\/38cf00523d58e3218cd82a687c886dd7.gif\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/38c\/f00\/523\/38cf00523d58e3218cd82a687c886dd7.gif\"\/><\/figure>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0431\u044b\u043b \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0442\u0435\u043c, \u043a\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 Apache Jmeter. \u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u0430\u0448\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/729196\/\"> https:\/\/habr.com\/ru\/articles\/729196\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u043b\u044c\u044f \u0423\u043b\u0438\u0437\u043a\u043e, \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0414\u0411\u041e \u042e\u041b \u0432 \u0431\u043b\u043e\u043a\u0435 \u0426\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u00ab\u0420\u0421\u0425\u0411-\u0418\u043d\u0442\u0435\u0445\u00bb. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u043e\u043f\u044b\u0442\u043e\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0431\u043e\u0440\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0432 Grafana \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e grafana-image-render \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0443\u0447\u0438\u0442\u044c Apache Jmeter \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u0432 Grafana, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/\">Selenium <\/a>\u0438 <a href=\"https:\/\/github.com\/lightbody\/browsermob-proxy\">Browsermob-proxy<\/a>.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445.<\/figcaption><\/div>\n<\/figure>\n<ol>\n<li>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0421\u0430\u043c\u0438 jar \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 Maven \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043b\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u0430\u043c\u0438\u0445 \u044d\u0442\u0438\u0445 jar&#8217;\u043d\u0438\u043a\u043e\u0432. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 <a href=\"https:\/\/jar-download.com\/online-maven-download-tool.php\">\u0441\u0435\u0440\u0432\u0438\u0441<\/a> Jar-Download. \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043e\u043a\u043d\u043e Maven XML  3 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 <a href=\"https:\/\/mvnrepository.com\/artifact\/org.seleniumhq.selenium\/selenium-java\/3.141.59\">selenium<\/a>, <a href=\"https:\/\/mvnrepository.com\/artifact\/net.lightbody.bmp\/browsermob-core\/2.1.5\">proxy<\/a>, <a href=\"https:\/\/mvnrepository.com\/artifact\/io.github.bonigarcia\/webdrivermanager\/5.2.0\">webdrivermanager<\/a>. <\/p>\n<figure class=\"float full-width\">\n<div><figcaption>\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 Submit, \u0437\u0430\u0442\u0435\u043c Download project.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0440\u0445\u0438\u0432 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c 40 jar \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043b\u0430\u0434\u0451\u043c \u0432 apache-jmeter-5.4.3\/lib\/junit\/.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c webdriver&#8217;\u044b \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b: <a href=\"https:\/\/chromedriver.chromium.org\/downloads\">Firefox <\/a>\u0438 <a href=\"https:\/\/chromedriver.chromium.org\/downloads\">Chrome<\/a>. \u0421 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f Chrome \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e: \u043a\u0430\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430, \u0442\u0430\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 Google Chrome 111, \u0442\u043e \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0443\u0436\u0435\u043d \u0432\u0435\u0440\u0441\u0438\u0438 111. \u0410 \u0432\u043e\u0442 \u0441 Firefox \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442\u0441\u044f, \u043d\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Mozilla \u0435\u0441\u0442\u044c <a href=\"https:\/\/firefox-source-docs.mozilla.org\/testing\/geckodriver\/Support.html\">\u0442\u0430\u0431\u043b\u0438\u0446\u0430 <\/a>\u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440.<br \/>\u0414\u043b\u044f \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043e\u0431\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. <br \/>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0432\u0441\u0451 \u0441\u043a\u0430\u0447\u0430\u043d\u043e, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 WebDriver\/bin.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/grafana.com\/docs\/grafana\/latest\/administration\/api-keys\/\">API <\/a>\u043a\u043b\u044e\u0447 \u0432 Grafana, \u0435\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0441\u044b\u043b\u0430\u0442\u044c \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Grafana \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Configuration =>  API keys => New API key. \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0443 \u0441\u0435\u0431\u044f \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c API \u043a\u043b\u044e\u0447. \u0415\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e API_KEY.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u044c \u0434\u043e webdriver&#8217;\u043e\u0432 \u0438 API-\u043a\u043b\u044e\u0447\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0441\u0451 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u044b Jmeter. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Linux, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u041e\u0421:<br \/> <code>echo 'export PATH=$PATH:\/path\/to\/WebDriver\/bin' >> ~\/.profile<br \/> echo 'export API_GRAFANA=eyJblablablablablablablablabla9' >> ~\/.profile<br \/> source ~\/.profile<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 id&#8217;\u0448\u043d\u0438\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u0438\u0437 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430. \u0423 \u043d\u0430\u0441 \u0432\u0441\u0435 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u0432\u0435\u0437\u0434\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435. \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 Dashboard settings => Json model. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JSONPath <code>$.panels[*].[id,title]<\/code> \u0438 \u043e\u043d\u043b\u0430\u0439\u043d <a href=\"https:\/\/jsonpath.com\/\">\u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/a> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 id&#8217;\u0448\u043d\u0438\u043a\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0435\u0439. \u042d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u044b \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e PANELIDS.<\/p>\n<\/li>\n<li>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u043d\u0435\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0438\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430. \u041c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0431\u044b\u043b \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043d \u0430\u0442\u0440\u0438\u0431\u0443\u0442 class=&#187;panel-container&#187;, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 css selector, &#8212; \u043e\u043d \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0430\u043d\u0435\u043b\u044f\u0445. \u0415\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e SELECTOR.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432 Jmeter. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0442\u0435\u0441\u0442 \u043f\u043b\u0430\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u043c setUp Thread Group, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u043c JSR223 Sampler. \u0412 \u043d\u0451\u043c \u043c\u044b \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0435\u0441\u0442\u0430 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e FROM:<br \/><code>props.put(\"TESTSTART\",'${__time()}')<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u0442\u0435\u0441\u0442 \u043f\u043b\u0430\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u043c tearDown Thread Group, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c JSR223 Sampler. \u0412 \u043d\u0451\u043c \u043f\u0438\u0448\u0435\u043c \u0432\u0435\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434.<br \/>\u0417\u0430\u0442\u0435\u043c \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<br \/><code>final String URL = \"http:\/\/10.10.10.10:3000\/d\/\"; <br \/> final String DASHBOARD = \"VQB0x5pVz\/settings\"; <br \/> final int[] PANELIDS = new int[]{26,28,38,37,29,4,2,23,39,40,36,25,27};    final String FROM = '${__P(TESTSTART)}'; <br \/> final String TO = '${__time()}'; <br \/> final String SELECTOR = \"panel-container\"; <br \/> final String API_KEY = System.getenv(\"API_GRAFANA\");  <br \/> final double SCALE_MONITOR = 1; <br \/> final SimpleDateFormat formatter = new SimpleDateFormat(\"'_'dd.MM.yyyy\"); <br \/><\/code>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e SCALE_MONITOR, \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u043e\u0432 \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 4K \u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0432 150%, \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 1.5, \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0432 125% \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c &#8212; 1.25, \u043d\u0443 \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 BrowserMobProxy, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u0438\u0437 Selenium \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u043e API \u043a\u043b\u044e\u0447\u0443:<br \/><code>BrowserMobProxy proxy = new BrowserMobProxyServer();<br \/> proxy.setTrustAllServers(true);<br \/> proxy.start();<br \/> proxy.addHeader(\"Authorization\", \"Bearer \".concat(API_KEY));<\/code><\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0435\u0431 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 Firefox \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u043d\u0430\u0448 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:<br \/> <code>WebDriver driver;<br \/> DesiredCapabilities caps = new DesiredCapabilities();<br \/> Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);<br \/> System.setProperty(\"sun.java2d.uiScale\", \"1\");<br \/> System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE, \"null\");<br \/> FirefoxOptions firefoxOptions = new FirefoxOptions();<br \/> firefoxOptions.addArguments(\"-private\");<br \/> caps.setCapability(\"moz:firefoxOptions\", firefoxOptions);<br \/> caps.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);<br \/> caps.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);<br \/> caps.setCapability(CapabilityType.PROXY, seleniumProxy);<br \/> driver = new FirefoxDriver(caps);<\/code><\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0440\u0435\u0437 \u0432\u0435\u0431 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d, \u0434\u0435\u043b\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 URL \u0430\u0434\u0440\u0435\u0441 Grafana. \u0417\u0430\u0442\u0435\u043c \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0432\u0441\u0435\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439, id \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0432 \u043f. 5. <br \/>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u043e\u0434 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e:<br \/><code>driver.manage().window().maximize();<br \/> for (int i = 0; i &lt; PANELIDS.length; i++) {<br \/> driver.navigate().to(URL<br \/>     .concat(DASHBOARD)<br \/>     .concat(\"?orgId=1&amp;viewPanel=\")<br \/>     .concat(String.valueOf(PANELIDS[i]))<br \/>     .concat(\"&amp;from=\")<br \/>     .concat(FROM)<br \/>     .concat(\"&amp;to=\")<br \/>     .concat(TO));<br \/> Thread.sleep(2000);<br \/> WebElement elem = new WebDriverWait(driver, 5)<br \/>     .until(ExpectedConditions<br \/>     .visibilityOfElementLocated(By.className(SELECTOR)));<br \/> File screenshot = ((org.openqa.selenium.TakesScreenshot) driver)<br \/>     .getScreenshotAs(org.openqa.selenium.OutputType.FILE);<br \/> BufferedImage image = ImageIO.read(screenshot);<br \/> int x = (int) (elem.getLocation().getX() * SCALE_MONITOR);<br \/> int y = (int) (elem.getLocation().getY() * SCALE_MONITOR);<br \/> int width = (int) (elem.getSize().getWidth() * SCALE_MONITOR);<br \/> int height = (int) (elem.getSize().getHeight() * SCALE_MONITOR);<br \/> BufferedImage elemScreenshot = image.getSubimage(x, y, width, height);<br \/> ImageIO.write(elemScreenshot, \"png\", new File(\"\/path\/GrafanaScreenshots\/\"<br \/>     .concat(elem.getAttribute(\"aria-label\")<br \/>     .substring(0,elem.getAttribute(\"aria-label\").length()-6))<br \/>     .concat(formatter.format(System.currentTimeMillis()))<br \/>     .concat(\".png\")));<br \/> }<\/code><\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u043a\u0441\u0438:<br \/> <code>driver.quit();<br \/> proxy.stop();<br \/><\/code><\/p>\n<\/li>\n<li>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 JSR223 Sampler \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>java code<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">import net.lightbody.bmp.BrowserMobProxy; import net.lightbody.bmp.BrowserMobProxyServer; import net.lightbody.bmp.core.har.HarEntry; import net.lightbody.bmp.client.ClientUtil; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat;            final String URL = \"http:\/\/10.10.10.10:3000\/d\/\";     final String DASHBOARD = \"VQB0x5pVz\/settings\";     final int[] PANELIDS = new int[]{4,23};     final String FROM = '${__P(TESTSTART)}';     final String TO = '${__time()}';     final String SELECTOR = \"panel-container\";     final String API_KEY = System.getenv(\"API_GRAFANA\");      final double SCALE_MONITOR = 1;     final SimpleDateFormat formatter = new SimpleDateFormat(\"'_'dd.MM.yyyy\");      BrowserMobProxy proxy = new BrowserMobProxyServer();     proxy.setTrustAllServers(true);     proxy.start();     proxy.addHeader(\"Authorization\", \"Bearer \".concat(API_KEY));          try {                WebDriver driver = getDriver(proxy);         driver.manage().window().maximize();         for (int i = 0; i &lt; PANELIDS.length; i++) {         driver.navigate().to(URL             .concat(DASHBOARD)             .concat(\"?orgId=1&amp;viewPanel=\")             .concat(String.valueOf(PANELIDS[i]))             .concat(\"&amp;from=\")             .concat(FROM)             .concat(\"&amp;to=\")             .concat(TO));                  WebElement elem = new WebDriverWait(driver, 5)             .until(ExpectedConditions.visibilityOfElementLocated(By.className(SELECTOR)));         File screenshot = ((org.openqa.selenium.TakesScreenshot) driver).getScreenshotAs(org.openqa.selenium.OutputType.FILE);         BufferedImage image = ImageIO.read(screenshot);         int x = (int) (elem.getLocation().getX() * SCALE_MONITOR);         int y = (int) (elem.getLocation().getY() * SCALE_MONITOR);         int width = (int) (elem.getSize().getWidth() * SCALE_MONITOR);         int height = (int) (elem.getSize().getHeight() * SCALE_MONITOR);         BufferedImage elemScreenshot = image.getSubimage(x, y, width, height);         ImageIO.write(elemScreenshot, \"png\", new File(\"\/path\/to\/GrafanaScreenshots\/\"                     .concat(elem.getAttribute(\"aria-label\").substring(0,elem.getAttribute(\"aria-label\").length()-6))                     .concat(formatter.format(System.currentTimeMillis()))                     .concat(\".png\")));     }         driver.quit();     } catch (IOException | InterruptedException ignored) {       } finally {         proxy.stop();     }      final WebDriver getDriver(BrowserMobProxy proxy) {         WebDriver driver;         DesiredCapabilities caps = new DesiredCapabilities();         Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);         System.setProperty(\"sun.java2d.uiScale\", \"1\");<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-395043","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/395043","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=395043"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/395043\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=395043"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=395043"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=395043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}