diff --git a/404.html b/404.html new file mode 100644 index 0000000..3f594f1 --- /dev/null +++ b/404.html @@ -0,0 +1,23 @@ + + + + + + Auto Correlation Recorder + + + + + + + + + + + +

404

There's nothing here.
+ Take me home. +
+ + + diff --git a/assets/css/0.styles.4810017e.css b/assets/css/0.styles.4810017e.css new file mode 100644 index 0000000..5b4045f --- /dev/null +++ b/assets/css/0.styles.4810017e.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#474782;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#d32526}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c2c50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c2c50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c2c50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #d8cee6}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #d8cee6;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#d32526}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #d8cee6}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;-webkit-user-select:none;user-select:none;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #d8cee6}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.home .hero img{max-width:450px!important}#nprogress{pointer-events:none}#nprogress .bar{background:#d32526;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #d32526,0 0 5px #d32526;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#d32526 transparent transparent #d32526;border-style:solid;border-width:2px;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #d8cee6}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#d8cee6;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#d32526;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#2c2c50}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#d8cee6;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#d8cee6}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#2c2c50}@media (min-width:719px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:719px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a6aad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#d32526;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #be2122}.home .hero .action-button:hover{background-color:#dc3637}.home .features{border-top:1px solid #d8cee6;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a3a69}.home .feature p{color:#4e4e8e}.home .footer{padding:2.5rem;border-top:1px solid #d8cee6;text-align:center;color:#4e4e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e4e8e;display:inline-block;border:1px solid #c1b1d7;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/CorrelationRecorder/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#d32526}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #c1b1d7;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d5da6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#d32526}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px}.theme-code-block[data-v-759a7d02]{display:none}.theme-code-block__active[data-v-759a7d02]{display:block}.theme-code-block>pre[data-v-759a7d02]{background-color:orange}.theme-code-group__nav[data-v-deefee04]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-deefee04]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-deefee04]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-deefee04]{border-bottom:1px solid #42b983}.pre-blank[data-v-deefee04]{color:#42b983}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;animation-name:sbx-reset-in;animation-duration:.15s}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c2c50}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#d32526}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#d32526}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #d32526;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#d32526}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c2c50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #db3233}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c2c50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e4e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e4e8e}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #d8cee6;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c2c50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#d32526;border-left-color:#d32526}.sidebar-heading.clickable:hover{color:#d32526}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c2c50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#d32526}a.sidebar-link.active{font-weight:600;color:#d32526;border-left-color:#d32526}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #d8cee6;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}} \ No newline at end of file diff --git a/assets/img/add_custom_extractor.6df5ef7a.gif b/assets/img/add_custom_extractor.6df5ef7a.gif new file mode 100644 index 0000000..9827ea2 Binary files /dev/null and b/assets/img/add_custom_extractor.6df5ef7a.gif differ diff --git a/assets/img/add_custom_replacement.85bd80f5.gif b/assets/img/add_custom_replacement.85bd80f5.gif new file mode 100644 index 0000000..e2d5bfc Binary files /dev/null and b/assets/img/add_custom_replacement.85bd80f5.gif differ diff --git a/assets/img/adding-new-group.87794fb8.png b/assets/img/adding-new-group.87794fb8.png new file mode 100644 index 0000000..1f4eeea Binary files /dev/null and b/assets/img/adding-new-group.87794fb8.png differ diff --git a/assets/img/adding-new-rule.1723c0c7.png b/assets/img/adding-new-rule.1723c0c7.png new file mode 100644 index 0000000..6f8c117 Binary files /dev/null and b/assets/img/adding-new-rule.1723c0c7.png differ diff --git a/assets/img/auto-correlation-successful-dialog.767f2b93.png b/assets/img/auto-correlation-successful-dialog.767f2b93.png new file mode 100644 index 0000000..55d732d Binary files /dev/null and b/assets/img/auto-correlation-successful-dialog.767f2b93.png differ diff --git a/assets/img/automatic-correlation-suggestions.6ee5945d.png b/assets/img/automatic-correlation-suggestions.6ee5945d.png new file mode 100644 index 0000000..0b3b4ff Binary files /dev/null and b/assets/img/automatic-correlation-suggestions.6ee5945d.png differ diff --git a/assets/img/click-helper.7d13756d.gif b/assets/img/click-helper.7d13756d.gif new file mode 100644 index 0000000..d8ed43b Binary files /dev/null and b/assets/img/click-helper.7d13756d.gif differ diff --git a/assets/img/correlation-suggestions.174920a1.png b/assets/img/correlation-suggestions.174920a1.png new file mode 100644 index 0000000..eb36130 Binary files /dev/null and b/assets/img/correlation-suggestions.174920a1.png differ diff --git a/assets/img/exampleDiagram.9e15f8a4.png b/assets/img/exampleDiagram.9e15f8a4.png new file mode 100644 index 0000000..55cc338 Binary files /dev/null and b/assets/img/exampleDiagram.9e15f8a4.png differ diff --git a/assets/img/expand-advance-sextion-extractor.631ac121.gif b/assets/img/expand-advance-sextion-extractor.631ac121.gif new file mode 100644 index 0000000..15eb775 Binary files /dev/null and b/assets/img/expand-advance-sextion-extractor.631ac121.gif differ diff --git a/assets/img/expand-advance-sextion-replacement.e8237937.gif b/assets/img/expand-advance-sextion-replacement.e8237937.gif new file mode 100644 index 0000000..8d7b263 Binary files /dev/null and b/assets/img/expand-advance-sextion-replacement.e8237937.gif differ diff --git a/assets/img/extraction-multiple-non-overwritable.aaa5f661.png b/assets/img/extraction-multiple-non-overwritable.aaa5f661.png new file mode 100644 index 0000000..268d275 Binary files /dev/null and b/assets/img/extraction-multiple-non-overwritable.aaa5f661.png differ diff --git a/assets/img/extraction-multiple-overwritable.c67e2986.png b/assets/img/extraction-multiple-overwritable.c67e2986.png new file mode 100644 index 0000000..ceb4770 Binary files /dev/null and b/assets/img/extraction-multiple-overwritable.c67e2986.png differ diff --git a/assets/img/extraction-specific-match-non-overwritable.8f3ecfe2.png b/assets/img/extraction-specific-match-non-overwritable.8f3ecfe2.png new file mode 100644 index 0000000..4c3fe53 Binary files /dev/null and b/assets/img/extraction-specific-match-non-overwritable.8f3ecfe2.png differ diff --git a/assets/img/extraction-specific-match-overwritable.6d4a674d.png b/assets/img/extraction-specific-match-overwritable.6d4a674d.png new file mode 100644 index 0000000..e360c9f Binary files /dev/null and b/assets/img/extraction-specific-match-overwritable.6d4a674d.png differ diff --git a/assets/img/ignore-value-replacement.05499008.png b/assets/img/ignore-value-replacement.05499008.png new file mode 100644 index 0000000..4ebc719 Binary files /dev/null and b/assets/img/ignore-value-replacement.05499008.png differ diff --git a/assets/img/multiple-parameter-replacement.f9ba0ebb.png b/assets/img/multiple-parameter-replacement.f9ba0ebb.png new file mode 100644 index 0000000..61ec39f Binary files /dev/null and b/assets/img/multiple-parameter-replacement.f9ba0ebb.png differ diff --git a/assets/img/multiple-transformed-replacement.384c8711.png b/assets/img/multiple-transformed-replacement.384c8711.png new file mode 100644 index 0000000..e5af401 Binary files /dev/null and b/assets/img/multiple-transformed-replacement.384c8711.png differ diff --git a/assets/img/regex-correlation-extractor.532bedc2.png b/assets/img/regex-correlation-extractor.532bedc2.png new file mode 100644 index 0000000..5442a0c Binary files /dev/null and b/assets/img/regex-correlation-extractor.532bedc2.png differ diff --git a/assets/img/regex-correlation-replacement.6f279beb.png b/assets/img/regex-correlation-replacement.6f279beb.png new file mode 100644 index 0000000..e5f1508 Binary files /dev/null and b/assets/img/regex-correlation-replacement.6f279beb.png differ diff --git a/assets/img/replay-report-dialog.1dbf3aa4.png b/assets/img/replay-report-dialog.1dbf3aa4.png new file mode 100644 index 0000000..3d33d63 Binary files /dev/null and b/assets/img/replay-report-dialog.1dbf3aa4.png differ diff --git a/assets/img/rules-container-table.e97b7270.png b/assets/img/rules-container-table.e97b7270.png new file mode 100644 index 0000000..1b4aed6 Binary files /dev/null and b/assets/img/rules-container-table.e97b7270.png differ diff --git a/assets/img/search.83621669.svg b/assets/img/search.83621669.svg new file mode 100644 index 0000000..03d8391 --- /dev/null +++ b/assets/img/search.83621669.svg @@ -0,0 +1 @@ + diff --git a/assets/img/select-automatic-correlation-method.4ca24240.png b/assets/img/select-automatic-correlation-method.4ca24240.png new file mode 100644 index 0000000..7abda25 Binary files /dev/null and b/assets/img/select-automatic-correlation-method.4ca24240.png differ diff --git a/assets/img/select-correlation-method.ee4c0ff0.png b/assets/img/select-correlation-method.ee4c0ff0.png new file mode 100644 index 0000000..d0b6ea3 Binary files /dev/null and b/assets/img/select-correlation-method.ee4c0ff0.png differ diff --git a/assets/img/select-correlation-template.20f55cce.png b/assets/img/select-correlation-template.20f55cce.png new file mode 100644 index 0000000..521f254 Binary files /dev/null and b/assets/img/select-correlation-template.20f55cce.png differ diff --git a/assets/img/selecting-other-correlation-extractor.7cbb9991.gif b/assets/img/selecting-other-correlation-extractor.7cbb9991.gif new file mode 100644 index 0000000..d9a6863 Binary files /dev/null and b/assets/img/selecting-other-correlation-extractor.7cbb9991.gif differ diff --git a/assets/img/selecting-other-correlation-replacement.ab34ae11.gif b/assets/img/selecting-other-correlation-replacement.ab34ae11.gif new file mode 100644 index 0000000..442d2f6 Binary files /dev/null and b/assets/img/selecting-other-correlation-replacement.ab34ae11.gif differ diff --git a/assets/img/single-parameter-replacement.f9ba0ebb.png b/assets/img/single-parameter-replacement.f9ba0ebb.png new file mode 100644 index 0000000..61ec39f Binary files /dev/null and b/assets/img/single-parameter-replacement.f9ba0ebb.png differ diff --git a/assets/img/single-transformed-replacement.384c8711.png b/assets/img/single-transformed-replacement.384c8711.png new file mode 100644 index 0000000..e5af401 Binary files /dev/null and b/assets/img/single-transformed-replacement.384c8711.png differ diff --git a/assets/img/umlDiagram.b924f6c9.png b/assets/img/umlDiagram.b924f6c9.png new file mode 100644 index 0000000..8731ac9 Binary files /dev/null and b/assets/img/umlDiagram.b924f6c9.png differ diff --git a/assets/img/using-the-plugin-history-1.5e154b5e.png b/assets/img/using-the-plugin-history-1.5e154b5e.png new file mode 100644 index 0000000..6552856 Binary files /dev/null and b/assets/img/using-the-plugin-history-1.5e154b5e.png differ diff --git a/assets/img/using-the-plugin-history-2.d30a143a.png b/assets/img/using-the-plugin-history-2.d30a143a.png new file mode 100644 index 0000000..322eeb2 Binary files /dev/null and b/assets/img/using-the-plugin-history-2.d30a143a.png differ diff --git a/assets/img/using-the-plugin-history-3.0743a3bd.png b/assets/img/using-the-plugin-history-3.0743a3bd.png new file mode 100644 index 0000000..b947465 Binary files /dev/null and b/assets/img/using-the-plugin-history-3.0743a3bd.png differ diff --git a/assets/img/using-the-plugin-history-4.bc2a94e2.png b/assets/img/using-the-plugin-history-4.bc2a94e2.png new file mode 100644 index 0000000..457b19c Binary files /dev/null and b/assets/img/using-the-plugin-history-4.bc2a94e2.png differ diff --git a/assets/js/1.318291ce.js b/assets/js/1.318291ce.js new file mode 100644 index 0000000..1211aec --- /dev/null +++ b/assets/js/1.318291ce.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1,15,18,24,25,26],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return s})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return p})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return k}));n(90);const s=/#.*$/,i=/\.(md|html)$/,r=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(s,"").replace(i,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;const e=t.match(s),n=e?e[0]:"",i=a(t);return r.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(s);if(e)return e[0]}(e);if(i&&n!==i)return!1;return a(t.path)===a(e)}function p(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const s=t.charAt(0);if("/"===s)return t;if("?"===s||"#"===s)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,s,i=1){if("string"==typeof e)return p(n,e,s);if(Array.isArray(e))return Object.assign(p(n,e[0],s),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(p(n,e.path,s),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,s,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function k(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var s=n(239),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(s.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(s.g)(this.link)||Object(s.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(s.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(s.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(14),o=Object(r.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},242:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(243),n(14)),r=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},247:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},254:function(t,e,n){"use strict";n.r(e);var s=n(241),i=n(242),r=n(91),o=n.n(r),a={name:"DropdownLink",components:{NavLink:s.default,DropdownTransition:i.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,s){return e("li",{key:n.link||s,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(s){return e("li",{key:s.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:s},on:{focusout:function(e){t.isLastItemOfArray(s,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},257:function(t,e,n){"use strict";n(247)},258:function(t,e,n){},265:function(t,e,n){"use strict";n.r(e);var s=n(254),i=n(239),r={name:"NavLinks",components:{NavLink:n(241).default,DropdownLink:s.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,s=this.$site.themeConfig.locales||{},i={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(i=>{const r=t[i],o=s[i]&&s[i].label||r.lang;let a;return r.lang===this.$lang?a=e:(a=e.replace(this.$localeConfig.path,i),n.some(t=>t.path===a)||(a=i)),{text:o,link:a}})};return[...this.userNav,i]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(i.j)(t),{items:(t.items||[]).map(i.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n{let s=i()(e,"title","");return i()(e,"frontmatter.tags")&&(s+=" "+e.frontmatter.tags.join(" ")),n&&(s+=" "+n),o(t,s)};const o=(t,e)=>{const n=t=>t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp("[^\0-]"),i=t.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t);if(s.test(t))return i.some(t=>e.toLowerCase().indexOf(t)>-1);{const s=t.endsWith(" ");return new RegExp(i.map((t,e)=>i.length!==e+1||s?`(?=.*\\b${n(t)}\\b)`:`(?=.*\\b${n(t)})`).join("")+".+","gi").test(e)}};var a={name:"SearchBox",data:()=>({query:"",focused:!1,focusIndex:0,placeholder:void 0}),computed:{showSuggestions(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions(){const t=this.query.trim().toLowerCase();if(!t)return;const{pages:e}=this.$site,n=this.$site.themeConfig.searchMaxSuggestions||5,s=this.$localePath,i=[];for(let o=0;o=n);o++){const a=e[o];if(this.getPageLocalePath(a)===s&&this.isSearchable(a))if(r(t,a))i.push(a);else if(a.headers)for(let e=0;e=n);e++){const n=a.headers[e];n.title&&r(t,a,n.title)&&i.push(Object.assign({},a,{path:a.path+"#"+n.slug,header:n}))}}return i},alignRight(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath(t){for(const e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable(t){let e=null;return null===e||(e=Array.isArray(e)?e:new Array(e),e.filter(e=>t.path.match(e)).length>0)},onHotkey(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown(){this.showSuggestions&&(this.focusIndex "+t._s(n.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports,c=n(312),h=n(265);function f(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,null)[e]}var p={name:"Navbar",components:{SidebarButton:c.default,NavLinks:h.default,SearchBox:u,AlgoliaSearchBox:{}},data:()=>({linksWrapMaxWidth:null}),computed:{algolia(){return this.$themeLocaleConfig.algolia||this.$site.themeConfig.algolia||{}},isAlgoliaSearch(){return this.algolia&&this.algolia.apiKey&&this.algolia.indexName}},mounted(){const t=parseInt(f(this.$el,"paddingLeft"))+parseInt(f(this.$el,"paddingRight")),e=()=>{document.documentElement.clientWidth<719?this.linksWrapMaxWidth=null:this.linksWrapMaxWidth=this.$el.offsetWidth-t-(this.$refs.siteName&&this.$refs.siteName.offsetWidth||0)};e(),window.addEventListener("resize",e,!1)}},d=(n(319),Object(l.a)(p,(function(){var t=this,e=t._self._c;return e("header",{staticClass:"navbar"},[e("SidebarButton",{on:{"toggle-sidebar":function(e){return t.$emit("toggle-sidebar")}}}),t._v(" "),e("RouterLink",{staticClass:"home-link",attrs:{to:t.$localePath}},[t.$site.themeConfig.logo?e("img",{staticClass:"logo",attrs:{src:t.$withBase(t.$site.themeConfig.logo),alt:t.$siteTitle}}):t._e(),t._v(" "),t.$siteTitle?e("span",{ref:"siteName",staticClass:"site-name",class:{"can-hide":t.$site.themeConfig.logo}},[t._v(t._s(t.$siteTitle))]):t._e()]),t._v(" "),e("div",{staticClass:"links",style:t.linksWrapMaxWidth?{"max-width":t.linksWrapMaxWidth+"px"}:{}},[t.isAlgoliaSearch?e("AlgoliaSearchBox",{attrs:{options:t.algolia}}):!1!==t.$site.themeConfig.search&&!1!==t.$page.frontmatter.search?e("SearchBox"):t._e(),t._v(" "),e("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null));e.default=d.exports}}]); \ No newline at end of file diff --git a/assets/js/11.a312d1f8.js b/assets/js/11.a312d1f8.js new file mode 100644 index 0000000..c3a6fa6 --- /dev/null +++ b/assets/js/11.a312d1f8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{278:function(e,t,a){e.exports=a.p+"assets/img/rules-container-table.e97b7270.png"},279:function(e,t,a){e.exports=a.p+"assets/img/adding-new-group.87794fb8.png"},280:function(e,t,a){e.exports=a.p+"assets/img/adding-new-rule.1723c0c7.png"},281:function(e,t,a){e.exports=a.p+"assets/img/click-helper.7d13756d.gif"},282:function(e,t,a){e.exports=a.p+"assets/img/selecting-other-correlation-extractor.7cbb9991.gif"},283:function(e,t,a){e.exports=a.p+"assets/img/expand-advance-sextion-extractor.631ac121.gif"},284:function(e,t,a){e.exports=a.p+"assets/img/add_custom_extractor.6df5ef7a.gif"},285:function(e,t,a){e.exports=a.p+"assets/img/selecting-other-correlation-replacement.ab34ae11.gif"},286:function(e,t,a){e.exports=a.p+"assets/img/expand-advance-sextion-replacement.e8237937.gif"},287:function(e,t,a){e.exports=a.p+"assets/img/add_custom_replacement.85bd80f5.gif"},288:function(e,t,a){e.exports=a.p+"assets/img/regex-correlation-extractor.532bedc2.png"},289:function(e,t){e.exports="data:image/png;base64,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"},290:function(e,t,a){e.exports=a.p+"assets/img/extraction-specific-match-overwritable.6d4a674d.png"},291:function(e,t,a){e.exports=a.p+"assets/img/extraction-specific-match-non-overwritable.8f3ecfe2.png"},292:function(e,t,a){e.exports=a.p+"assets/img/extraction-multiple-overwritable.c67e2986.png"},293:function(e,t,a){e.exports=a.p+"assets/img/extraction-multiple-non-overwritable.aaa5f661.png"},294:function(e,t,a){e.exports=a.p+"assets/img/single-parameter-replacement.f9ba0ebb.png"},295:function(e,t,a){e.exports=a.p+"assets/img/multiple-parameter-replacement.f9ba0ebb.png"},296:function(e,t,a){e.exports=a.p+"assets/img/single-transformed-replacement.384c8711.png"},297:function(e,t,a){e.exports=a.p+"assets/img/multiple-transformed-replacement.384c8711.png"},298:function(e,t,a){e.exports=a.p+"assets/img/ignore-value-replacement.05499008.png"},299:function(e,t,a){e.exports=a.p+"assets/img/regex-correlation-replacement.6f279beb.png"},300:function(e,t){e.exports="data:image/png;base64,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"},343:function(e,t,a){"use strict";a.r(t);var r=a(14),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"before-the-recording"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#before-the-recording"}},[e._v("#")]),e._v(" Before the Recording")]),e._v(" "),t("p",[e._v("When we say 'Before the Recording,' it is meant to refer to the process between when the Correlation Template is\nloaded into JMeter and when the recording is completed. We use this terminology instead of saying 'while it is\nbeing recorded' because this method requires you to properly configure the plugin before performing the\nrecording using what is known as a Correlation Rule (or Rule for short).")]),e._v(" "),t("p",[e._v("Once you have finished configuring the rules, you can start the recording, and the plugin will automatically\ncompare each request and response with the configured rules")]),e._v(" "),t("p",[e._v("Pros:")]),e._v(" "),t("ul",[t("li",[e._v("It is the most flexible method, since you can configure it to your needs.")]),e._v(" "),t("li",[e._v("It is the most efficient method, since it is the only one that does not require you to replay the recording.")]),e._v(" "),t("li",[e._v("It supports extensibility, allowing you to develop your own rules according to your needs.")])]),e._v(" "),t("p",[e._v("Cons:")]),e._v(" "),t("ul",[t("li",[e._v("It requires you to configure the rules before the recording is done.")]),e._v(" "),t("li",[e._v("It required prior knowledge of potencial dynamic values, and how to configure the rules to extract them.")]),e._v(" "),t("li",[e._v("It requires a re-recording in order to test the changes made to the rules.")]),e._v(" "),t("li",[e._v("It doesn't support rolling back changes made to the recording, since the elements are modified in the recording itself.")])]),e._v(" "),t("p",[e._v("Now, lets talk about the Correlation Rules and their parts.")]),e._v(" "),t("h2",{attrs:{id:"correlation-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-rules"}},[e._v("#")]),e._v(" Correlation Rules")]),e._v(" "),t("p",[e._v("Now that you know how the process works, lets talk about the players involved and how those interact between each other.")]),e._v(" "),t("h2",{attrs:{id:"correlation-extractor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-extractor"}},[e._v("#")]),e._v(" Correlation Extractor")]),e._v(" "),t("p",[e._v("When a "),t("strong",[e._v("Response")]),e._v(" comes from the server, there are ways to get the information, depending on where the value its changing:")]),e._v(" "),t("ul",[t("li",[e._v("It could change on the URL, for example, using an ID or a Token")]),e._v(" "),t("li",[e._v("It could be en the Body, set in a field (visible or hidden)")]),e._v(" "),t("li",[e._v("It could be stored on a Cookie, that has an expiration date")])]),e._v(" "),t("p",[e._v("The Correlation Extractor has, as its main responsibility, locate if in any of these cases, there are embedded\ndynamic variables. In the case where there are, its second responsibility is to extract and save the value so\nthat, in future requests that the app made, other players take those values and replace it, allowing the full\ncycle to be completed.")]),e._v(" "),t("h2",{attrs:{id:"correlation-replacement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-replacement"}},[e._v("#")]),e._v(" Correlation Replacement")]),e._v(" "),t("p",[e._v("Now that its known who it's the one responsible to extract the values from the responses, it's the responsibility\nto the Correlation Replacement to take those values and replacement them in the following requests, made to the server.")]),e._v(" "),t("h2",{attrs:{id:"reference-variable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reference-variable"}},[e._v("#")]),e._v(" Reference Variable")]),e._v(" "),t("p",[e._v("Even if it's not part of the process of correlating dynamic values, when one its extracted, the name of the place\nwhere its stored, and from where its going to be taken, in order to replace it, in the subsequent requests,\nit's called Reference Variable.")]),e._v(" "),t("p",[e._v("Everything that it's been explained, so far, will be used in one final tool: a Correlation Rule.")]),e._v(" "),t("h1",{attrs:{id:"correlation-rule"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-rule"}},[e._v("#")]),e._v(" Correlation Rule")]),e._v(" "),t("p",[e._v("Once all those concepts are explained, the tool that allows to merge them together, it's the Correlation Rule.")]),e._v(" "),t("p",[e._v("Each Correlation Rule contains, a Correlation Extractor, as you now know, to extracts the dynamic value,\na Reference Variable, to store the value from the Extractor for the Replacement, and one Correlation Replacement.")]),e._v(" "),t("p",[e._v("Each one of these rules, will help to make this whole process of capturing and replacing values between responses and\nrequests, not only possible, but also easier than if you manage to do it, alone, using JMeter.")]),e._v(" "),t("h3",{attrs:{id:"configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[e._v("#")]),e._v(" Configuration")]),e._v(" "),t("p",[e._v("Assuming you know "),t("a",{attrs:{href:"#basic-concepts"}},[e._v("how Correlations works")]),e._v(", lets jump into adding and configuring your rules.")]),e._v(" "),t("p",[e._v("Go to "),t("em",[e._v("bzm - Auto Correlation Recorder")]),e._v(" > click the Rules Tab.")]),e._v(" "),t("p",[e._v("You will be presented with multiple options to add, move and delete your Correlation Rules Groups, any rule that you want to add must be inside a group")]),e._v(" "),t("p",[t("img",{attrs:{src:a(278),alt:"Rules Container",title:"Correlation Rules Container"}})]),e._v(" "),t("h3",{attrs:{id:"adding-groups"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-groups"}},[e._v("#")]),e._v(" Adding Groups")]),e._v(" "),t("p",[e._v("When clicking the "),t("em",[e._v("Add")]),e._v(" button, a Correlation Group will be added at the bottom of your list of groups.")]),e._v(" "),t("p",[e._v("Each group will contain the header with the buttons to enable/disable, editing group name, and add, remove and move the rules inside the group. Below the header, it is placed the table which will contain all the rules associated to that group")]),e._v(" "),t("p",[t("img",{attrs:{src:a(279),alt:"Correlation Group",title:"The groups will be inserted at the end"}})]),e._v(" "),t("h3",{attrs:{id:"adding-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-rules"}},[e._v("#")]),e._v(" Adding Rules")]),e._v(" "),t("p",[e._v("When clicking the "),t("strong",[e._v("+")]),e._v(" button, a Correlation Rule will be added at the bottom of your list of rules.")]),e._v(" "),t("p",[e._v("Each rule will contain a field in each one of the columns: Reference Variable, Correlation Extractor, and Correlation Replacement")]),e._v(" "),t("p",[t("img",{attrs:{src:a(280),alt:"Correlation Rule",title:"The rules will be inserted at the end"}})]),e._v(" "),t("p",[e._v("Each Correlation Extractor and Correlation Replacement Combo will have a helper icon, right next to it that, when clicked, will display information regarding it ("),t("em",[e._v("What it does?")]),e._v(" and "),t("em",[e._v("How to customize it?")]),e._v(")")]),e._v(" "),t("p",[t("img",{attrs:{src:a(281),alt:"Correlation Rule Hover",title:"Display Informative Helper"}})]),e._v(" "),t("h4",{attrs:{id:"selecting-a-correlation-extractor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#selecting-a-correlation-extractor"}},[e._v("#")]),e._v(" Selecting a Correlation Extractor")]),e._v(" "),t("p",[e._v("By default, when a Correlation Rule is added, it will have automatically selected the Regex Correlation Extractor. You can change it by clicking on the combo box on the Correlation Extractor column of that Rule.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(282),alt:"Selecting one Correlation Extractor",title:"Selecting one Correlation Extractor"}})]),e._v(" "),t("p",[e._v("Each type of Extractor has its own set of parameters, some of them are visible when the extractor is selected, but the advanced ones are hidden by default, those are shown when the parameters section is expanded.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(283),alt:"Expand_Advance_Section Extractor",title:"Expanding advance section on Correlation Extractor"}})]),e._v(" "),t("p",[e._v("By default, only Regex extractor will be able to be selected, to select other of the extractors available or a custom extractor there is an option "),t("strong",[e._v("More")]),e._v(" in the combo box which will display all the available extractors, here the desired extractor should be selected and added to actives extractors.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(284),alt:"Add_Custom_Extractor",title:"Adding custom Correlation Extractor"}})]),e._v(" "),t("p",[e._v("If another Extractor is selected, the previous values will be deleted. Filling all the fields, with the desired parameters, will allow the plugin to Extract the dynamic values from the responses.")]),e._v(" "),t("p",[e._v("More about how to configure each Correlation Extractor (this and the ones that comes with the Siebel Extension), please refer to our "),t("a",{attrs:{href:"#list-of-correlation-extractors"}},[e._v("List of Correlation Extractors")]),e._v(" section.")]),e._v(" "),t("h4",{attrs:{id:"selecting-a-correlation-replacement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#selecting-a-correlation-replacement"}},[e._v("#")]),e._v(" Selecting a Correlation Replacement")]),e._v(" "),t("p",[e._v("Just like the Correlation Extractors, the Regex Correlation Replacement will be selected, by default, when adding a Correlation Rule.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(285),alt:"Selecting Replacement Correlation",title:"Selecting one Correlation Replacement"}})]),e._v(" "),t("p",[e._v("Also, Correlation Replacements have their own Advance section, like Correlation Extractors")]),e._v(" "),t("p",[t("img",{attrs:{src:a(286),alt:"Expand_Advance_Section Replacement",title:"Expanding advance section on Correlation Replacement"}})]),e._v(" "),t("p",[e._v("As in Correlation Extractor, here to add any Correlation Replacement the option "),t("strong",[e._v("more")]),e._v(" should be used.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(287),alt:"Add_Custom_Replacement",title:"Adding custom Correlation Replacement"}})]),e._v(" "),t("p",[e._v("And their behavior goes sames as its predecessor. Once one option its selected, the fields to configure it, will be displayed right next to it.")]),e._v(" "),t("p",[e._v("More about how to configure each Correlation Replacements (this and the ones that comes with the Siebel Extension), please refer to our "),t("a",{attrs:{href:"#list-of-correlation-replacements"}},[e._v("List of Correlation Replacements")]),e._v(" section.")]),e._v(" "),t("p",[e._v("Note that, each time you select a different Extractor or Replacement, inside your correlation rule, the values that you had set to the respective fields, will be lost. For Saving your Rule configurations, before getting creative, please refer to the "),t("a",{attrs:{href:"#saving-and-loading-rules"}},[e._v("Saving and Loading Rules")]),e._v(" section.")]),e._v(" "),t("h4",{attrs:{id:"reference-variable-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reference-variable-2"}},[e._v("#")]),e._v(" Reference Variable")]),e._v(" "),t("p",[e._v("Once a value its extracted for the Correlation Extractor, it's stored in a variable, this field will determine the name of it. In future request, the Correlation Replacement will be applied and, if it successfully finds the place to apply it, will bring the value from here and replacement it there, for a smooth transition.")]),e._v(" "),t("h3",{attrs:{id:"list-of-correlation-extractors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-of-correlation-extractors"}},[e._v("#")]),e._v(" List of Correlation Extractors")]),e._v(" "),t("p",[e._v("All the Correlation Extractors mentioned below comes either installed by default in the plugin, or as a part of the preloaded Siebel Template. To know more about how to load and save Correlation Rules Templates, please refer to the "),t("a",{attrs:{href:"#saving-and-loading-rules"}},[e._v("Saving and Loading Rules")]),e._v(" section, for further details about it.")]),e._v(" "),t("p",[e._v("In case none of the following ones fits the desired behavior your application requires, to correlate the dynamic variables that it might have, feel free to read the "),t("a",{attrs:{href:"custom-extensions"}},[e._v("Customizing your one extensions")]),e._v(" section that we have prepared for you.")]),e._v(" "),t("p",[t("strong",[e._v("Regex")])]),e._v(" "),t("p",[e._v("RegEx stands for Regular Expression, and relies on the use of Regular Expressions to find where the dynamic variable might found.")]),e._v(" "),t("p",[e._v("When the regular expression its matched, a Regex Extractor will be added to the sample when:")]),e._v(" "),t("ol",[t("li",[e._v("The Regular Expression is matched, based on the configured properties")]),e._v(" "),t("li",[e._v("The matched value is not repeated")])]),e._v(" "),t("p",[e._v("This extractor comes installed, by default, in the plugin, and it receives 4 fields to be able to work properly:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(288),alt:"Regex Correlation Extractor"}})]),e._v(" "),t("ol",[t("li",[t("em",[e._v("RegEx")]),e._v(": which corresponds to the Regular Expression that will be used to perform the extraction.")]),e._v(" "),t("li",[t("em",[e._v("Match Number")]),e._v(": In the case that the Regex matches more than once in the response, this number will indicate which one of all of them it's going to be extracted. Use the value "),t("code",[e._v("-1")]),e._v(" when you need to retrieve all matched values from the expressions.")]),e._v(" "),t("li",[t("em",[e._v("Match Group")]),e._v(": In the case that the Regex contains, more than one group, this field indicates which one of those is going to be considered to do the extraction, once the Regex its matched. Only use positive numbers.")]),e._v(" "),t("li",[t("em",[e._v("Target")]),e._v(": Which field to check the regular expression against.\n"),t("ul",[t("li",[t("em",[e._v("The following fields can be checked: (from JMeter documentation):")])]),e._v(" "),t("li",[t("em",[e._v("Body")]),e._v(" - the body of the response, e.g. the content of a web-page (excluding headers)")]),e._v(" "),t("li",[t("em",[e._v("Body (unescaped)")]),e._v(" - the body of the response, with all Html escape codes replaced. Note that Html escapes are processed wi thought regard of context, so some incorrect substitutions may be made. Note that this option highly impacts performances, so use it only when absolutely necessary and be aware of its impacts.")]),e._v(" "),t("li",[t("em",[e._v("Body as a Document")]),e._v(" - extract text from various type of documents via Apache Tika. Note that Body as a Document option can impact performance, so ensure it is OK for your test.")]),e._v(" "),t("li",[t("em",[e._v("Request Headers")]),e._v(" - the request header of the HTTP sampler.")]),e._v(" "),t("li",[t("em",[e._v("Response Headers")]),e._v(" - the response header of the HTTP sampler.")]),e._v(" "),t("li",[t("em",[e._v("URL")])]),e._v(" "),t("li",[t("em",[e._v("Response Code")]),e._v(" - e.g. 200")]),e._v(" "),t("li",[t("em",[e._v("Response Message")]),e._v(" - e.g. OK")])])]),e._v(" "),t("li",[t("em",[e._v("Multivalued")]),e._v(": Multiple valuation is useful when we want to separate each unique value as a particular variant name from different responses. Variables extracted with multivalued are non-overwritable and additionally they have a specific format. See "),t("a",{attrs:{href:"#variable-generation"}},[e._v("Variable Generation")]),e._v(" for case usages and variable formats.\nIn case the Regex Extractor is not matched, during a Replay of a Recorded flow, the replaced value will be "),t("code",[e._v(' + "_NOT_FOUND"')]),e._v(".")])]),e._v(" "),t("p",[t("strong",[e._v("JSON")])]),e._v(" "),t("p",[e._v("JSON stands for JavaScript Object Notation, and relies on the use of JSONPath Expressions to find where the dynamic variable might found.")]),e._v(" "),t("p",[e._v("When the JSONPath its matched, a JSONPath Extractor will be added to the sample when:")]),e._v(" "),t("ol",[t("li",[e._v("The JSONPath is matched, based on the configured properties")]),e._v(" "),t("li",[e._v("The matched value is not repeated")])]),e._v(" "),t("p",[e._v("This extractor comes installed, by default, in the plugin, and it receives 4 fields to be able to work properly:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(289),alt:"JSON Correlation Extractor"}})]),e._v(" "),t("ol",[t("li",[t("em",[e._v("JSON")]),e._v(": which corresponds to the JSONPath Expression that will be used to perform the extraction.")]),e._v(" "),t("li",[t("em",[e._v("Match Number")]),e._v(": In the case that the JSONPath matches more than once in the response, this number will indicate which one of all of them it's going to be extracted. Use the value "),t("code",[e._v("-1")]),e._v(" when you need to retrieve all matched values from the expressions.")]),e._v(" "),t("li",[t("em",[e._v("Target")]),e._v(": Which field to check the regular expression against.\n"),t("ul",[t("li",[t("em",[e._v("The following fields can be checked: (from JMeter documentation):")])]),e._v(" "),t("li",[t("em",[e._v("Body")]),e._v(" - the body of the response, e.g. the content of a web-page (excluding headers)")])])]),e._v(" "),t("li",[t("em",[e._v("Multivalued")]),e._v(": Multiple valuation is useful when we want to separate each unique value as a particular variant name from different responses. Variables extracted with multivalued are non-overwritable and additionally they have a specific format. See "),t("a",{attrs:{href:"#variable-generation"}},[e._v("Variable Generation")]),e._v(" for case usages and variable formats.\nIn case the JSONPath Extractor is not matched, during a Replay of a Recorded flow, the replaced value will be "),t("code",[e._v(' + "_NOT_FOUND"')]),e._v(".")])]),e._v(" "),t("p",[e._v("JMeter use JSONPath syntax from "),t("a",{attrs:{href:"https://github.com/json-path/JsonPath",target:"_blank",rel:"noopener noreferrer"}},[e._v("Jayway JsonPath"),t("OutboundLink")],1),e._v(" Use the Jayway JsonPath syntax documentation as a reference.")]),e._v(" "),t("p",[e._v("Jayway JsonPath is a java port based on "),t("a",{attrs:{href:"https://goessner.net/articles/JsonPath/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Stefan Goessner's original JSONPath implementation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("It is possible to find multiple examples of JSONPath expressions on the websites mentioned above or on the Internet.")]),e._v(" "),t("p",[e._v('JMeter allows you to evaluate JSONPaths in the Sample results of the ViewResult using the view "JSON Path Tester". However, it is possible to use some other tools on the Internet that facilitate the evaluation and testing of JSONPath, such as the site '),t("a",{attrs:{href:"https://jsonpath.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("jsonpath.com"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("strong",[e._v("JSONPath Example")])]),e._v(" "),t("p",[e._v("An example will be provided below that will allow you to visually understand some general concepts of the JSONPath syntax.")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"store"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"book"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"category"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"reference"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"author"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Nigel Rees"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"title"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Sayings of the Century"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8.95")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"category"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"fiction"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"author"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Evelyn Waugh"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"title"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Sword of Honour"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("12.99")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"category"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"fiction"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"author"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Herman Melville"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"title"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Moby Dick"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"isbn"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0-553-21311-3"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8.99")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"category"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"fiction"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"author"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"J. R. R. Tolkien"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"title"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The Lord of the Rings"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"isbn"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0-395-19395-8"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("22.99")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"bicycle"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"color"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"red"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("399")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Some JSONPath query expressions and their expected result.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("JSONPath")]),e._v(" "),t("th",[e._v("Intended result")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("$.store.book[*].author")]),e._v(" "),t("td",[e._v("the authors of all books in the store")])]),e._v(" "),t("tr",[t("td",[e._v("$..author")]),e._v(" "),t("td",[e._v("all authors")])]),e._v(" "),t("tr",[t("td",[e._v("$.store.*")]),e._v(" "),t("td",[e._v("all things in store, which are some books and a red bicycle")])]),e._v(" "),t("tr",[t("td",[e._v("$.store..price")]),e._v(" "),t("td",[e._v("the prices of everything in the store")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[2]")]),e._v(" "),t("td",[e._v("the third book")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[2].author")]),e._v(" "),t("td",[e._v("the third book's author")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[2].publisher")]),e._v(" "),t("td",[e._v('empty result: the third book does not have a "publisher" member')])]),e._v(" "),t("tr",[t("td",[e._v("$..book[-1]")]),e._v(" "),t("td",[e._v("the last book in order")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[0,1] or $..book[:2]")]),e._v(" "),t("td",[e._v("the first two books")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[?@.isbn]")]),e._v(" "),t("td",[e._v("all books with an ISBN number")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[?@.price<10]")]),e._v(" "),t("td",[e._v("all books cheaper than 10")])]),e._v(" "),t("tr",[t("td",[e._v("$..*")]),e._v(" "),t("td",[e._v("all member values and array elements contained in the input value")])])])]),e._v(" "),t("p",[e._v("The IETF group in charge of creating Internet standards in February 2024 completed its work on the creation of RFC 9535 associated with JSONPath.\nYou can consult the RFC documentation in case you require more details about JSONPath\nhttps://datatracker.ietf.org/doc/rfc9535/")]),e._v(" "),t("h2",{attrs:{id:"variable-generation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#variable-generation"}},[e._v("#")]),e._v(" Variable Generation")]),e._v(" "),t("p",[e._v("The creation of JMeter variables for later usage is one of the pillars of this plugin. Therefore, this section is specially dedicated to understand and review all the possible scenarios.")]),e._v(" "),t("p",[e._v("The generation and assignment of variables are tied to the Extractors which are the ones in charge of extracting the matches and store them. Therefore, a detailed explanation of extractor configuration will be covered during this section.")]),e._v(" "),t("p",[e._v("The most used and complex extractor is the "),t("a",{attrs:{href:"#list-of-correlation-extractors"}},[e._v("Regex Extractor")]),e._v(".\nThis section will be divided into cases, from simple and common cases to unusual ones.")]),e._v(" "),t("h3",{attrs:{id:"extract-specific-match-from-the-response-overwritable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#extract-specific-match-from-the-response-overwritable"}},[e._v("#")]),e._v(" Extract specific match from the response (overwritable)")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("extract the second appearance of a character chain included on the response that matches the given regex")])]),e._v(" "),t("tr",[t("td",[e._v("Configuration")]),e._v(" "),t("td",[e._v("need to specify a variable name (the variable stored will use it), regex, desired match number and no need to check for multi-valued")])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(290),alt:"extractor_configuration_visualization"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("value will be stored in a JMeter variable, with the exact name as the value introduced on the reference variable name field. "),t("strong",[e._v("If a variable exists (from previous extractions) the variable will be overwritten with new match value")])])])])]),e._v(" "),t("h3",{attrs:{id:"extract-specific-match-from-a-response-not-overwritable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#extract-specific-match-from-a-response-not-overwritable"}},[e._v("#")]),e._v(" Extract specific match from a response (not overwritable)")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("extract a certain value from a specific match number on the response. The value will be saved in a non-overwritable variable.")])]),e._v(" "),t("tr",[t("td",[e._v("Configuration")]),e._v(" "),t("td",[e._v("variable name, regex, desired match number and "),t("strong",[e._v("multivalue must be selected")])])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(291),alt:"extractor_configuration_visualization"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("value will be extracted and stored in a variable with the following convention: E.g: "),t("code",[e._v("var#34")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("var")]),e._v(": reference variable name")]),t("li",[t("strong",[e._v("#34")]),e._v(": represents the variable count number")])]),e._v(" Note: this variable will endure the whole execution")])])])]),e._v(" "),t("h3",{attrs:{id:"extract-multiple-variables-that-can-be-overwritten"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#extract-multiple-variables-that-can-be-overwritten"}},[e._v("#")]),e._v(" Extract multiple variables that can be overwritten")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("extract all values that match the regex on the response")])]),e._v(" "),t("tr",[t("td",[e._v("Configuration")]),e._v(" "),t("td",[e._v("variable name, regex, "),t("strong",[e._v("match number needs to be lower than 0")]),e._v(" (E.g: -1). No need for multi-valued.")])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(292),alt:"extractor_configuration_visualization"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("a new variable will be created to store every match found on the response. If the variable already exists, it will be overwritten. The format of this type of variable consists of a prefix (reference variable name) with an underscore followed by the integer which represents the match number of the extracted value. E.g: "),t("strong",[e._v("ID_1")]),e._v(" "),t("br"),e._v(" "),t("strong",[e._v("Important")]),e._v(": If variables are been extracted in previous responses, for instance, 5 matches ("),t("code",[e._v("ID_1, ID_2,..., ID_5")]),e._v("), when another response arrives with new matches, these variables will not just be overwritten, will be deleted. If the new response matches thrice, then the resultant variables will be "),t("code",[e._v("ID_1, ID_2, ID_3")]),e._v(". Previous variables "),t("code",[e._v("ID_4")]),e._v(" and "),t("code",[e._v("ID_5")]),e._v(" will no longer exist.")])])])]),e._v(" "),t("h3",{attrs:{id:"extract-multiple-variables-that-can-not-be-overwritten"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#extract-multiple-variables-that-can-not-be-overwritten"}},[e._v("#")]),e._v(" Extract multiple variables that can NOT be overwritten")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("extract all values that match the regex on the response and store them immutably")])]),e._v(" "),t("tr",[t("td",[e._v("Configuration")]),e._v(" "),t("td",[e._v("variable name, regex, "),t("strong",[e._v("match number needs to be lower than 0")]),e._v(" (E.g: -1). "),t("strong",[t("em",[e._v("Multi-valued needs to be checked")])])])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(293),alt:"extractor_configuration_visualization"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("a new variable will be created to store every match found on the response. This type of extractions have a particular format name. E.g: "),t("code",[e._v("myVar#2_1")]),e._v(" Where: "),t("ul",[t("li",[t("strong",[e._v("myVar")]),e._v(": reference variable name")]),t("li",[t("strong",[e._v("#2")]),e._v(": hash followed by the variable count number")]),t("li",[t("strong",[e._v("_1")]),e._v(": number of match in that response")])]),t("br"),e._v("New JMeter variables are created (with the format showed above) every time a response arrives, and the regex matches more than twice."),t("br"),e._v(" Note: if the response contains one match, and optimization is done. Therefore, the generated variable will be like in section "),t("em",[e._v("Extract specific match from a response (not overwritable)")])])])])]),e._v(" "),t("h2",{attrs:{id:"variable-replacement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#variable-replacement"}},[e._v("#")]),e._v(" Variable Replacement")]),e._v(" "),t("p",[e._v("The replacement of dynamic or static data in a request for JMeter Variables is one of the main objectives of the "),t("strong",[e._v("Auto Correlation Recorder")]),e._v(".")]),e._v(" "),t("p",[e._v("Mainly, the idea is to replace data for variables, therefore, we get a proper correlated script.\nThe data we want to replace needs to match a certain regex, condition or even a criteria.\nThe variable replacement system does support the scenario when the match needs to be replaced for a literal instead of a JMeter Variable (not common case).")]),e._v(" "),t("p",[e._v("Let's give an example in order to set the idea of a replacement.\nSuppose we have a website were is possible to buy products. Those products are identified by a unique id.\nOur objective will be to replace the id number for a JMeter Variable, to later on, buy any product of the store just by modifying the JMeter Variable value.\nConsidering an url like "),t("code",[e._v("www.my-market-place.com/cart.html?product_id=2")]),e._v("\nThe regex we have to build in order to match the data we want to replace, it should be something like: "),t("code",[e._v("product_id=(\\d)")]),e._v(".\nThe result we are looking for should be a request with a parametrized value, in that case, the id number.\nThe desired result will look something like:\n"),t("code",[e._v("www.my-market-place.com/cart.html?product_id=${id_product}")])]),e._v(" "),t("p",[e._v("Now that we have a basic idea of a replacement, lets explain the most complex and used replacement. The "),t("em",[e._v("Regex Correlation Replacement")]),e._v(" which accepts three parameters:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("regex")]),e._v(": the regex needed to match the data to be replaced on a request.")]),e._v(" "),t("li",[t("strong",[e._v("replacementString")]),e._v(": this field is used to set JMeter Functions, or even literals to be used on the comparison of the replacement match value (if value is not ignored).")]),e._v(" "),t("li",[t("strong",[e._v("ignore value")]),e._v(": this check will determine if the match will be compared against all the JMeter Variables or even the execution of a function that can be declared on the "),t("code",[e._v("replacementString")]),e._v(" field. When is checked, it will replace without comparing.")])]),e._v(" "),t("blockquote",[t("p",[e._v("Below is shown all the possible scenarios. Each scenario contains an "),t("em",[e._v("Objective")]),e._v(" which will explain the problem we want to achieve. "),t("em",[e._v("Pre-loaded variables")]),e._v(" will set us in a current variable context, in consideration of generating those variables is mandatory to read the section "),t("a",{attrs:{href:"#variable-generation"}},[e._v("variable-generation")]),e._v(". "),t("em",[e._v("Context")]),e._v(" will provide all necessary information for the scenario, as a global configuration will work under the domain "),t("code",[e._v("www.my-market-place.com")]),e._v(". The "),t("em",[e._v("Visualization")]),e._v(" will show the configuration made on the replacement in order to achieve the desired result.")])]),e._v(" "),t("h3",{attrs:{id:"replace-single-parameter-for-a-variable-in-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-single-parameter-for-a-variable-in-request"}},[e._v("#")]),e._v(" Replace single parameter for a variable in request")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace a parameter of a request for a JMeter Variable.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[t("code",[e._v("ID")]),e._v(" = 2")])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("/cart.html?product_id=2")])])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(294),alt:"single_parameter_replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("Once the regex matches on the request, the matched value will be "),t("code",[e._v("2")]),e._v(". Then it will compare the matched value against all the variables stored. When the matched value equals any variable stored, the replacement will be triggered")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/cart.html?product_id=${ID}")])])])])]),e._v(" "),t("h3",{attrs:{id:"replace-multiple-parameters-for-variables-in-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-multiple-parameters-for-variables-in-request"}},[e._v("#")]),e._v(" Replace multiple parameters for variables in request")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace multiple parameters of a request for JMeter Variables.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[t("code",[e._v("ID_1")]),e._v(" = 2, "),t("code",[e._v("ID_2")]),e._v(" = 3, "),t("code",[e._v("ID_3")]),e._v(" = 4, "),t("code",[e._v("ID_SESSION")]),e._v(" = rP/tHk")])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("/cart.html?product_id=2&product_id=4")])])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(295),alt:"multiple_parameter_replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("For this multi replacement, the regex will match twice (two appearances of "),t("code",[e._v("product_id")]),e._v("), therefore, each matched value will be replaced for the variables containing same value.")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/cart.html?product_id=${ID_1}&product_id=${ID_3}")])])])])]),e._v(" "),t("h3",{attrs:{id:"replace-a-parameter-for-the-result-of-a-variable-transformation-in-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-a-parameter-for-the-result-of-a-variable-transformation-in-request"}},[e._v("#")]),e._v(" Replace a parameter for the result of a variable transformation in request")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace a parameter in request that uses a pre-loaded variable but transformed.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[t("code",[e._v("ID")]),e._v(" = 2, "),t("code",[e._v("ID_SESSION")]),e._v(" = rP/tHk")])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("/index.html?session=rP%2FtHk%3CtsR%21v%3E")]),e._v(". In this particular case, the session id is extracted decoded ("),t("em",[e._v("ID_SESSION")]),e._v(" value) , but on the request it is encoded. Therefore, the stored variable will be different to the matched value on the request. Because of that, we need to use the field "),t("code",[e._v("replacementString")]),e._v(" in order to make that transformation. For this example we are using a JMeter Function called "),t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/functions.html#__urlencode",target:"_blank",rel:"noopener noreferrer"}},[e._v("urlencode"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(296),alt:"single-transformed-replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("Since the replacement string is not empty, the plugin will execute (if executable, could also be a literal) the content. The result of the execution will be used to compare against the regex replacement matched value. When those values match, the replacement is made by placing the content of replacementString on the request.")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/index.html?session=${__urlencode(${ID_SESSION})}")])])])])]),e._v(" "),t("h3",{attrs:{id:"replace-multiple-parameters-for-the-result-of-a-variable-transformation-in-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-multiple-parameters-for-the-result-of-a-variable-transformation-in-request"}},[e._v("#")]),e._v(" Replace multiple parameters for the result of a variable transformation in request")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace a parameter in request that uses pre-loaded variables but transformed.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[t("code",[e._v("prod_1=red car")]),e._v(", "),t("code",[e._v("prod_2=blue car")])])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("delete.html?identifier=red+car&indetifier=blue+car")]),e._v(". In this case, we have to replace two parameters of the request. The value that will be placed on the request, needs to be encoded. Since the pre-loaded variables are not encoded, we need to make a transformation")])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(297),alt:"multiple-transformed-replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("Similar to the previous scenario, in order to proper replace for variables, we have to make a transformation, that will be done by calling the "),t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/functions.html#__urlencod",target:"_blank",rel:"noopener noreferrer"}},[e._v("__urlencode"),t("OutboundLink")],1),e._v(" function provided by JMeter. Since the pre-loaded variables are result of a multiple extraction. The replacement string will have the variable name without the suffix. The plugin automatically will detect that and it will access to all the stored values for that reference variable name.")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/index.html?identifier=${__urlencode(${prod_1})}&identifier=${__urlencode(${prod_2})}")])])])])]),e._v(" "),t("h3",{attrs:{id:"replace-single-parameter-ignoring-matched-value"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-single-parameter-ignoring-matched-value"}},[e._v("#")]),e._v(" Replace single parameter ignoring matched value")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace a parameter in request that uses pre-loaded variables but transformed.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[e._v("No variables used for this case")])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("/main.html?time=1516540541624")]),e._v(". This request contains a parameter which is the current time in milliseconds, therefore, if we had that value stored in a variable it will not work, since we need to set a request with the current time. Therefore we will use the function "),t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/functions.html#__time",target:"_blank",rel:"noopener noreferrer"}},[e._v("__time()"),t("OutboundLink")],1),e._v(" provided by JMeter")])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(298),alt:"ignore_value_replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("It is not possible to compare values in order to achieve our objective, therefore we need to set the current time neglecting the previous value. For that reason the ignore value is checked, it will not execute and compare the replacement string content.")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/main.html?time=${__time()}")])])])])]),e._v(" "),t("h2",{attrs:{id:"list-of-correlation-replacements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-of-correlation-replacements"}},[e._v("#")]),e._v(" List of Correlation Replacements")]),e._v(" "),t("p",[e._v("All the Correlation Replacements mentioned below are installed by default in the plugin. To know more about how to load and save Correlation Rules Templates, please refer to the "),t("a",{attrs:{href:"#saving-and-loading-rules"}},[e._v("Saving and Loading Rules")]),e._v(" section, for further details about it.")]),e._v(" "),t("p",[e._v("In case none of the following Replacements fits the desired behavior your application requires, to correlate the dynamic variables that it might have, feel free to read the "),t("RouterLink",{attrs:{to:"/guide/CUSTOM_EXTENSIONS.html"}},[e._v("Customizing your one extensions")]),e._v(" section that we have prepared for you.")],1),e._v(" "),t("p",[t("strong",[e._v("Regex")])]),e._v(" "),t("p",[e._v("Similarly to the "),t("em",[e._v("Correlation Extractor Regex")]),e._v(", this one also receives a Regular Expression in order to find where the stored value is going to be replaced. Additionally, if a regex extractor with multivalued was added, the replacement will be applied automatically. It will look for a variable with same value as the request match in order to make the replacement. In short, no need to configure replacement to work with a multi-value or single-value.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(299),alt:"Regex Correlation Replacement"}})]),e._v(" "),t("p",[t("strong",[e._v("JSON")])]),e._v(" "),t("p",[e._v("Similarly to the "),t("em",[e._v("JSON Correlation Extractor")]),e._v(", this one also receives a JSONPath Expression in order to find where the stored value is going to be replaced. Additionally, if a JSONPath extractor with multivalued was added, the replacement will be applied automatically. It will look for a variable with same value as the request match in order to make the replacement. In short, no need to configure replacement to work with a multi-value or single-value.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(300),alt:"JSON Correlation Replacement"}})]),e._v(" "),t("p",[e._v("For examples of using JSONPath expressions, refer to the "),t("em",[e._v("JSON Correlation Extractor")]),e._v(" documentation.")]),e._v(" "),t("p",[e._v("The logic behind "),t("strong",[e._v("Replacement string")]),e._v(" and "),t("strong",[e._v("Ignore value")]),e._v(" is the same as "),t("em",[e._v("Regex Correlation Replacement")]),e._v(". Go to the documentation related to "),t("strong",[e._v("Variable Replacement")]),e._v(" for usage examples.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/12.f9921f7f.js b/assets/js/12.f9921f7f.js new file mode 100644 index 0000000..96c96c8 --- /dev/null +++ b/assets/js/12.f9921f7f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{278:function(e,t,a){e.exports=a.p+"assets/img/rules-container-table.e97b7270.png"},279:function(e,t,a){e.exports=a.p+"assets/img/adding-new-group.87794fb8.png"},280:function(e,t,a){e.exports=a.p+"assets/img/adding-new-rule.1723c0c7.png"},281:function(e,t,a){e.exports=a.p+"assets/img/click-helper.7d13756d.gif"},282:function(e,t,a){e.exports=a.p+"assets/img/selecting-other-correlation-extractor.7cbb9991.gif"},283:function(e,t,a){e.exports=a.p+"assets/img/expand-advance-sextion-extractor.631ac121.gif"},284:function(e,t,a){e.exports=a.p+"assets/img/add_custom_extractor.6df5ef7a.gif"},285:function(e,t,a){e.exports=a.p+"assets/img/selecting-other-correlation-replacement.ab34ae11.gif"},286:function(e,t,a){e.exports=a.p+"assets/img/expand-advance-sextion-replacement.e8237937.gif"},287:function(e,t,a){e.exports=a.p+"assets/img/add_custom_replacement.85bd80f5.gif"},288:function(e,t,a){e.exports=a.p+"assets/img/regex-correlation-extractor.532bedc2.png"},289:function(e,t){e.exports="data:image/png;base64,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"},290:function(e,t,a){e.exports=a.p+"assets/img/extraction-specific-match-overwritable.6d4a674d.png"},291:function(e,t,a){e.exports=a.p+"assets/img/extraction-specific-match-non-overwritable.8f3ecfe2.png"},292:function(e,t,a){e.exports=a.p+"assets/img/extraction-multiple-overwritable.c67e2986.png"},293:function(e,t,a){e.exports=a.p+"assets/img/extraction-multiple-non-overwritable.aaa5f661.png"},294:function(e,t,a){e.exports=a.p+"assets/img/single-parameter-replacement.f9ba0ebb.png"},295:function(e,t,a){e.exports=a.p+"assets/img/multiple-parameter-replacement.f9ba0ebb.png"},296:function(e,t,a){e.exports=a.p+"assets/img/single-transformed-replacement.384c8711.png"},297:function(e,t,a){e.exports=a.p+"assets/img/multiple-transformed-replacement.384c8711.png"},298:function(e,t,a){e.exports=a.p+"assets/img/ignore-value-replacement.05499008.png"},299:function(e,t,a){e.exports=a.p+"assets/img/regex-correlation-replacement.6f279beb.png"},300:function(e,t){e.exports="data:image/png;base64,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"},349:function(e,t,a){"use strict";a.r(t);var r=a(14),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"correlation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation"}},[e._v("#")]),e._v(" Correlation")]),e._v(" "),t("p",[e._v("Now that you know how the process works, lets talk about the players involved and how those interact between each other.")]),e._v(" "),t("h2",{attrs:{id:"correlation-extractor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-extractor"}},[e._v("#")]),e._v(" Correlation Extractor")]),e._v(" "),t("p",[e._v("When a "),t("strong",[e._v("Response")]),e._v(" comes from the server, there are ways to get the information, depending on where the value its changing:")]),e._v(" "),t("ul",[t("li",[e._v("It could change on the URL, for example, using an ID or a Token")]),e._v(" "),t("li",[e._v("It could be en the Body, set in a field (visible or hidden)")]),e._v(" "),t("li",[e._v("It could be stored on a Cookie, that has an expiration date")])]),e._v(" "),t("p",[e._v("The Correlation Extractor has, as its main responsibility, locate if in any of these cases, there are embedded\ndynamic variables. In the case where there are, its second responsibility is to extract and save the value so\nthat, in future requests that the app made, other players take those values and replace it, allowing the full\ncycle to be completed.")]),e._v(" "),t("h2",{attrs:{id:"correlation-replacement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-replacement"}},[e._v("#")]),e._v(" Correlation Replacement")]),e._v(" "),t("p",[e._v("Now that its known who it's the one responsible to extract the values from the responses, it's the responsibility\nto the Correlation Replacement to take those values and replacement them in the following requests, made to the server.")]),e._v(" "),t("h2",{attrs:{id:"reference-variable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reference-variable"}},[e._v("#")]),e._v(" Reference Variable")]),e._v(" "),t("p",[e._v("Even if it's not part of the process of correlating dynamic values, when one its extracted, the name of the place\nwhere its stored, and from where its going to be taken, in order to replace it, in the subsequent requests,\nit's called Reference Variable.")]),e._v(" "),t("p",[e._v("Everything that it's been explained, so far, will be used in one final tool: a Correlation Rule.")]),e._v(" "),t("h1",{attrs:{id:"correlation-rule"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-rule"}},[e._v("#")]),e._v(" Correlation Rule")]),e._v(" "),t("p",[e._v("Once all those concepts are explained, the tool that allows to merge them together, it's the Correlation Rule.")]),e._v(" "),t("p",[e._v("Each Correlation Rule contains, a Correlation Extractor, as you now know, to extracts the dynamic value,\na Reference Variable, to store the value from the Extractor for the Replacement, and one Correlation Replacement.")]),e._v(" "),t("p",[e._v("Each one of these rules, will help to make this whole process of capturing and replacing values between responses and\nrequests, not only possible, but also easier than if you manage to do it, alone, using JMeter.")]),e._v(" "),t("h3",{attrs:{id:"configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[e._v("#")]),e._v(" Configuration")]),e._v(" "),t("p",[e._v("Assuming you know "),t("RouterLink",{attrs:{to:"/guide/correlation-process.html#correlation-process-2"}},[e._v("what a correlation is")]),e._v(" and which parts of the process\nthe "),t("RouterLink",{attrs:{to:"/guide/after-recording.html#by-using-correlation-templates"}},[e._v("Correlation Rules are part of")]),e._v(" lets jump into adding and configuring your rules.")],1),e._v(" "),t("p",[e._v("Go to "),t("em",[e._v("bzm - Auto Correlation Recorder")]),e._v(" > click the Rules Tab.")]),e._v(" "),t("p",[e._v("You will be presented with multiple options to add, move and delete your Correlation Rules Groups, any rule that you want to add must be inside a group")]),e._v(" "),t("p",[t("img",{attrs:{src:a(278),alt:"Rules Container",title:"Correlation Rules Container"}})]),e._v(" "),t("h3",{attrs:{id:"adding-groups"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-groups"}},[e._v("#")]),e._v(" Adding Groups")]),e._v(" "),t("p",[e._v("When clicking the "),t("em",[e._v("Add")]),e._v(" button, a Correlation Group will be added at the bottom of your list of groups.")]),e._v(" "),t("p",[e._v("Each group will contain the header with the buttons to enable/disable, editing group name, and add, remove and move the rules inside the group. Below the header, it is placed the table which will contain all the rules associated to that group")]),e._v(" "),t("p",[t("img",{attrs:{src:a(279),alt:"Correlation Group",title:"The groups will be inserted at the end"}})]),e._v(" "),t("h3",{attrs:{id:"adding-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-rules"}},[e._v("#")]),e._v(" Adding Rules")]),e._v(" "),t("p",[e._v("When clicking the "),t("strong",[e._v("+")]),e._v(" button, a Correlation Rule will be added at the bottom of your list of rules.")]),e._v(" "),t("p",[e._v("Each rule will contain a field in each one of the columns: Reference Variable, Correlation Extractor, and Correlation Replacement")]),e._v(" "),t("p",[t("img",{attrs:{src:a(280),alt:"Correlation Rule",title:"The rules will be inserted at the end"}})]),e._v(" "),t("p",[e._v("Each Correlation Extractor and Correlation Replacement Combo will have a helper icon, right next to it that, when clicked, will display information regarding it ("),t("em",[e._v("What it does?")]),e._v(" and "),t("em",[e._v("How to customize it?")]),e._v(")")]),e._v(" "),t("p",[t("img",{attrs:{src:a(281),alt:"Correlation Rule Hover",title:"Display Informative Helper"}})]),e._v(" "),t("h4",{attrs:{id:"selecting-a-correlation-extractor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#selecting-a-correlation-extractor"}},[e._v("#")]),e._v(" Selecting a Correlation Extractor")]),e._v(" "),t("p",[e._v("By default, when a Correlation Rule is added, it will have automatically selected the Regex Correlation Extractor. You can change it by clicking on the combo box on the Correlation Extractor column of that Rule.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(282),alt:"Selecting one Correlation Extractor",title:"Selecting one Correlation Extractor"}})]),e._v(" "),t("p",[e._v("Each type of Extractor has its own set of parameters, some of them are visible when the extractor is selected, but the advanced ones are hidden by default, those are shown when the parameters section is expanded.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(283),alt:"Expand_Advance_Section Extractor",title:"Expanding advance section on Correlation Extractor"}})]),e._v(" "),t("p",[e._v("By default, only Regex extractor will be able to be selected, to select other of the extractors available or a custom extractor there is an option "),t("strong",[e._v("More")]),e._v(" in the combo box which will display all the available extractors, here the desired extractor should be selected and added to actives extractors.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(284),alt:"Add_Custom_Extractor",title:"Adding custom Correlation Extractor"}})]),e._v(" "),t("p",[e._v("If another Extractor is selected, the previous values will be deleted. Filling all the fields, with the desired parameters, will allow the plugin to Extract the dynamic values from the responses.")]),e._v(" "),t("p",[e._v("More about how to configure each Correlation Extractor (this and the ones that comes with the Siebel Extension), please refer to our "),t("a",{attrs:{href:"#list-of-correlation-extractors"}},[e._v("List of Correlation Extractors")]),e._v(" section.")]),e._v(" "),t("h4",{attrs:{id:"selecting-a-correlation-replacement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#selecting-a-correlation-replacement"}},[e._v("#")]),e._v(" Selecting a Correlation Replacement")]),e._v(" "),t("p",[e._v("Just like the Correlation Extractors, the Regex Correlation Replacement will be selected, by default, when adding a Correlation Rule.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(285),alt:"Selecting Replacement Correlation",title:"Selecting one Correlation Replacement"}})]),e._v(" "),t("p",[e._v("Also, Correlation Replacements have their own Advance section, like Correlation Extractors")]),e._v(" "),t("p",[t("img",{attrs:{src:a(286),alt:"Expand_Advance_Section Replacement",title:"Expanding advance section on Correlation Replacement"}})]),e._v(" "),t("p",[e._v("As in Correlation Extractor, here to add any Correlation Replacement the option "),t("strong",[e._v("more")]),e._v(" should be used.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(287),alt:"Add_Custom_Replacement",title:"Adding custom Correlation Replacement"}})]),e._v(" "),t("p",[e._v("And their behavior goes sames as its predecessor. Once one option its selected, the fields to configure it, will be displayed right next to it.")]),e._v(" "),t("p",[e._v("More about how to configure each Correlation Replacements (this and the ones that comes with the Siebel Extension), please refer to our "),t("a",{attrs:{href:"#list-of-correlation-replacements"}},[e._v("List of Correlation Replacements")]),e._v(" section.")]),e._v(" "),t("p",[e._v("Note that, each time you select a different Extractor or Replacement, inside your correlation rule, the values that you had set to the respective fields, will be lost. For Saving your Rule configurations, before getting creative, please refer to the "),t("a",{attrs:{href:"#saving-and-loading-rules"}},[e._v("Saving and Loading Rules")]),e._v(" section.")]),e._v(" "),t("h4",{attrs:{id:"reference-variable-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reference-variable-2"}},[e._v("#")]),e._v(" Reference Variable")]),e._v(" "),t("p",[e._v("Once a value its extracted for the Correlation Extractor, it's stored in a variable, this field will determine the name of it. In future request, the Correlation Replacement will be applied and, if it successfully finds the place to apply it, will bring the value from here and replacement it there, for a smooth transition.")]),e._v(" "),t("h3",{attrs:{id:"list-of-correlation-extractors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-of-correlation-extractors"}},[e._v("#")]),e._v(" List of Correlation Extractors")]),e._v(" "),t("p",[e._v("All the Correlation Extractors mentioned below comes either installed by default in the plugin, or as a part of the preloaded Siebel Template. To know more about how to load and save Correlation Rules Templates, please refer to the "),t("a",{attrs:{href:"#saving-and-loading-rules"}},[e._v("Saving and Loading Rules")]),e._v(" section, for further details about it.")]),e._v(" "),t("p",[e._v("In case none of the following ones fits the desired behavior your application requires, to correlate the dynamic variables that it might have, feel free to read the "),t("a",{attrs:{href:"custom-extensions"}},[e._v("Customizing your one extensions")]),e._v(" section that we have prepared for you.")]),e._v(" "),t("p",[t("strong",[e._v("Regex")])]),e._v(" "),t("p",[e._v("RegEx stands for Regular Expression, and relies on the use of Regular Expressions to find where the dynamic variable might found.")]),e._v(" "),t("p",[e._v("When the regular expression its matched, a Regex Extractor will be added to the sample when:")]),e._v(" "),t("ol",[t("li",[e._v("The Regular Expression is matched, based on the configured properties")]),e._v(" "),t("li",[e._v("The matched value is not repeated")])]),e._v(" "),t("p",[e._v("This extractor comes installed, by default, in the plugin, and it receives 4 fields to be able to work properly:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(288),alt:"Regex Correlation Extractor"}})]),e._v(" "),t("ol",[t("li",[t("em",[e._v("RegEx")]),e._v(": which corresponds to the Regular Expression that will be used to perform the extraction.")]),e._v(" "),t("li",[t("em",[e._v("Match Number")]),e._v(": In the case that the Regex matches more than once in the response, this number will indicate which one of all of them it's going to be extracted. Use the value "),t("code",[e._v("-1")]),e._v(" when you need to retrieve all matched values from the expressions.")]),e._v(" "),t("li",[t("em",[e._v("Match Group")]),e._v(": In the case that the Regex contains, more than one group, this field indicates which one of those is going to be considered to do the extraction, once the Regex its matched. Only use positive numbers.")]),e._v(" "),t("li",[t("em",[e._v("Target")]),e._v(": Which field to check the regular expression against.\n"),t("ul",[t("li",[t("em",[e._v("The following fields can be checked: (from JMeter documentation):")])]),e._v(" "),t("li",[t("em",[e._v("Body")]),e._v(" - the body of the response, e.g. the content of a web-page (excluding headers)")]),e._v(" "),t("li",[t("em",[e._v("Body (unescaped)")]),e._v(" - the body of the response, with all Html escape codes replaced. Note that Html escapes are processed wi thought regard of context, so some incorrect substitutions may be made. Note that this option highly impacts performances, so use it only when absolutely necessary and be aware of its impacts.")]),e._v(" "),t("li",[t("em",[e._v("Body as a Document")]),e._v(" - extract text from various type of documents via Apache Tika. Note that Body as a Document option can impact performance, so ensure it is OK for your test.")]),e._v(" "),t("li",[t("em",[e._v("Request Headers")]),e._v(" - the request header of the HTTP sampler.")]),e._v(" "),t("li",[t("em",[e._v("Response Headers")]),e._v(" - the response header of the HTTP sampler.")]),e._v(" "),t("li",[t("em",[e._v("URL")])]),e._v(" "),t("li",[t("em",[e._v("Response Code")]),e._v(" - e.g. 200")]),e._v(" "),t("li",[t("em",[e._v("Response Message")]),e._v(" - e.g. OK")])])]),e._v(" "),t("li",[t("em",[e._v("Multivalued")]),e._v(": Multiple valuation is useful when we want to separate each unique value as a particular variant name from different responses. Variables extracted with multivalued are non-overwritable and additionally they have a specific format. See "),t("a",{attrs:{href:"#variable-generation"}},[e._v("Variable Generation")]),e._v(" for case usages and variable formats.\nIn case the Regex Extractor is not matched, during a Replay of a Recorded flow, the replaced value will be "),t("code",[e._v(' + "_NOT_FOUND"')]),e._v(".")])]),e._v(" "),t("p",[t("strong",[e._v("JSON")])]),e._v(" "),t("p",[e._v("JSON stands for JavaScript Object Notation, and relies on the use of JSONPath Expressions to find where the dynamic variable might found.")]),e._v(" "),t("p",[e._v("When the JSONPath its matched, a JSONPath Extractor will be added to the sample when:")]),e._v(" "),t("ol",[t("li",[e._v("The JSONPath is matched, based on the configured properties")]),e._v(" "),t("li",[e._v("The matched value is not repeated")])]),e._v(" "),t("p",[e._v("This extractor comes installed, by default, in the plugin, and it receives 4 fields to be able to work properly:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(289),alt:"JSON Correlation Extractor"}})]),e._v(" "),t("ol",[t("li",[t("em",[e._v("JSON")]),e._v(": which corresponds to the JSONPath Expression that will be used to perform the extraction.")]),e._v(" "),t("li",[t("em",[e._v("Match Number")]),e._v(": In the case that the JSONPath matches more than once in the response, this number will indicate which one of all of them it's going to be extracted. Use the value "),t("code",[e._v("-1")]),e._v(" when you need to retrieve all matched values from the expressions.")]),e._v(" "),t("li",[t("em",[e._v("Target")]),e._v(": Which field to check the regular expression against.\n"),t("ul",[t("li",[t("em",[e._v("The following fields can be checked: (from JMeter documentation):")])]),e._v(" "),t("li",[t("em",[e._v("Body")]),e._v(" - the body of the response, e.g. the content of a web-page (excluding headers)")])])]),e._v(" "),t("li",[t("em",[e._v("Multivalued")]),e._v(": Multiple valuation is useful when we want to separate each unique value as a particular variant name from different responses. Variables extracted with multivalued are non-overwritable and additionally they have a specific format. See "),t("a",{attrs:{href:"#variable-generation"}},[e._v("Variable Generation")]),e._v(" for case usages and variable formats.\nIn case the JSONPath Extractor is not matched, during a Replay of a Recorded flow, the replaced value will be "),t("code",[e._v(' + "_NOT_FOUND"')]),e._v(".")])]),e._v(" "),t("p",[e._v("JMeter use JSONPath syntax from "),t("a",{attrs:{href:"https://github.com/json-path/JsonPath",target:"_blank",rel:"noopener noreferrer"}},[e._v("Jayway JsonPath"),t("OutboundLink")],1),e._v(" Use the Jayway JsonPath syntax documentation as a reference.")]),e._v(" "),t("p",[e._v("Jayway JsonPath is a java port based on "),t("a",{attrs:{href:"https://goessner.net/articles/JsonPath/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Stefan Goessner's original JSONPath implementation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("It is possible to find multiple examples of JSONPath expressions on the websites mentioned above or on the Internet.")]),e._v(" "),t("p",[e._v('JMeter allows you to evaluate JSONPaths in the Sample results of the ViewResult using the view "JSON Path Tester". However, it is possible to use some other tools on the Internet that facilitate the evaluation and testing of JSONPath, such as the site '),t("a",{attrs:{href:"https://jsonpath.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("jsonpath.com"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("strong",[e._v("JSONPath Example")])]),e._v(" "),t("p",[e._v("An example will be provided below that will allow you to visually understand some general concepts of the JSONPath syntax.")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"store"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"book"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"category"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"reference"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"author"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Nigel Rees"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"title"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Sayings of the Century"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8.95")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"category"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"fiction"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"author"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Evelyn Waugh"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"title"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Sword of Honour"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("12.99")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"category"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"fiction"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"author"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Herman Melville"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"title"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Moby Dick"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"isbn"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0-553-21311-3"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8.99")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"category"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"fiction"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"author"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"J. R. R. Tolkien"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"title"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The Lord of the Rings"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"isbn"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0-395-19395-8"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("22.99")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"bicycle"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"color"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"red"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"price"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("399")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Some JSONPath query expressions and their expected result.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("JSONPath")]),e._v(" "),t("th",[e._v("Intended result")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("$.store.book[*].author")]),e._v(" "),t("td",[e._v("the authors of all books in the store")])]),e._v(" "),t("tr",[t("td",[e._v("$..author")]),e._v(" "),t("td",[e._v("all authors")])]),e._v(" "),t("tr",[t("td",[e._v("$.store.*")]),e._v(" "),t("td",[e._v("all things in store, which are some books and a red bicycle")])]),e._v(" "),t("tr",[t("td",[e._v("$.store..price")]),e._v(" "),t("td",[e._v("the prices of everything in the store")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[2]")]),e._v(" "),t("td",[e._v("the third book")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[2].author")]),e._v(" "),t("td",[e._v("the third book's author")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[2].publisher")]),e._v(" "),t("td",[e._v('empty result: the third book does not have a "publisher" member')])]),e._v(" "),t("tr",[t("td",[e._v("$..book[-1]")]),e._v(" "),t("td",[e._v("the last book in order")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[0,1] or $..book[:2]")]),e._v(" "),t("td",[e._v("the first two books")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[?@.isbn]")]),e._v(" "),t("td",[e._v("all books with an ISBN number")])]),e._v(" "),t("tr",[t("td",[e._v("$..book[?@.price<10]")]),e._v(" "),t("td",[e._v("all books cheaper than 10")])]),e._v(" "),t("tr",[t("td",[e._v("$..*")]),e._v(" "),t("td",[e._v("all member values and array elements contained in the input value")])])])]),e._v(" "),t("p",[e._v("The IETF group in charge of creating Internet standards in February 2024 completed its work on the creation of RFC 9535 associated with JSONPath.\nYou can consult the RFC documentation in case you require more details about JSONPath\nhttps://datatracker.ietf.org/doc/rfc9535/")]),e._v(" "),t("h2",{attrs:{id:"variable-generation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#variable-generation"}},[e._v("#")]),e._v(" Variable Generation")]),e._v(" "),t("p",[e._v("The creation of JMeter variables for later usage is one of the pillars of this plugin. Therefore, this section is specially dedicated to understand and review all the possible scenarios.")]),e._v(" "),t("p",[e._v("The generation and assignment of variables are tied to the Extractors which are the ones in charge of extracting the matches and store them. Therefore, a detailed explanation of extractor configuration will be covered during this section.")]),e._v(" "),t("p",[e._v("The most used and complex extractor is the "),t("a",{attrs:{href:"#list-of-correlation-extractors"}},[e._v("Regex Extractor")]),e._v(".\nThis section will be divided into cases, from simple and common cases to unusual ones.")]),e._v(" "),t("h3",{attrs:{id:"extract-specific-match-from-the-response-overridable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#extract-specific-match-from-the-response-overridable"}},[e._v("#")]),e._v(" Extract specific match from the response (overridable)")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("extract the second appearance of a character chain included on the response that matches the given regex")])]),e._v(" "),t("tr",[t("td",[e._v("Configuration")]),e._v(" "),t("td",[e._v("need to specify a variable name (the variable stored will use it), regex, desired match number and no need to check for multi-valued")])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(290),alt:"extractor_configuration_visualization"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("value will be stored in a JMeter variable, with the exact name as the value introduced on the reference variable name field. "),t("strong",[e._v("If a variable exists (from previous extractions) the variable will be overwritten with new match value")])])])])]),e._v(" "),t("h3",{attrs:{id:"extract-specific-match-from-a-response-not-overridable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#extract-specific-match-from-a-response-not-overridable"}},[e._v("#")]),e._v(" Extract specific match from a response (not overridable)")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("extract a certain value from a specific match number on the response. The value will be saved in a non-overwritable variable.")])]),e._v(" "),t("tr",[t("td",[e._v("Configuration")]),e._v(" "),t("td",[e._v("variable name, regex, desired match number and "),t("strong",[e._v("multivalue must be selected")])])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(291),alt:"extractor_configuration_visualization"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("value will be extracted and stored in a variable with the following convention: E.g: "),t("code",[e._v("var#34")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("var")]),e._v(": reference variable name")]),t("li",[t("strong",[e._v("#34")]),e._v(": represents the variable count number")])]),e._v(" Note: this variable will endure the whole execution")])])])]),e._v(" "),t("h3",{attrs:{id:"extract-multiple-variables-that-can-be-overwritten"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#extract-multiple-variables-that-can-be-overwritten"}},[e._v("#")]),e._v(" Extract multiple variables that can be overwritten")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("extract all values that match the regex on the response")])]),e._v(" "),t("tr",[t("td",[e._v("Configuration")]),e._v(" "),t("td",[e._v("variable name, regex, "),t("strong",[e._v("match number needs to be lower than 0")]),e._v(" (E.g: -1). No need for multi-valued.")])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(292),alt:"extractor_configuration_visualization"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("a new variable will be created to store every match found on the response. If the variable already exists, it will be overwritten. The format of this type of variable consists of a prefix (reference variable name) with an underscore followed by the integer which represents the match number of the extracted value. E.g: "),t("strong",[e._v("ID_1")]),e._v(" "),t("br"),e._v(" "),t("strong",[e._v("Important")]),e._v(": If variables are been extracted in previous responses, for instance, 5 matches ("),t("code",[e._v("ID_1, ID_2,..., ID_5")]),e._v("), when another response arrives with new matches, these variables will not just be overwritten, will be deleted. If the new response matches thrice, then the resultant variables will be "),t("code",[e._v("ID_1, ID_2, ID_3")]),e._v(". Previous variables "),t("code",[e._v("ID_4")]),e._v(" and "),t("code",[e._v("ID_5")]),e._v(" will no longer exist.")])])])]),e._v(" "),t("h3",{attrs:{id:"extract-multiple-variables-that-can-not-be-overwritten"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#extract-multiple-variables-that-can-not-be-overwritten"}},[e._v("#")]),e._v(" Extract multiple variables that can NOT be overwritten")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("extract all values that match the regex on the response and store them immutably")])]),e._v(" "),t("tr",[t("td",[e._v("Configuration")]),e._v(" "),t("td",[e._v("variable name, regex, "),t("strong",[e._v("match number needs to be lower than 0")]),e._v(" (E.g: -1). "),t("strong",[t("em",[e._v("Multi-valued needs to be checked")])])])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(293),alt:"extractor_configuration_visualization"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("a new variable will be created to store every match found on the response. This type of extractions have a particular format name. E.g: "),t("code",[e._v("myVar#2_1")]),e._v(" Where: "),t("ul",[t("li",[t("strong",[e._v("myVar")]),e._v(": reference variable name")]),t("li",[t("strong",[e._v("#2")]),e._v(": hash followed by the variable count number")]),t("li",[t("strong",[e._v("_1")]),e._v(": number of match in that response")])]),t("br"),e._v("New JMeter variables are created (with the format showed above) every time a response arrives, and the regex matches more than twice."),t("br"),e._v(" Note: if the response contains one match, and optimization is done. Therefore, the generated variable will be like in section "),t("em",[e._v("Extract specific match from a response (not overwritable)")])])])])]),e._v(" "),t("h2",{attrs:{id:"variable-replacement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#variable-replacement"}},[e._v("#")]),e._v(" Variable Replacement")]),e._v(" "),t("p",[e._v("The replacement of dynamic or static data in a request for JMeter Variables is one of the main objectives of the "),t("strong",[e._v("Auto Correlation Recorder")]),e._v(".")]),e._v(" "),t("p",[e._v("Mainly, the idea is to replace data for variables, therefore, we get a proper correlated script.\nThe data we want to replace needs to match a certain regex, condition or even a criteria.\nThe variable replacement system does support the scenario when the match needs to be replaced for a literal instead of a JMeter Variable (not common case).")]),e._v(" "),t("p",[e._v("Let's give an example in order to set the idea of a replacement.\nSuppose we have a website were is possible to buy products. Those products are identified by a unique id.\nOur objective will be to replace the id number for a JMeter Variable, to later on, buy any product of the store just by modifying the JMeter Variable value.\nConsidering an url like "),t("code",[e._v("www.my-market-place.com/cart.html?product_id=2")]),e._v("\nThe regex we have to build in order to match the data we want to replace, it should be something like: "),t("code",[e._v("product_id=(\\d)")]),e._v(".\nThe result we are looking for should be a request with a parametrized value, in that case, the id number.\nThe desired result will look something like:\n"),t("code",[e._v("www.my-market-place.com/cart.html?product_id=${id_product}")])]),e._v(" "),t("p",[e._v("Now that we have a basic idea of a replacement, lets explain the most complex and used replacement. The "),t("em",[e._v("Regex Correlation Replacement")]),e._v(" which accepts three parameters:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("regex")]),e._v(": the regex needed to match the data to be replaced on a request.")]),e._v(" "),t("li",[t("strong",[e._v("replacementString")]),e._v(": this field is used to set JMeter Functions, or even literals to be used on the comparison of the replacement match value (if value is not ignored).")]),e._v(" "),t("li",[t("strong",[e._v("ignore value")]),e._v(": this check will determine if the match will be compared against all the JMeter Variables or even the execution of a function that can be declared on the "),t("code",[e._v("replacementString")]),e._v(" field. When is checked, it will replace without comparing.")])]),e._v(" "),t("blockquote",[t("p",[e._v("Below is shown all the possible scenarios. Each scenario contains an "),t("em",[e._v("Objective")]),e._v(" which will explain the problem we want to achieve. "),t("em",[e._v("Pre-loaded variables")]),e._v(" will set us in a current variable context, in consideration of generating those variables is mandatory to read the section "),t("a",{attrs:{href:"#variable-generation"}},[e._v("variable-generation")]),e._v(". "),t("em",[e._v("Context")]),e._v(" will provide all necessary information for the scenario, as a global configuration will work under the domain "),t("code",[e._v("www.my-market-place.com")]),e._v(". The "),t("em",[e._v("Visualization")]),e._v(" will show the configuration made on the replacement in order to achieve the desired result.")])]),e._v(" "),t("h3",{attrs:{id:"replace-single-parameter-for-a-variable-in-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-single-parameter-for-a-variable-in-request"}},[e._v("#")]),e._v(" Replace single parameter for a variable in request")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace a parameter of a request for a JMeter Variable.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[t("code",[e._v("ID")]),e._v(" = 2")])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("/cart.html?product_id=2")])])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(294),alt:"single_parameter_replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("Once the regex matches on the request, the matched value will be "),t("code",[e._v("2")]),e._v(". Then it will compare the matched value against all the variables stored. When the matched value equals any variable stored, the replacement will be triggered")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/cart.html?product_id=${ID}")])])])])]),e._v(" "),t("h3",{attrs:{id:"replace-multiple-parameters-for-variables-in-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-multiple-parameters-for-variables-in-request"}},[e._v("#")]),e._v(" Replace multiple parameters for variables in request")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace multiple parameters of a request for JMeter Variables.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[t("code",[e._v("ID_1")]),e._v(" = 2, "),t("code",[e._v("ID_2")]),e._v(" = 3, "),t("code",[e._v("ID_3")]),e._v(" = 4, "),t("code",[e._v("ID_SESSION")]),e._v(" = rP/tHk")])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("/cart.html?product_id=2&product_id=4")])])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(295),alt:"multiple_parameter_replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("For this multi replacement, the regex will match twice (two appearances of "),t("code",[e._v("product_id")]),e._v("), therefore, each matched value will be replaced for the variables containing same value.")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/cart.html?product_id=${ID_1}&product_id=${ID_3}")])])])])]),e._v(" "),t("h3",{attrs:{id:"replace-a-parameter-for-the-result-of-a-variable-transformation-in-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-a-parameter-for-the-result-of-a-variable-transformation-in-request"}},[e._v("#")]),e._v(" Replace a parameter for the result of a variable transformation in request")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace a parameter in request that uses a pre-loaded variable but transformed.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[t("code",[e._v("ID")]),e._v(" = 2, "),t("code",[e._v("ID_SESSION")]),e._v(" = rP/tHk")])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("/index.html?session=rP%2FtHk%3CtsR%21v%3E")]),e._v(". In this particular case, the session id is extracted decoded ("),t("em",[e._v("ID_SESSION")]),e._v(" value) , but on the request it is encoded. Therefore, the stored variable will be different to the matched value on the request. Because of that, we need to use the field "),t("code",[e._v("replacementString")]),e._v(" in order to make that transformation. For this example we are using a JMeter Function called "),t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/functions.html#__urlencode",target:"_blank",rel:"noopener noreferrer"}},[e._v("urlencode"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(296),alt:"single-transformed-replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("Since the replacement string is not empty, the plugin will execute (if executable, could also be a literal) the content. The result of the execution will be used to compare against the regex replacement matched value. When those values match, the replacement is made by placing the content of replacementString on the request.")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/index.html?session=${__urlencode(${ID_SESSION})}")])])])])]),e._v(" "),t("h3",{attrs:{id:"replace-multiple-parameters-for-the-result-of-a-variable-transformation-in-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-multiple-parameters-for-the-result-of-a-variable-transformation-in-request"}},[e._v("#")]),e._v(" Replace multiple parameters for the result of a variable transformation in request")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace a parameter in request that uses pre-loaded variables but transformed.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[t("code",[e._v("prod_1=red car")]),e._v(", "),t("code",[e._v("prod_2=blue car")])])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("delete.html?identifier=red+car&indetifier=blue+car")]),e._v(". In this case, we have to replace two parameters of the request. The value that will be placed on the request, needs to be encoded. Since the pre-loaded variables are not encoded, we need to make a transformation")])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(297),alt:"multiple-transformed-replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("Similar to the previous scenario, in order to proper replace for variables, we have to make a transformation, that will be done by calling the "),t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/functions.html#__urlencod",target:"_blank",rel:"noopener noreferrer"}},[e._v("__urlencode"),t("OutboundLink")],1),e._v(" function provided by JMeter. Since the pre-loaded variables are result of a multiple extraction. The replacement string will have the variable name without the suffix. The plugin automatically will detect that and it will access to all the stored values for that reference variable name.")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/index.html?identifier=${__urlencode(${prod_1})}&identifier=${__urlencode(${prod_2})}")])])])])]),e._v(" "),t("h3",{attrs:{id:"replace-single-parameter-ignoring-matched-value"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#replace-single-parameter-ignoring-matched-value"}},[e._v("#")]),e._v(" Replace single parameter ignoring matched value")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th"),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("Objective")]),e._v(" "),t("td",[e._v("replace a parameter in request that uses pre-loaded variables but transformed.")])]),e._v(" "),t("tr",[t("td",[e._v("Pre-loaded variables")]),e._v(" "),t("td",[e._v("No variables used for this case")])]),e._v(" "),t("tr",[t("td",[e._v("Context")]),e._v(" "),t("td",[e._v("Request is "),t("code",[e._v("/main.html?time=1516540541624")]),e._v(". This request contains a parameter which is the current time in milliseconds, therefore, if we had that value stored in a variable it will not work, since we need to set a request with the current time. Therefore we will use the function "),t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/functions.html#__time",target:"_blank",rel:"noopener noreferrer"}},[e._v("__time()"),t("OutboundLink")],1),e._v(" provided by JMeter")])]),e._v(" "),t("tr",[t("td",[e._v("Visualization")]),e._v(" "),t("td",[t("img",{attrs:{src:a(298),alt:"ignore_value_replacement"}})])]),e._v(" "),t("tr",[t("td",[e._v("Overall")]),e._v(" "),t("td",[e._v("It is not possible to compare values in order to achieve our objective, therefore we need to set the current time neglecting the previous value. For that reason the ignore value is checked, it will not execute and compare the replacement string content.")])]),e._v(" "),t("tr",[t("td",[e._v("Replacement result")]),e._v(" "),t("td",[t("code",[e._v("www.my-market-place.com/main.html?time=${__time()}")])])])])]),e._v(" "),t("h2",{attrs:{id:"list-of-correlation-replacements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#list-of-correlation-replacements"}},[e._v("#")]),e._v(" List of Correlation Replacements")]),e._v(" "),t("p",[e._v("All the Correlation Replacements mentioned below are installed by default in the plugin. To know more about how to load and save Correlation Rules Templates, please refer to the "),t("a",{attrs:{href:"#saving-and-loading-rules"}},[e._v("Saving and Loading Rules")]),e._v(" section, for further details about it.")]),e._v(" "),t("p",[e._v("In case none of the following Replacements fits the desired behavior your application requires, to correlate the dynamic variables that it might have, feel free to read the "),t("a",{attrs:{href:"custom-extensions"}},[e._v("Customizing your one extensions")]),e._v(" section that we have prepared for you.")]),e._v(" "),t("p",[t("strong",[e._v("Regex")])]),e._v(" "),t("p",[e._v("Similarly to the "),t("em",[e._v("Regex Correlation Extractor")]),e._v(", this one also receives a Regular Expression in order to find where the stored value is going to be replaced. Additionally, if a regex extractor with multivalued was added, the replacement will be applied automatically. It will look for a variable with same value as the request match in order to make the replacement. In short, no need to configure replacement to work with a multi-value or single-value.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(299),alt:"Regex Correlation Replacement"}})]),e._v(" "),t("p",[t("strong",[e._v("JSON")])]),e._v(" "),t("p",[e._v("Similarly to the "),t("em",[e._v("JSON Correlation Extractor")]),e._v(", this one also receives a JSONPath Expression in order to find where the stored value is going to be replaced. Additionally, if a JSONPath extractor with multivalued was added, the replacement will be applied automatically. It will look for a variable with same value as the request match in order to make the replacement. In short, no need to configure replacement to work with a multi-value or single-value.")]),e._v(" "),t("p",[t("img",{attrs:{src:a(300),alt:"JSON Correlation Replacement"}})]),e._v(" "),t("p",[e._v("For examples of using JSONPath expressions, refer to the "),t("em",[e._v("JSON Correlation Extractor")]),e._v(" documentation.")]),e._v(" "),t("p",[e._v("The logic behind "),t("strong",[e._v("Replacement string")]),e._v(" and "),t("strong",[e._v("Ignore value")]),e._v(" is the same as "),t("em",[e._v("Regex Correlation Replacement")]),e._v(". Go to the documentation related to "),t("strong",[e._v("Variable Replacement")]),e._v(" for usage examples.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/13.68840eae.js b/assets/js/13.68840eae.js new file mode 100644 index 0000000..77ffa67 --- /dev/null +++ b/assets/js/13.68840eae.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13,3,15,18,23,24,26],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return g}));n(90);const i=/#.*$/,s=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",s=o(t);return r.test(s)?t:s+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),s=function(t){const e=t.match(i);if(e)return e[0]}(e);if(s&&n!==s)return!1;return o(t.path)===o(e)}function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const s=e.split("/");n&&s[s.length-1]||s.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,s=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,i,s+1)),collapsable:!1!==e.collapsable}}}(t,s,n)):[]}return[]}function b(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var i=n(239),s={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(14),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},242:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},s=(n(243),n(14)),r=Object(s.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},245:function(t,e,n){},247:function(t,e,n){},250:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},252:function(t,e,n){"use strict";n(245)},253:function(t,e,n){"use strict";n.r(e);var i=n(266),s=n(255),r=n(239);function a(t,e){if("group"===e.type){const n=e.path&&Object(r.e)(t,e.path),i=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(r.e)(t,e.path));return n||i}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:i.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(r.e)(this.$route,t.regularPath)}}},l=n(14),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,i){return e("li",{key:i},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:i===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},254:function(t,e,n){"use strict";n.r(e);var i=n(241),s=n(242),r=n(91),a=n.n(r),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:s.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},255:function(t,e,n){"use strict";n.r(e);var i=n(239);function s(t,e,n,i,s){const r={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return s>2&&(r.style={"padding-left":s+"rem"}),t("RouterLink",r,n)}function r(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(i.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,n+"#"+e.slug,e.title,u,e.level-1),r(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(i.e)(a,u.path),h="auto"===u.type?p||u.children.some(t=>Object(i.e)(a,u.basePath+"#"+t.slug)):p,d="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,h),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[d,r(t,u.children,u.basePath,a,f)];if((h||b)&&u.headers&&!i.d.test(u.path)){return[d,r(t,Object(i.c)(u.headers),u.path,a,f)]}return d}},o=(n(252),n(14)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},257:function(t,e,n){"use strict";n(247)},263:function(t,e,n){"use strict";n(250)},264:function(t,e,n){},265:function(t,e,n){"use strict";n.r(e);var i=n(254),s=n(239),r={name:"NavLinks",components:{NavLink:n(241).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},s={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(s=>{const r=t[s],a=i[s]&&i[s].label||r.lang;let o;return r.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,s),n.some(t=>t.path===o)||(o=s)),{text:a,link:o}})};return[...this.userNav,s]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(s.j)(t),{items:(t.items||[]).map(s.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;nfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},246:function(t,e){t.exports=function(t){return null==t}},248:function(t,e,n){},249:function(t,e,n){},259:function(t,e,n){"use strict";n(248)},260:function(t,e,n){var r=n(11),i=n(4),a=n(10);t.exports=function(t){return"string"==typeof t||!i(t)&&a(t)&&"[object String]"==r(t)}},261:function(t,e,n){"use strict";n(249)},262:function(t,e,n){},269:function(t,e,n){"use strict";n.r(e);var r=n(246),i=n.n(r),a=n(239),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=i()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:r="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,r,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,r,i){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i+`?mode=edit&spa=0&at=${r}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}}},o=(n(259),n(14)),u=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=u.exports},270:function(t,e,n){"use strict";n.r(e);n(90);var r=n(239),i=n(260),a=n.n(i),s=n(246),o=n.n(s),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return l(c.PREV,this)},next(){return l(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function l(t,{$themeConfig:e,$page:n,$route:i,$site:s,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:l,getPageLinkConfig:p}=t,f=l(e),d=p(n),h=o()(d)?f:d;return!1===h?void 0:a()(h)?Object(r.k)(s.pages,h,i.path):c(n,u)}function p(t,e,n){const r=[];!function t(e,n){for(let r=0,i=e.length;rfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var i=n(239),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(14),a=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},242:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(243),n(14)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},247:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},254:function(t,e,n){"use strict";n.r(e);var i=n(241),r=n(242),s=n(91),a=n.n(s),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},257:function(t,e,n){"use strict";n(247)},265:function(t,e,n){"use strict";n.r(e);var i=n(254),r=n(239),s={name:"NavLinks",components:{NavLink:n(241).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},r={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(r=>{const s=t[r],a=i[r]&&i[r].label||s.lang;let o;return s.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,r),n.some(t=>t.path===o)||(o=r)),{text:a,link:o}})};return[...this.userNav,r]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(r.j)(t),{items:(t.items||[]).map(r.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n({placeholder:void 0}),watch:{$lang(e){this.update(this.options,e)},options(e){this.update(e,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(e,t){Promise.all([Promise.all([a.e(0),a.e(10)]).then(a.t.bind(null,331,7)),Promise.all([a.e(0),a.e(10)]).then(a.t.bind(null,332,7))]).then(([a])=>{a=a.default;const{algoliaOptions:i={}}=e;a(Object.assign({},e,{inputSelector:"#algolia-search-input",algoliaOptions:{...i,facetFilters:["lang:"+t].concat(i.facetFilters||[])},handleSelected:(e,t,a)=>{const{pathname:i,hash:n}=new URL(a.url),r=i.replace(this.$site.base,"/"),s=decodeURIComponent(n);this.$router.push(`${r}${s}`)}}))})},update(e,t){this.$el.innerHTML='',this.initialize(e,t)}}},n=(a(317),a(14)),r=Object(n.a)(i,(function(){var e=this._self._c;return e("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[e("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/18.1fe0d8ba.js b/assets/js/18.1fe0d8ba.js new file mode 100644 index 0000000..4c9416c --- /dev/null +++ b/assets/js/18.1fe0d8ba.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[18,24,26],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return b})),n.d(e,"j",(function(){return g}));n(90);const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(i,"").replace(r,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",r=a(t);return s.test(r)?t:r+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return a(t.path)===a(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return h(n,e,i);if(Array.isArray(e))return Object.assign(h(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var i=n(239),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(14),o=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},242:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(243),n(14)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},254:function(t,e,n){"use strict";n.r(e);var i=n(241),r=n(242),s=n(91),o=n.n(s),a={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/19.3e5e139d.js b/assets/js/19.3e5e139d.js new file mode 100644 index 0000000..290d618 --- /dev/null +++ b/assets/js/19.3e5e139d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{267:function(e,t,o){e.exports=o.p+"assets/img/replay-report-dialog.1dbf3aa4.png"},268:function(e,t,o){e.exports=o.p+"assets/img/auto-correlation-successful-dialog.767f2b93.png"},275:function(e,t,o){e.exports=o.p+"assets/img/select-correlation-method.ee4c0ff0.png"},276:function(e,t,o){e.exports=o.p+"assets/img/select-correlation-template.20f55cce.png"},277:function(e,t,o){e.exports=o.p+"assets/img/correlation-suggestions.174920a1.png"},324:function(e,t,o){e.exports=o.p+"assets/img/select-automatic-correlation-method.4ca24240.png"},325:function(e,t,o){e.exports=o.p+"assets/img/automatic-correlation-suggestions.6ee5945d.png"},342:function(e,t,o){"use strict";o.r(t);var a=o(14),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"automatic-correlation-methods"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automatic-correlation-methods"}},[e._v("#")]),e._v(" Automatic Correlation methods")]),e._v(" "),t("p",[e._v("This section covers the Automatic Correlation methods available in the plugin. These methods allow you to\nautomatically correlate dynamic values in your recordings. Unlike the Correlation Rules method, which must be\nconfigured before recording, these methods are performed after the recording is complete. This provides greater\nflexibility, as the correlations can be reviewed and rolled back if necessary.")]),e._v(" "),t("p",[e._v("We'll discuss the pros and cons of each method to help you determine which one is best suited for your needs.")]),e._v(" "),t("p",[t("strong",[e._v("Supported methods")])]),e._v(" "),t("p",[e._v("At this stage, the supported methods can correlate by:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#by-using-correlation-templates"}},[e._v("By Using Correlation Templates")])]),e._v(" "),t("li",[t("a",{attrs:{href:"automatic-comparison-and-variable-detection"}},[e._v("By Automatic comparison and variable detection")])])]),e._v(" "),t("p",[e._v("Let's see what each one of these methods has to offer.")]),e._v(" "),t("h2",{attrs:{id:"by-using-correlation-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#by-using-correlation-templates"}},[e._v("#")]),e._v(" By using Correlation Templates")]),e._v(" "),t("p",[e._v("This method involves analyzing a recording using different Correlation Templates to automatically detect dynamic\nvalues. It generates a list of Correlation Suggestions based on those values, and lets you choose which ones\nto apply in the Test Plan.")]),e._v(" "),t("p",[e._v("Pros:")]),e._v(" "),t("ul",[t("li",[e._v("This is the most reliable method as it only correlates the dynamic values found with the rules in the Correlation Template.")]),e._v(" "),t("li",[e._v("It lets you test any set of Correlation Rules before applying them to the Test Plan.")]),e._v(" "),t("li",[e._v("You can easily roll-back changes made to the Test Plan as it stores it in a separate file.")]),e._v(" "),t("li",[e._v("It integrates with the Correlation Repository feature, allowing you to use the Correlation Templates from BlazeMeter,\nGitHub or any other sources, aside from your local ones.")])]),e._v(" "),t("p",[e._v("Cons:")]),e._v(" "),t("ul",[t("li",[e._v("It still requires Rules to properly correlate the dynamic values.")]),e._v(" "),t("li",[e._v("It does not detect dynamic values that are not present in the Correlation Templates.")])]),e._v(" "),t("h3",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("details",{staticClass:"custom-block details"},[t("summary",[e._v("Quick step guide")]),e._v(" "),t("ol",[t("li",[e._v("Open the Correlation Wizard")]),e._v(" "),t("li",[e._v("Select the "),t("strong",[e._v("Automatic comparison and variable detection")]),e._v(" method.")]),e._v(" "),t("li",[e._v("Add the JTL file of the recording (if it isn't already loaded).")]),e._v(" "),t("li",[e._v('Press "Continue"')]),e._v(" "),t("li",[e._v("Review the Correlation Suggestions")]),e._v(" "),t("li",[e._v('Press "Auto Correlate" to apply the suggestions to the Test Plan.')])])]),e._v(" "),t("p",[t("strong",[e._v("Detailed steps")])]),e._v(" "),t("ol",[t("li",[e._v("Open the Correlation Wizard")])]),e._v(" "),t("p",[e._v("To open the Correlation Wizard, you can either:")]),e._v(" "),t("ul",[t("li",[e._v("Accept the replay report Dialog, after the recording.")]),e._v(" "),t("li",[e._v("Click on the "),t("strong",[e._v("Correlation Wizard")]),e._v(" button in the "),t("strong",[e._v("Correlation")]),e._v(" tab.")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(267),alt:"Replay Report Dialog"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("Select the "),t("strong",[e._v("Existing Correlation Templates")]),e._v(" method")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(275),alt:"Select Correlation Method"}})]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Select the Templates to use for the analysis")])]),e._v(" "),t("p",[e._v("The next step is to select the Correlation Templates to use for the analysis. You can select one or more templates.\nIf you select more than one, the plugin will use the union of the dynamic values found in all of them.")]),e._v(" "),t("p",[e._v("By default, the latest version of a Template is selected, but you can change that by clicking on the field in the Version column.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(276),alt:"Select Correlation Templates"}})]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Since version "),t("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/releases/tag/v2.5.1",target:"_blank",rel:"noopener noreferrer"}},[e._v("v2.5.1"),t("OutboundLink")],1),e._v(" you can quickly test your pre-existing rules in the Correlation rules tab by selecting the "),t("em",[e._v("Draft")]),e._v(" template.\nAs long as you have rules underdevelopment, the Draft template will be accessible.")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("If you have the BlazeMeter integration on, depending on your account type (Free or Enterprise), you might see some\nCorrelation Templates that are not available for you (they will have a lock icon next to them).")]),e._v(" "),t("p",[e._v("If you want to know more about Enterprise Correlation Templates, please contact your BlazeMeter representative.")])]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Add the JTL file of the recording (if it isn't already loaded)")])]),e._v(" "),t("p",[e._v('By default, the plugin loads the JTL file that is found in the View Result Tree of the "bzm - Auto Correlation Recorder" element.\nIf you want to use a different JTL file, you can click on the "Browse" button and select the file you want to use.')]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("It is highly recommended that you use the JTL file that that comes from the recording, since it contains the\nraw data of the recording. If you use a different JTL file, the analyzed data might not be accurate, hence\nthe results might not be as realistic as expected.")])]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v('Press "Continue"')]),e._v(" "),t("li",[e._v("Review the Correlation Suggestions\nOnce the analysis is done, the plugin will display the Correlation Suggestions.")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(277),alt:"Correlation Suggestions"}}),e._v("\nReview the name of the arguments, the values, where they were found and used. If you want to apply a suggestion,\nselect the checkbox next to it. If you want to ignore a suggestion, uncheck the checkbox.")]),e._v(" "),t("ol",{attrs:{start:"7"}},[t("li",[e._v('Press "Apply" to apply the suggestions to the Test Plan.')])]),e._v(" "),t("p",[e._v("The plugin will automatically correlate the dynamic values in the Test Plan, and will display a dialog informing you\nthat the process was successful.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(268),alt:"Auto Correlate Successful"}})]),e._v(" "),t("h3",{attrs:{id:"forcing-the-correlation-of-a-dynamic-value"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#forcing-the-correlation-of-a-dynamic-value"}},[e._v("#")]),e._v(" Forcing the correlation of a dynamic value")]),e._v(" "),t("p",[e._v("As mentioned earlier, the plugin will only try to correlate the parameters in the requests that failed during the replay. If a request does not fail (for example, it returns a 200 status code), but you still want the plugin to include it in the automatic correlation process, you can force it by adding an assertion to the request.")]),e._v(" "),t("p",[e._v("To add an assertion to an HTTP request in JMeter, follow these steps:")]),e._v(" "),t("ol",[t("li",[e._v("Open your JMeter test plan and navigate to the Thread Group where the HTTP request is located.")]),e._v(" "),t("li",[e._v("Select the HTTP request and right-click on it.")]),e._v(" "),t("li",[e._v('Click on "Add" and then select "Assertions".')]),e._v(" "),t("li",[e._v('Choose the type of assertion you want to add (for example, "Response Assertion").')]),e._v(" "),t("li",[e._v("Configure the assertion by specifying the criteria that must be met for the assertion to pass.")]),e._v(" "),t("li",[e._v("Save your changes and run the test again.")])]),e._v(" "),t("p",[e._v("Official documentation: https://jmeter.apache.org/usermanual/test_plan.html#assertions")]),e._v(" "),t("h2",{attrs:{id:"automatic-comparison-and-variable-detection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automatic-comparison-and-variable-detection"}},[e._v("#")]),e._v(" Automatic Comparison and Variable Detection")]),e._v(" "),t("p",[e._v("This method involves analyzing the results of a recording replay by comparing them with the original recording. It\nonly focuses on the arguments of the requests that failed in the replay. By doing so, it generates a list of\nCorrelation Suggestions based on the differences found, allowing you to select which ones to apply in the Test Plan.")]),e._v(" "),t("p",[t("strong",[e._v("Pros and Cons")])]),e._v(" "),t("p",[e._v("Pros:")]),e._v(" "),t("ul",[t("li",[e._v("It is pretty flexible, since it detects dynamic values that you might not be aware of.")]),e._v(" "),t("li",[e._v("It is customizable, since you can configure how the analysis is done.")])]),e._v(" "),t("p",[e._v("Cons:")]),e._v(" "),t("ul",[t("li",[e._v("It is not 100% bullet-proof, since it might correlate dynamic values that are not necessarily dynamic")])]),e._v(" "),t("h3",{attrs:{id:"usage-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage-2"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("details",{staticClass:"custom-block details"},[t("summary",[e._v("Quick step guide")]),e._v(" "),t("ol",[t("li",[e._v("Open the Correlation Wizard.\n"),t("ul",[t("li",[e._v("If you have done a recording you can confirm the generation of correlation suggestions which redirects you to Correlation Wizard")])])]),e._v(" "),t("li",[e._v("Select the "),t("strong",[e._v("Automatic comparison and variable detection")]),e._v(" method.")]),e._v(" "),t("li",[e._v("Review the Correlation Suggestions")]),e._v(" "),t("li",[e._v('Press "Apply" to apply the suggestions to the Test Plan.')])])]),e._v(" "),t("p",[t("strong",[e._v("Detailed guide")])]),e._v(" "),t("ol",[t("li",[e._v("Open the Correlation Wizard")])]),e._v(" "),t("p",[e._v("To open the Correlation Wizard, you can either:")]),e._v(" "),t("ul",[t("li",[e._v("Accept the replay report Dialog, after the recording.")]),e._v(" "),t("li",[e._v("Click on the Correlation Wizard button in the Correlation tab.")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(267),alt:"Replay Report Dialog"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("Select the "),t("strong",[e._v("Automatic comparison and variable detection")]),e._v(" method")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(324),alt:"Select Correlation Method"}})]),e._v(" "),t("p",[e._v("After pressing continue the generation of suggestions has began, depending on the complexity of the scenario this step might take while.")]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Review Correlation Suggestions")])]),e._v(" "),t("p",[t("img",{attrs:{src:o(325),alt:"Correlation Suggestions"}})]),e._v(" "),t("p",[e._v("Review the name of the arguments, the values, where they were found and used. If you want to apply a suggestion, select the checkbox next to it. If you want to ignore a suggestion, uncheck the checkbox.")]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v('Press "Apply" to apply the suggestions to the Test Plan.')])]),e._v(" "),t("p",[e._v("The plugin will automatically correlate the dynamic values in the Test Plan, and will display a dialog informing you that the process was successful.")]),e._v(" "),t("p",[t("img",{attrs:{src:o(268),alt:"Auto Correlate Successful"}})])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/2.f9b1806f.js b/assets/js/2.f9b1806f.js new file mode 100644 index 0000000..1304ba6 --- /dev/null +++ b/assets/js/2.f9b1806f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{245:function(t,e,n){},246:function(t,e){t.exports=function(t){return null==t}},248:function(t,e,n){},249:function(t,e,n){},250:function(t,e,n){},252:function(t,e,n){"use strict";n(245)},253:function(t,e,n){"use strict";n.r(e);var i=n(266),s=n(255),a=n(239);function r(t,e){if("group"===e.type){const n=e.path&&Object(a.e)(t,e.path),i=e.children.some(e=>"group"===e.type?r(t,e):"page"===e.type&&Object(a.e)(t,e.path));return n||i}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:i.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(a.e)(this.$route,t.regularPath)}}},l=n(14),p=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,i){return e("li",{key:i},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:i===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=p.exports},255:function(t,e,n){"use strict";n.r(e);var i=n(239);function s(t,e,n,i,s){const a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return s>2&&(a.style={"padding-left":s+"rem"}),t("RouterLink",a,n)}function a(t,e,n,r,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const p=Object(i.e)(r,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,n+"#"+e.slug,e.title,p,e.level-1),a(t,e.children,n,r,o,l+1)])}))}var r={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:r,$themeConfig:o,$themeLocaleConfig:l},props:{item:p,sidebarDepth:u}}){const c=Object(i.e)(r,p.path),d="auto"===p.type?c||p.children.some(t=>Object(i.e)(r,p.basePath+"#"+t.slug)):c,h="external"===p.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,p.path,p.title||p.path):s(t,p.path,p.title||p.path,d),f=[e.frontmatter.sidebarDepth,u,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===p.type)return[h,a(t,p.children,p.basePath,r,f)];if((d||b)&&p.headers&&!i.d.test(p.path)){return[h,a(t,Object(i.c)(p.headers),p.path,r,f)]}return h}},o=(n(252),n(14)),l=Object(o.a)(r,void 0,void 0,!1,null,null,null);e.default=l.exports},259:function(t,e,n){"use strict";n(248)},260:function(t,e,n){var i=n(11),s=n(4),a=n(10);t.exports=function(t){return"string"==typeof t||!s(t)&&a(t)&&"[object String]"==i(t)}},261:function(t,e,n){"use strict";n(249)},262:function(t,e,n){},263:function(t,e,n){"use strict";n(250)},264:function(t,e,n){},266:function(t,e,n){"use strict";n.r(e);var i=n(239),s={name:"SidebarGroup",components:{DropdownTransition:n(242).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(253).default},methods:{isActive:i.e}},a=(n(263),n(14)),r=Object(a.a)(s,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=r.exports},269:function(t,e,n){"use strict";n.r(e);var i=n(246),s=n.n(i),a=n(239),r={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=s()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:i="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,i,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,i,s){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+s+`?mode=edit&spa=0&at=${i}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+s}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+s}}},o=(n(259),n(14)),l=Object(o.a)(r,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=l.exports},270:function(t,e,n){"use strict";n.r(e);n(90);var i=n(239),s=n(260),a=n.n(s),r=n(246),o=n.n(r),l={name:"PageNav",props:["sidebarItems"],computed:{prev(){return u(p.PREV,this)},next(){return u(p.NEXT,this)}}};const p={NEXT:{resolveLink:function(t,e){return c(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return c(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function u(t,{$themeConfig:e,$page:n,$route:s,$site:r,sidebarItems:l}){const{resolveLink:p,getThemeLinkConfig:u,getPageLinkConfig:c}=t,d=u(e),h=c(n),f=o()(h)?d:h;return!1===f?void 0:a()(f)?Object(i.k)(r.pages,f,s.path):p(n,l)}function c(t,e,n){const i=[];!function t(e,n){for(let i=0,s=e.length;i({isSidebarOpen:!1}),computed:{shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(o.l)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,n=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(n)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},p=n(14),u=Object(p.a)(l,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?e("Home"):e("Page",{attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/20.64cd2e60.js b/assets/js/20.64cd2e60.js new file mode 100644 index 0000000..f5141bc --- /dev/null +++ b/assets/js/20.64cd2e60.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{239:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return o})),e.d(n,"i",(function(){return a})),e.d(n,"f",(function(){return u})),e.d(n,"g",(function(){return c})),e.d(n,"h",(function(){return p})),e.d(n,"b",(function(){return l})),e.d(n,"e",(function(){return f})),e.d(n,"k",(function(){return h})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return v})),e.d(n,"j",(function(){return b}));e(90);const r=/#.*$/,i=/\.(md|html)$/,o=/\/$/,a=/^[a-z]+:/i;function s(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return a.test(t)}function c(t){return/^mailto:/.test(t)}function p(t){return/^tel:/.test(t)}function l(t){if(u(t))return t;const n=t.match(r),e=n?n[0]:"",i=s(t);return o.test(i)?t:i+".html"+e}function f(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return s(t.path)===s(n)}function h(t,n,e){if(u(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const o=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return h(e,n,r);if(Array.isArray(n))return Object.assign(h(e,n[0],r),{title:n[1]});{const o=n.children||[];return 0===o.length&&n.path?Object.assign(h(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:o.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function v(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},246:function(t,n){t.exports=function(t){return null==t}},249:function(t,n,e){},260:function(t,n,e){var r=e(11),i=e(4),o=e(10);t.exports=function(t){return"string"==typeof t||!i(t)&&o(t)&&"[object String]"==r(t)}},261:function(t,n,e){"use strict";e(249)},270:function(t,n,e){"use strict";e.r(n);e(90);var r=e(239),i=e(260),o=e.n(i),a=e(246),s=e.n(a),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return p(c.PREV,this)},next(){return p(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,n){return l(t,n,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,n){return l(t,n,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function p(t,{$themeConfig:n,$page:e,$route:i,$site:a,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:p,getPageLinkConfig:l}=t,f=p(n),h=l(e),d=s()(h)?f:h;return!1===d?void 0:o()(d)?Object(r.k)(a.pages,d,i.path):c(e,u)}function l(t,n,e){const r=[];!function t(n,e){for(let r=0,i=n.length;rfunction t(e,n,r,i=1){if("string"==typeof e)return p(n,e,r);if(Array.isArray(e))return Object.assign(p(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(p(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function m(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},241:function(t,e,n){"use strict";n.r(e);var r=n(239),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},a=n(14),s=Object(a.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=s.exports},256:function(t,e,n){},271:function(t,e,n){"use strict";n(256)},309:function(t,e,n){"use strict";n.r(e);var r={name:"Home",components:{NavLink:n(241).default},computed:{data(){return this.$page.frontmatter},actionLink(){return{link:this.data.actionLink,text:this.data.actionText}}}},i=(n(271),n(14)),a=Object(i.a)(r,(function(){var t=this,e=t._self._c;return e("main",{staticClass:"home",attrs:{"aria-labelledby":null!==t.data.heroText?"main-title":null}},[e("header",{staticClass:"hero"},[t.data.heroImage?e("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:t.data.heroAlt||"hero"}}):t._e(),t._v(" "),t._m(0),t._v(" "),t.data.actionText&&t.data.actionLink?e("p",{staticClass:"action"},[e("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?e("div",{staticClass:"features"},t._l(t.data.features,(function(n,r){return e("div",{key:r,staticClass:"feature"},[e("h2",[t._v(t._s(n.title))]),t._v(" "),e("p",[t._v(t._s(n.details))])])})),0):t._e(),t._v(" "),e("Content",{staticClass:"theme-default-content custom"}),t._v(" "),t._m(1)],1)}),[function(){var t=this._self._c;return t("p",{staticClass:"description"},[this._v("\n Effortlessly handle dynamic values in "),t("a",{attrs:{href:"https://jmeter.apache.org/"}},[this._v("JMeter")]),this._v(" with the Correlation recorder plugin.\n ")])},function(){var t=this._self._c;return t("div",{staticClass:"footer"},[this._v("\n Made by "),t("a",{attrs:{href:"https://guide.blazemeter.com/hc/en-us"}},[this._v("Blazemeter")]),this._v("️ | Apache 2.0 Licensed | Powered by "),t("a",{attrs:{href:"https://vuepress.vuejs.org/"}},[this._v("Vuepress")])])}],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/22.729edd31.js b/assets/js/22.729edd31.js new file mode 100644 index 0000000..e82e765 --- /dev/null +++ b/assets/js/22.729edd31.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return c})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return d})),n.d(e,"e",(function(){return p})),n.d(e,"k",(function(){return f})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return b}));n(90);const i=/#.*$/,r=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function c(t){return s.test(t)}function u(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function d(t){if(c(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function f(t,e,n){if(c(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},246:function(t,e){t.exports=function(t){return null==t}},248:function(t,e,n){},259:function(t,e,n){"use strict";n(248)},269:function(t,e,n){"use strict";n.r(e);var i=n(246),r=n.n(i),a=n(239),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=r()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:i="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,i,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,i,r){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r+`?mode=edit&spa=0&at=${i}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}}},o=(n(259),n(14)),c=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/23.8b69fca4.js b/assets/js/23.8b69fca4.js new file mode 100644 index 0000000..81a39cc --- /dev/null +++ b/assets/js/23.8b69fca4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return o})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(90);const r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function u(t){return decodeURI(t).replace(r,"").replace(i,"")}function o(t){return s.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function p(t){if(o(t))return t;const e=t.match(r),n=e?e[0]:"",i=u(t);return a.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return u(t.path)===u(e)}function d(t,e,n){if(o(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},245:function(t,e,n){},252:function(t,e,n){"use strict";n(245)},255:function(t,e,n){"use strict";n.r(e);var r=n(239);function i(t,e,n,r,i){const a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(a.style={"padding-left":i+"rem"}),t("RouterLink",a,n)}function a(t,e,n,s,u,o=1){return!e||o>u?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const c=Object(r.e)(s,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,c,e.level-1),a(t,e.children,n,s,u,o+1)])}))}var s={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:s,$themeConfig:u,$themeLocaleConfig:o},props:{item:c,sidebarDepth:l}}){const p=Object(r.e)(s,c.path),f="auto"===c.type?p||c.children.some(t=>Object(r.e)(s,c.basePath+"#"+t.slug)):p,d="external"===c.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,c.path,c.title||c.path):i(t,c.path,c.title||c.path,f),h=[e.frontmatter.sidebarDepth,l,o.sidebarDepth,u.sidebarDepth,1].find(t=>void 0!==t),b=o.displayAllHeaders||u.displayAllHeaders;if("auto"===c.type)return[d,a(t,c.children,c.basePath,s,h)];if((f||b)&&c.headers&&!r.d.test(c.path)){return[d,a(t,Object(r.c)(c.headers),c.path,s,h)]}return d}},u=(n(252),n(14)),o=Object(u.a)(s,void 0,void 0,!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/24.c29fb8d5.js b/assets/js/24.c29fb8d5.js new file mode 100644 index 0000000..3255cac --- /dev/null +++ b/assets/js/24.c29fb8d5.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{240:function(t,e,n){},242:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(243),n(14)),o=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=o.exports},243:function(t,e,n){"use strict";n(240)}}]); \ No newline at end of file diff --git a/assets/js/25.f0aec97e.js b/assets/js/25.f0aec97e.js new file mode 100644 index 0000000..532de58 --- /dev/null +++ b/assets/js/25.f0aec97e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{258:function(t,c,n){},272:function(t,c,n){"use strict";n(258)},312:function(t,c,n){"use strict";n.r(c);n(272);var i=n(14),s=Object(i.a)({},(function(){var t=this,c=t._self._c;return c("div",{staticClass:"sidebar-button",on:{click:function(c){return t.$emit("toggle-sidebar")}}},[c("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[c("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);c.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/26.9731c624.js b/assets/js/26.9731c624.js new file mode 100644 index 0000000..38ca0df --- /dev/null +++ b/assets/js/26.9731c624.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{239:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return s})),e.d(n,"i",(function(){return u})),e.d(n,"f",(function(){return a})),e.d(n,"g",(function(){return l})),e.d(n,"h",(function(){return c})),e.d(n,"b",(function(){return f})),e.d(n,"e",(function(){return h})),e.d(n,"k",(function(){return p})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return b})),e.d(n,"j",(function(){return m}));e(90);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,u=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function a(t){return u.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function f(t){if(a(t))return t;const n=t.match(r),e=n?n[0]:"",i=o(t);return s.test(i)?t:i+".html"+e}function h(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return o(t.path)===o(n)}function p(t,n,e){if(a(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return p(e,n,r);if(Array.isArray(n))return Object.assign(p(e,n[0],r),{title:n[1]});{const s=n.children||[];return 0===s.length&&n.path?Object.assign(p(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:s.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function b(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},241:function(t,n,e){"use strict";e.r(n);var r=e(239),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=e(14),u=Object(s.a)(i,(function(){var t=this,n=t._self._c;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(n){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null);n.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/27.e165342a.js b/assets/js/27.e165342a.js new file mode 100644 index 0000000..33db681 --- /dev/null +++ b/assets/js/27.e165342a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{323:function(t,e,a){t.exports=a.p+"assets/img/umlDiagram.b924f6c9.png"},341:function(t,e,a){"use strict";a.r(e);var r=a(14),s=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"contributing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contributing"}},[t._v("#")]),t._v(" Contributing")]),t._v(" "),e("p",[t._v("We are using a custom "),e("a",{attrs:{href:"http://checkstyle.sourceforge.net/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("checkstyle"),e("OutboundLink")],1),t._v(" configuration file which is based on google's one. It is advisable to use one of the "),e("a",{attrs:{href:"https://github.com/google/styleguide",target:"_blank",rel:"noopener noreferrer"}},[t._v("google style configuration files"),e("OutboundLink")],1),t._v(" in IDEs to reduce the friction with checkstyle and automate styling.")]),t._v(" "),e("h2",{attrs:{id:"building"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#building"}},[t._v("#")]),t._v(" Building")]),t._v(" "),e("h3",{attrs:{id:"pre-requisites"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pre-requisites"}},[t._v("#")]),t._v(" Pre-requisites")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://www.oracle.com/technetwork/java/javase/downloads/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("jdk 1.8+"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://maven.apache.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("maven 3.3+"),e("OutboundLink")],1)])]),t._v(" "),e("h3",{attrs:{id:"build"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[t._v("#")]),t._v(" Build")]),t._v(" "),e("p",[t._v("To build the plugin and run all tests just run "),e("code",[t._v("mvn clean verify")])]),t._v(" "),e("h3",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("To use the plugin, install it (by copying the jar from "),e("code",[t._v("target")]),t._v(" folder) in "),e("code",[t._v("lib/ext/")]),t._v(" folder of the JMeter installation.")]),t._v(" "),e("p",[t._v("Run JMeter and check the new Siebel HTTP(S) Test Script Recorder is available.")]),t._v(" "),e("h3",{attrs:{id:"class-diagram"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#class-diagram"}},[t._v("#")]),t._v(" Class Diagram")]),t._v(" "),e("p",[t._v("The following diagram contains all the relationships between the classes. Please take a close look at it, and also the code, for further understanding.")]),t._v(" "),e("p",[e("img",{attrs:{src:a(323),alt:"Project Diagram"}})])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/28.35423b5f.js b/assets/js/28.35423b5f.js new file mode 100644 index 0000000..8c4d4fb --- /dev/null +++ b/assets/js/28.35423b5f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{301:function(t,e,a){t.exports=a.p+"assets/img/exampleDiagram.9e15f8a4.png"},350:function(t,e,a){"use strict";a.r(e);var s=a(14),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-extensions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-extensions"}},[t._v("#")]),t._v(" Custom Extensions")]),t._v(" "),e("p",[t._v("When the current Correlation Extensions are not enough, you can create your own Correlation Extension.\nIn this guide we will explain how to create them and how you can extend the current ones.")]),t._v(" "),e("h2",{attrs:{id:"requisites"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requisites"}},[t._v("#")]),t._v(" Requisites")]),t._v(" "),e("p",[t._v("These are the minimum requisites that you will need to start:")]),t._v(" "),e("ul",[e("li",[t._v("Use java 1.8")]),t._v(" "),e("li",[t._v("Maven 1.3+")]),t._v(" "),e("li",[t._v("JMeter 5.2.1")])]),t._v(" "),e("h2",{attrs:{id:"dependencies"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[t._v("#")]),t._v(" Dependencies")]),t._v(" "),e("p",[t._v("Before we begin with the elements that are required to create a Correlation Extension, we need to\nadd the Auto Correlation Recorder as dependency. To do that, you need to add the following to your pom.xml:")]),t._v(" "),e("ol",[e("li",[t._v("The Auto Correlation Recorder dependency")]),t._v(" "),e("li",[t._v("The JMeter dependency")])]),t._v(" "),e("p",[t._v("An example of a basic pom.xml file would be:")]),t._v(" "),e("div",{staticClass:"language-XML extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("xmlns")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://maven.apache.org/POM/4.0.0"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n"),e("span",{pre:!0,attrs:{class:"token attr-name"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("schemaLocation")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("modelVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("4.0.0"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project.build.sourceEncoding")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("UTF-8"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project.reporting.outputEncoding")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("UTF-8"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("jmeter.version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("3.3"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencies")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.apache.jmeter"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("ApacheJMeter_core"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("${jmeter.version}"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("scope")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("provided"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("exclusions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("exclusion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("commons-logging"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("commons-logging"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.apache.jmeter"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("ApacheJMeter_http"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("${jmeter.version}"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[t._v("Include the "),e("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/releases/",target:"_blank",rel:"noopener noreferrer"}},[t._v("latest release"),e("OutboundLink")],1),t._v(" of the plugin into your project.")]),t._v(" "),e("p",[t._v("One of the easiest ways to do so it's adding JitPack to your dependency file and then point to the plugin repository and version. For further information on how to add it to your project, refer to their "),e("a",{attrs:{href:"https://jitpack.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official Documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"correlation-rule-structure"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlation-rule-structure"}},[t._v("#")]),t._v(" Correlation Rule Structure")]),t._v(" "),e("p",[t._v("As mentioned in the Readme file, one Correlation Rule has 3 parts:")]),t._v(" "),e("ul",[e("li",[t._v("A Reference Variable")]),t._v(" "),e("li",[t._v("A Correlation Extractor")]),t._v(" "),e("li",[t._v("A Correlation Replacement")])]),t._v(" "),e("h3",{attrs:{id:"reference-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#reference-variable"}},[t._v("#")]),t._v(" Reference Variable")]),t._v(" "),e("p",[t._v("Generally, a Reference Variable is a bridge between a value extracted from Correlation Extractor and a Correlation Replacement.")]),t._v(" "),e("p",[t._v("Is the name of the variable where the information extracted from a Correlation Extractor, will be stored and, from where the Correlation Replacements will obtain the information to replace it in the configured Responses.")]),t._v(" "),e("h3",{attrs:{id:"correlation-extractor"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlation-extractor"}},[t._v("#")]),t._v(" Correlation Extractor")]),t._v(" "),e("p",[t._v("A Correlation Extractor it's a part of the Rule that contains certain functions (like Regex, for example), that extracts from "),e("strong",[t._v("each request")]),t._v(", the dynamic information and, stores it into the predefined Reference Variable.")]),t._v(" "),e("h3",{attrs:{id:"correlation-replacement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlation-replacement"}},[t._v("#")]),t._v(" Correlation Replacement")]),t._v(" "),e("p",[t._v("Later on, in every subsequent response, the Correlation Replacement will figure out where it needs to replace the "),e("em",[t._v("extracted information")]),t._v(", that it’s stored in the "),e("em",[t._v("Reference Variable")]),t._v(" corresponding to the Rule it belongs to.")]),t._v(" "),e("h2",{attrs:{id:"order"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#order"}},[t._v("#")]),t._v(" Order")]),t._v(" "),e("p",[t._v("It's important to take into consideration the order of the Correlation Rules, as they represent the priority in which they are applied. For example:")]),t._v(" "),e("p",[t._v("When a request is made, all C. Replacements will be applied first, in the order they appear in the list of rules.\nWhen a response is received, only the ones that pass the Content-Type filter will be considered for Extraction. If left blank, all responses will be considered.\nWhen a response is allowed, for the previous validation, all C. Extractors will be applied, in the order they appear in the list of rules.")]),t._v(" "),e("p",[t._v("When making your own Custom Extension, consider the order of the extracted values if you are going to depend on stored variables and, each replacement will use variables that were stored before they are applied.")]),t._v(" "),e("h2",{attrs:{id:"relationships"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#relationships"}},[t._v("#")]),t._v(" Relationships")]),t._v(" "),e("p",[t._v("The following diagram will contain all the relationships between the Rule and the previously mentioned parts.")]),t._v(" "),e("p",[e("img",{attrs:{src:a(301),alt:"diagram"}})]),t._v(" "),e("p",[t._v("To resume the UML Diagram:")]),t._v(" "),e("p",[t._v("Every Rule Will contain:")]),t._v(" "),e("ul",[e("li",[t._v("One Reference Variable, which is a String")]),t._v(" "),e("li",[t._v("One Correlation Extractor, which extends from CorrelationRulePartTestElement")]),t._v(" "),e("li",[t._v("One Correlation Replacement, which also extends from CorrelationRulePartTestElement")])]),t._v(" "),e("p",[t._v("During the process of making your Custom Correlation Extensions, you must extend one or another of the CorrelationRulePartTests elements, so the plugin can get the basic methods from it and place it with their respective set.")]),t._v(" "),e("p",[t._v("Its highly recommended that you check all those classes before continuing.")]),t._v(" "),e("h2",{attrs:{id:"correlationruleparttestelement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlationruleparttestelement"}},[t._v("#")]),t._v(" CorrelationRulePartTestElement")]),t._v(" "),e("p",[t._v("This class, located at: "),e("code",[t._v("com.blazemeter.jmeter.correlation.core.CorrelationRulePartTestElement")]),t._v(", contains all the methods that allow the plugin, not only to build the interface which will be able to configure the Extension but also manages the Contexts.")]),t._v(" "),e("h2",{attrs:{id:"correlationextractor"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlationextractor"}},[t._v("#")]),t._v(" CorrelationExtractor")]),t._v(" "),e("p",[t._v("This class, located at: "),e("code",[t._v("com.blazemeter.jmeter.correlation.core.extractors.CorrelationExtractor")]),t._v(", contains the basic structure to be able to target the Responses, save the values once configured, and load the values from the files.")]),t._v(" "),e("h2",{attrs:{id:"correlationreplacement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlationreplacement"}},[t._v("#")]),t._v(" CorrelationReplacement")]),t._v(" "),e("p",[t._v("This class, located at: "),e("code",[t._v("com.blazemeter.jmeter.correlation.core.replacements.CorrelationReplacement")]),t._v(", contains the basic structure to be able to target the Request, save the values once, and load the values from the files.")]),t._v(" "),e("p",[e("strong",[t._v("Process of making your Extension")]),t._v("\nIn order to develop your Custom Extensions, you can either:")]),t._v(" "),e("ul",[e("li",[t._v("Create from scratch a brand-new Extension, "),e("em",[t._v("extending")]),t._v(" CorrelationExtractor/CorrelationReplacement, and implementing the desired customizations.")]),t._v(" "),e("li",[t._v("Extend from an already created, tested, and exposed CorrelationExtractor/CorrelationReplacement, and fix the logic so it behaves the way you want it to do.")])]),t._v(" "),e("p",[t._v("We recommend that you do the latter one since it's going to be easier to understand the flow of the plugin that way. You could take the whole, default installed, Siebel Extension package, for example, located at "),e("code",[t._v("com.blazemeter.jmeter.correlation.siebel")]),t._v(". Each one of those Custom Extensions, extend from one of the core classes and rewrite the logic to work on a Siebel Environment application.")]),t._v(" "),e("p",[t._v("Take the time to look at those files before going into the rest of the sections?")]),t._v(" "),e("h1",{attrs:{id:"considerations"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#considerations"}},[t._v("#")]),t._v(" Considerations")]),t._v(" "),e("p",[t._v("When developing and configuring a Correlation Rule, don't forget that there are certain parameters that need to be covered. Take them into account when implementing your extensions.")]),t._v(" "),e("h2",{attrs:{id:"a-valid-rule"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-valid-rule"}},[t._v("#")]),t._v(" A Valid Rule")]),t._v(" "),e("p",[t._v("A valid rule is one that has all the necessary components to be able to be saved, loaded, and applied when recording. For that, you need to consider:")]),t._v(" "),e("ul",[e("li",[t._v("The Reference Variable must always be "),e("em",[t._v("Non-Empty")]),t._v(".")]),t._v(" "),e("li",[t._v("Rules with only Reference Variables are not valid rules, and won’t allow either start recording or save the Correlation Template.")])]),t._v(" "),e("h2",{attrs:{id:"jcomponents-allowed-for-each-rule"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jcomponents-allowed-for-each-rule"}},[t._v("#")]),t._v(" JComponents allowed for each rule")]),t._v(" "),e("p",[t._v("At this very moment, when defining the fields for an Extension, the only allowed Components to be rendered are:")]),t._v(" "),e("ul",[e("li",[t._v("JComboBox (for list of static values)")]),t._v(" "),e("li",[t._v("JTextFields (for variable values)")])]),t._v(" "),e("p",[t._v("The values obtained by those Fields it’s received as a string and will be set into the rule with the "),e("code",[t._v("setParams(String ...)")]),t._v(" method.\nFrom that point on forward, you must validate the non-empty state of those values, and the required conversions (casting) of those values.")]),t._v(" "),e("p",[t._v("Read more about it in the "),e("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/blob/master/examples/CustomCorrelationExtractor.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("CustomCorrelationExtractor"),e("OutboundLink")],1),t._v(" example.")]),t._v(" "),e("h2",{attrs:{id:"unique-class-names"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#unique-class-names"}},[t._v("#")]),t._v(" Unique class names")]),t._v(" "),e("p",[e("em",[t._v("Better safe than sorry")])]),t._v(" "),e("p",[t._v("Try always to use names that are not repeated or that might collapse with the ones that are already developed. You don't want to load a class into the plugin and end up using another one by mistake.")]),t._v(" "),e("h1",{attrs:{id:"make-your-own-extensions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#make-your-own-extensions"}},[t._v("#")]),t._v(" Make your own extensions")]),t._v(" "),e("p",[e("strong",[t._v("Its highly recommended that you check the Class diagram displayed in "),e("a",{attrs:{href:"#relationships"}},[t._v("Relationships")]),t._v(" before jumping into this section")])]),t._v(" "),e("h2",{attrs:{id:"basic-relationship-on-each-rule-part"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-relationship-on-each-rule-part"}},[t._v("#")]),t._v(" Basic Relationship on each rule part")]),t._v(" "),e("p",[t._v("The following set of rules should be followed in order to have the correct access to all the capabilities that we program in the plugin. That been said, please follow these instructions:")]),t._v(" "),e("ol",[e("li",[e("p",[t._v("Each CorrelationExtractor or CorrelationReplacement extends "),e("code",[t._v("CorrelationRulePartTestElement")])])]),t._v(" "),e("li",[e("p",[t._v("Therefore, each Custom Extension that you develop should either extend CorrelationExtractor or CorrelationReplacement class, accordingly its type and the moment it will be applied.")]),t._v(" "),e("p",[e("strong",[t._v("Note")]),t._v(": The only exception to this rule it's when you want to enhance some functionalities of an already developed Extension, in that case, you could extend that class instead.")])]),t._v(" "),e("li",[e("p",[t._v("Each CorrelationExtractor or CorrelationReplacement has the possibility to use a CorrelationContext, that will allow covering a more inclusive and extensive set of variables. The CorrelationContexts are shared between each Extension that has it is assigned to. Depending on your personal needs and the complexity of your project, you might want to make your very own.")])]),t._v(" "),e("li",[e("p",[t._v("By default, none of the CorrelationExtractor or CorrelationReplacement has implemented the method "),e("code",[t._v("getSupportedContext()")]),t._v(" from "),e("code",[t._v("CorrelationRulePartTestElement")]),t._v(" unless it has its very set of complex variables that need to share between rules and Correlations. Like you could check in the Siebel's Extensions.")])]),t._v(" "),e("li",[e("p",[t._v("Each Correlation must be named using this standard:")])])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('{Name of the Functionality of the Correlation} + "Correlation" + The Type\n')])])]),e("p",[t._v("This is important, in most of the cases, to properly show the name of the Extension in the respective combo box.")]),t._v(" "),e("h1",{attrs:{id:"final-words"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#final-words"}},[t._v("#")]),t._v(" Final Words")]),t._v(" "),e("p",[t._v("Review these links for a further understanding of correlating concepts and examples:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/guide/custom-extensions/the_flow_explanation.html"}},[t._v("Extensions and useful methods in the Flow")]),t._v(": detailed explanation of how correlation works.")],1),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Examples"),e("OutboundLink")],1),t._v(": basic structure for a Correlation Extension.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/29.91fe10b3.js b/assets/js/29.91fe10b3.js new file mode 100644 index 0000000..147ba5a --- /dev/null +++ b/assets/js/29.91fe10b3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{301:function(t,e,a){t.exports=a.p+"assets/img/exampleDiagram.9e15f8a4.png"},351:function(t,e,a){"use strict";a.r(e);var s=a(14),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-extensions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-extensions"}},[t._v("#")]),t._v(" Custom Extensions")]),t._v(" "),e("p",[t._v("When the current Correlation Extensions are not enough, you can create your own Correlation Extension.\nIn this guide we will explain how to create them and how you can extend the current ones.")]),t._v(" "),e("h1",{attrs:{id:"requisites"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requisites"}},[t._v("#")]),t._v(" Requisites")]),t._v(" "),e("p",[t._v("These are the minimum requisites that you will need to start:")]),t._v(" "),e("ul",[e("li",[t._v("Use java 1.8")]),t._v(" "),e("li",[t._v("Maven 1.3+")]),t._v(" "),e("li",[t._v("JMeter 5.2.1")]),t._v(" "),e("li")]),t._v(" "),e("h1",{attrs:{id:"correlation-rule-structure"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlation-rule-structure"}},[t._v("#")]),t._v(" Correlation Rule Structure")]),t._v(" "),e("p",[t._v("Before we begin with the elements that are required to create a Correlation Extension, we need to\nadd the Auto Correlation Recorder as dependency. To do that, you need to add the following to your pom.xml:")]),t._v(" "),e("ol",[e("li",[t._v("The Auto Correlation Recorder dependency")]),t._v(" "),e("li",[t._v("The JMeter dependency")])]),t._v(" "),e("p",[t._v("An example of a basic pom.xml file would be:")]),t._v(" "),e("div",{staticClass:"language-XML extra-class"},[e("pre",{pre:!0,attrs:{class:"language-xml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("xmlns")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://maven.apache.org/POM/4.0.0"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token attr-name"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xmlns:")]),t._v("xsi")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://www.w3.org/2001/XMLSchema-instance"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" \n"),e("span",{pre:!0,attrs:{class:"token attr-name"}},[e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("xsi:")]),t._v("schemaLocation")]),e("span",{pre:!0,attrs:{class:"token attr-value"}},[e("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("modelVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("4.0.0"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project.build.sourceEncoding")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("UTF-8"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("project.reporting.outputEncoding")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("UTF-8"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("jmeter.version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("3.3"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencies")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.apache.jmeter"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("ApacheJMeter_core"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("${jmeter.version}"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("scope")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("provided"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("exclusions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("exclusion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("commons-logging"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("commons-logging"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.apache.jmeter"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("ApacheJMeter_http"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("${jmeter.version}"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token tag"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),e("p",[t._v("Include the "),e("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/releases/",target:"_blank",rel:"noopener noreferrer"}},[t._v("latest release"),e("OutboundLink")],1),t._v(" of the plugin into your project.")]),t._v(" "),e("p",[t._v("One of the easiest ways to do so it's adding JitPack to your dependency file and then point to the plugin repository and version. For further information on how to add it to your project, refer to their "),e("a",{attrs:{href:"https://jitpack.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official Documentation"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h1",{attrs:{id:"correlation-rule-structure-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlation-rule-structure-2"}},[t._v("#")]),t._v(" Correlation Rule Structure")]),t._v(" "),e("p",[t._v("As mentioned in the Readme file, one Correlation Rule has 3 parts:")]),t._v(" "),e("ul",[e("li",[t._v("A Reference Variable")]),t._v(" "),e("li",[t._v("A Correlation Extractor")]),t._v(" "),e("li",[t._v("A Correlation Replacement")])]),t._v(" "),e("h2",{attrs:{id:"reference-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#reference-variable"}},[t._v("#")]),t._v(" Reference Variable")]),t._v(" "),e("p",[t._v("Generally, a Reference Variable is a bridge between a value extracted from Correlation Extractor and a Correlation Replacement.")]),t._v(" "),e("p",[t._v("Is the name of the variable where the information extracted from a Correlation Extractor, will be stored and, from where the Correlation Replacements will obtain the information to replace it in the configured Responses.")]),t._v(" "),e("h2",{attrs:{id:"correlation-extractor"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlation-extractor"}},[t._v("#")]),t._v(" Correlation Extractor")]),t._v(" "),e("p",[t._v("A Correlation Extractor it's a part of the Rule that contains certain functions (like Regex, for example), that extracts from "),e("strong",[t._v("each request")]),t._v(", the dynamic information and, stores it into the predefined Reference Variable.")]),t._v(" "),e("h2",{attrs:{id:"correlation-replacement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlation-replacement"}},[t._v("#")]),t._v(" Correlation Replacement")]),t._v(" "),e("p",[t._v("Later on, in every subsequent response, the Correlation Replacement will figure out where it needs to replace the "),e("em",[t._v("extracted information")]),t._v(", that it’s stored in the "),e("em",[t._v("Reference Variable")]),t._v(" corresponding to the Rule it belongs to.")]),t._v(" "),e("h2",{attrs:{id:"order"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#order"}},[t._v("#")]),t._v(" Order")]),t._v(" "),e("p",[t._v("It's important to take into consideration the order of the Correlation Rules, as they represent the priority in which they are applied. For example:")]),t._v(" "),e("p",[t._v("When a request is made, all C. Replacements will be applied first, in the order they appear in the list of rules.\nWhen a response is received, only the ones that pass the Content-Type filter will be considered for Extraction. If left blank, all responses will be considered.\nWhen a response is allowed, for the previous validation, all C. Extractors will be applied, in the order they appear in the list of rules.")]),t._v(" "),e("p",[t._v("When making your own Custom Extension, consider the order of the extracted values if you are going to depend on stored variables and, each replacement will use variables that were stored before they are applied.")]),t._v(" "),e("h2",{attrs:{id:"relationships"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#relationships"}},[t._v("#")]),t._v(" Relationships")]),t._v(" "),e("p",[t._v("The following diagram will contain all the relationships between the Rule and the previously mentioned parts.")]),t._v(" "),e("p",[e("img",{attrs:{src:a(301),alt:"diagram"}})]),t._v(" "),e("p",[t._v("To resume the UML Diagram:")]),t._v(" "),e("p",[t._v("Every Rule Will contain:")]),t._v(" "),e("ul",[e("li",[t._v("One Reference Variable, which is a String")]),t._v(" "),e("li",[t._v("One Correlation Extractor, which extends from CorrelationRulePartTestElement")]),t._v(" "),e("li",[t._v("One Correlation Replacement, which also extends from CorrelationRulePartTestElement")])]),t._v(" "),e("p",[t._v("During the process of making your Custom Correlation Extensions, you must extend one or another of the CorrelationRulePartTests elements, so the plugin can get the basic methods from it and place it with their respective set.")]),t._v(" "),e("p",[t._v("Its highly recommended that you check all those classes before continuing.")]),t._v(" "),e("h2",{attrs:{id:"correlationruleparttestelement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlationruleparttestelement"}},[t._v("#")]),t._v(" CorrelationRulePartTestElement")]),t._v(" "),e("p",[t._v("This class, located at: "),e("code",[t._v("com.blazemeter.jmeter.correlation.core.CorrelationRulePartTestElement")]),t._v(", contains all the methods that allow the plugin, not only to build the interface which will be able to configure the Extension but also manages the Contexts.")]),t._v(" "),e("h2",{attrs:{id:"correlationextractor"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlationextractor"}},[t._v("#")]),t._v(" CorrelationExtractor")]),t._v(" "),e("p",[t._v("This class, located at: "),e("code",[t._v("com.blazemeter.jmeter.correlation.core.extractors.CorrelationExtractor")]),t._v(", contains the basic structure to be able to target the Responses, save the values once configured, and load the values from the files.")]),t._v(" "),e("h2",{attrs:{id:"correlationreplacement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#correlationreplacement"}},[t._v("#")]),t._v(" CorrelationReplacement")]),t._v(" "),e("p",[t._v("This class, located at: "),e("code",[t._v("com.blazemeter.jmeter.correlation.core.replacements.CorrelationReplacement")]),t._v(", contains the basic structure to be able to target the Request, save the values once, and load the values from the files.")]),t._v(" "),e("p",[e("strong",[t._v("Process of making your Extension")]),t._v("\nIn order to develop your Custom Extensions, you can either:")]),t._v(" "),e("ul",[e("li",[t._v("Create from scratch a brand-new Extension, "),e("em",[t._v("extending")]),t._v(" CorrelationExtractor/CorrelationReplacement, and implementing the desired customizations.")]),t._v(" "),e("li",[t._v("Extend from an already created, tested, and exposed CorrelationExtractor/CorrelationReplacement, and fix the logic so it behaves the way you want it to do.")])]),t._v(" "),e("p",[t._v("We recommend that you do the latter one since it's going to be easier to understand the flow of the plugin that way. You could take the whole, default installed, Siebel Extension package, for example, located at "),e("code",[t._v("com.blazemeter.jmeter.correlation.siebel")]),t._v(". Each one of those Custom Extensions, extend from one of the core classes and rewrite the logic to work on a Siebel Environment application.")]),t._v(" "),e("p",[t._v("Take the time to look at those files before going into the rest of the sections?")]),t._v(" "),e("h1",{attrs:{id:"considerations"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#considerations"}},[t._v("#")]),t._v(" Considerations")]),t._v(" "),e("p",[t._v("When developing and configuring a Correlation Rule, don't forget that there are certain parameters that need to be covered. Take them into account when implementing your extensions.")]),t._v(" "),e("h2",{attrs:{id:"a-valid-rule"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-valid-rule"}},[t._v("#")]),t._v(" A Valid Rule")]),t._v(" "),e("p",[t._v("A valid rule is one that has all the necessary components to be able to be saved, loaded, and applied when recording. For that, you need to consider:")]),t._v(" "),e("ul",[e("li",[t._v("The Reference Variable must always be "),e("em",[t._v("Non-Empty")]),t._v(".")]),t._v(" "),e("li",[t._v("Rules with only Reference Variables are not valid rules, and won’t allow either start recording or save the Correlation Template.")])]),t._v(" "),e("h2",{attrs:{id:"jcomponents-allowed-for-each-rule"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jcomponents-allowed-for-each-rule"}},[t._v("#")]),t._v(" JComponents allowed for each rule")]),t._v(" "),e("p",[t._v("At this very moment, when defining the fields for an Extension, the only allowed Components to be rendered are:")]),t._v(" "),e("ul",[e("li",[t._v("JComboBox (for list of static values)")]),t._v(" "),e("li",[t._v("JTextFields (for variable values)")])]),t._v(" "),e("p",[t._v("The values obtained by those Fields it’s received as a string and will be set into the rule with the "),e("code",[t._v("setParams(String ...)")]),t._v(" method.\nFrom that point on forward, you must validate the non-empty state of those values, and the required conversions (casting) of those values.")]),t._v(" "),e("p",[t._v("Read more about it in the "),e("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/blob/master/examples/CustomCorrelationExtractor.java",target:"_blank",rel:"noopener noreferrer"}},[t._v("CustomCorrelationExtractor"),e("OutboundLink")],1),t._v(" example.")]),t._v(" "),e("h2",{attrs:{id:"unique-class-names"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#unique-class-names"}},[t._v("#")]),t._v(" Unique class names")]),t._v(" "),e("p",[e("em",[t._v("Better safe than sorry")])]),t._v(" "),e("p",[t._v("Try always to use names that are not repeated or that might collapse with the ones that are already developed. You don't want to load a class into the plugin and end up using another one by mistake.")]),t._v(" "),e("h1",{attrs:{id:"make-your-own-extensions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#make-your-own-extensions"}},[t._v("#")]),t._v(" Make your own extensions")]),t._v(" "),e("p",[e("strong",[t._v("Its highly recommended that you check the Class diagram displayed in "),e("a",{attrs:{href:"#relationships"}},[t._v("Relationships")]),t._v(" before jumping into this section")])]),t._v(" "),e("h2",{attrs:{id:"basic-relationship-on-each-rule-part"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-relationship-on-each-rule-part"}},[t._v("#")]),t._v(" Basic Relationship on each rule part")]),t._v(" "),e("p",[t._v("The following set of rules should be followed in order to have the correct access to all the capabilities that we program in the plugin. That been said, please follow these instructions:")]),t._v(" "),e("ol",[e("li",[e("p",[t._v("Each CorrelationExtractor or CorrelationReplacement extends "),e("code",[t._v("CorrelationRulePartTestElement")])])]),t._v(" "),e("li",[e("p",[t._v("Therefore, each Custom Extension that you develop should either extend CorrelationExtractor or CorrelationReplacement class, accordingly its type and the moment it will be applied.")]),t._v(" "),e("p",[e("strong",[t._v("Note")]),t._v(": The only exception to this rule it's when you want to enhance some functionalities of an already developed Extension, in that case, you could extend that class instead.")])]),t._v(" "),e("li",[e("p",[t._v("Each CorrelationExtractor or CorrelationReplacement has the possibility to use a CorrelationContext, that will allow covering a more inclusive and extensive set of variables. The CorrelationContexts are shared between each Extension that has it is assigned to. Depending on your personal needs and the complexity of your project, you might want to make your very own.")])]),t._v(" "),e("li",[e("p",[t._v("By default, none of the CorrelationExtractor or CorrelationReplacement has implemented the method "),e("code",[t._v("getSupportedContext()")]),t._v(" from "),e("code",[t._v("CorrelationRulePartTestElement")]),t._v(" unless it has its very set of complex variables that need to share between rules and Correlations. Like you could check in the Siebel's Extensions.")])]),t._v(" "),e("li",[e("p",[t._v("Each Correlation must be named using this standard:")])])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('{Name of the Functionality of the Correlation} + "Correlation" + The Type\n')])])]),e("p",[t._v("This is important, in most of the cases, to properly show the name of the Extension in the respective combo box.")]),t._v(" "),e("h1",{attrs:{id:"final-words"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#final-words"}},[t._v("#")]),t._v(" Final Words")]),t._v(" "),e("p",[t._v("Review these links for a further understanding of correlating concepts and examples:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/guide/custom-extensions/siebel_extension_explanations.html"}},[t._v("Siebel's Custom Extension explained")]),t._v(": an explanation of Siebel CRM’s Custom Extension.")],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/guide/custom-extensions/the_flow_explanation.html"}},[t._v("Extensions and useful methods in the Flow")]),t._v(": detailed explanation of how correlation works.")],1),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/tree/master/examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Examples"),e("OutboundLink")],1),t._v(": basic structure for a Correlation Extension.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/3.024fff8e.js b/assets/js/3.024fff8e.js new file mode 100644 index 0000000..a98c1f0 --- /dev/null +++ b/assets/js/3.024fff8e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3,23,24],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return d})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(90);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return s.test(i)?t:i+".html"+n}function d(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return h(n,e,r);if(Array.isArray(e))return Object.assign(h(n,e[0],r),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},242:function(t,e,n){"use strict";n.r(e);var r={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(243),n(14)),s=Object(i.a)(r,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},243:function(t,e,n){"use strict";n(240)},245:function(t,e,n){},250:function(t,e,n){},252:function(t,e,n){"use strict";n(245)},253:function(t,e,n){"use strict";n.r(e);var r=n(266),i=n(255),s=n(239);function a(t,e){if("group"===e.type){const n=e.path&&Object(s.e)(t,e.path),r=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(s.e)(t,e.path));return n||r}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:r.default,SidebarLink:i.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(s.e)(this.$route,t.regularPath)}}},l=n(14),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,r){return e("li",{key:r},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:r===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(r)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},255:function(t,e,n){"use strict";n.r(e);var r=n(239);function i(t,e,n,r,i){const s={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(s.style={"padding-left":i+"rem"}),t("RouterLink",s,n)}function s(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(r.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,u,e.level-1),s(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(r.e)(a,u.path),d="auto"===u.type?p||u.children.some(t=>Object(r.e)(a,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):i(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,s(t,u.children,u.basePath,a,f)];if((d||b)&&u.headers&&!r.d.test(u.path)){return[h,s(t,Object(r.c)(u.headers),u.path,a,f)]}return h}},o=(n(252),n(14)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},263:function(t,e,n){"use strict";n(250)},266:function(t,e,n){"use strict";n.r(e);var r=n(239),i={name:"SidebarGroup",components:{DropdownTransition:n(242).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(253).default},methods:{isActive:r.e}},s=(n(263),n(14)),a=Object(s.a)(i,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/30.530ad229.js b/assets/js/30.530ad229.js new file mode 100644 index 0000000..fff1e74 --- /dev/null +++ b/assets/js/30.530ad229.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{339:function(e,t,r){"use strict";r.r(t);var a=r(14),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"user-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-guide"}},[e._v("#")]),e._v(" User Guide")]),e._v(" "),t("p",[e._v("Auto Correlation Recorder it's a "),t("a",{attrs:{href:"http://jmeter.apache.org/usermanual/get-started.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("JMeter's"),t("OutboundLink")],1),e._v(" plugin that simplifies\nthe process of recording for applications with Dynamic Variables by providing automatic "),t("strong",[e._v("correlations of variables")]),e._v(".")]),e._v(" "),t("p",[e._v("You can perform exploratory detections of dynamic variables and create "),t("strong",[e._v("correlation rules")]),e._v(" to correlate them\nin future recordings, or you can use the "),t("strong",[e._v("automatic correlations")]),e._v(" and let the plugin do the work for you.")]),e._v(" "),t("p",[e._v("Regardless of the method you choose, the plugin will help you create a test script that is more reliable and\neasier to maintain.")]),e._v(" "),t("h2",{attrs:{id:"key-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#key-features"}},[e._v("#")]),e._v(" Key Features")]),e._v(" "),t("ul",[t("li",[e._v("Automated correlation detection and suggestions for faster and more accurate test script creation")]),e._v(" "),t("li",[e._v("Access to SIEBEL templates for convenience and faster test script creation")]),e._v(" "),t("li",[e._v("Auto install, download and update repositories for a convenient and hassle-free team collaboration")]),e._v(" "),t("li",[e._v("Easy customization options for efficient test script creation and increased productivity")]),e._v(" "),t("li",[e._v("Customizable correlations to match your specific testing needs and requirements")]),e._v(" "),t("li",[e._v("Shareable templates to streamline team collaboration and accelerate project development")]),e._v(" "),t("li",[e._v("Customizable extensions to enhance functionality and add new capabilities")]),e._v(" "),t("li",[e._v("Comprehensive examples and documentation for easy learning and fast onboarding")])]),e._v(" "),t("p",[e._v("Additional Features:")]),e._v(" "),t("ul",[t("li",[e._v("Automatic proposal of changes to correlate detected dynamic values for faster script development")]),e._v(" "),t("li",[e._v("Automatic generation of correlation rules for use in following recordings for even faster script creation")]),e._v(" "),t("li",[e._v("Automatic testing of proposed changes for a faster and more reliable test script")])]),e._v(" "),t("h2",{attrs:{id:"benefits"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#benefits"}},[e._v("#")]),e._v(" Benefits")]),e._v(" "),t("p",[e._v("Here are 10 key benefits of using the JMeter's Auto Correlation Recorder Plugin:")]),e._v(" "),t("ol",[t("li",[e._v("Fast script creation")]),e._v(" "),t("li",[e._v("Preloaded templates")]),e._v(" "),t("li",[e._v("Hassle-free collaboration")]),e._v(" "),t("li",[e._v("Customizable correlations")]),e._v(" "),t("li",[e._v("Easy customization")]),e._v(" "),t("li",[e._v("Streamlined collaboration")]),e._v(" "),t("li",[e._v("Customizable extensions")]),e._v(" "),t("li",[e._v("Dynamic value correlation")]),e._v(" "),t("li",[e._v("Fast rule generation")]),e._v(" "),t("li",[e._v("Reliable testing.")])]),e._v(" "),t("h2",{attrs:{id:"system-requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#system-requirements"}},[e._v("#")]),e._v(" System requirements")]),e._v(" "),t("p",[e._v("The system requirements to use the plugin are pretty much the sames as a regular JMeter environment, vary depending on\nthe operating system. In general terms, the requirements for each operating system are:")]),e._v(" "),t("ul",[t("li",[e._v("Windows: Windows 7 or later, 1 GB of RAM (2 GB recommended), 250 MB of free disk space")]),e._v(" "),t("li",[e._v("macOS: macOS 10.10 or later, 1 GB of RAM (2 GB recommended), 250 MB of free disk space")]),e._v(" "),t("li",[e._v("Linux: kernel 2.6.26 or later, 1 GB of RAM (2 GB recommended), 250 MB of free disk space")])]),e._v(" "),t("p",[e._v("Please note that these are the minimum requirements, and higher specifications may be necessary for larger or more\ncomplex load testing scenarios.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("For a better experience, we recommend the usage of JMeter 5.6.3 or later.")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/31.8e6f9d44.js b/assets/js/31.8e6f9d44.js new file mode 100644 index 0000000..47e44e6 --- /dev/null +++ b/assets/js/31.8e6f9d44.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{340:function(a,t,e){"use strict";e.r(t);var s=e(14),r=Object(s.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"advanced-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advanced-features"}},[a._v("#")]),a._v(" Advanced Features")]),a._v(" "),t("h2",{attrs:{id:"using-the-variable-extractor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-variable-extractor"}},[a._v("#")]),a._v(" Using the variable extractor")]),a._v(" "),t("h2",{attrs:{id:"setting-up-regular-expressions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-regular-expressions"}},[a._v("#")]),a._v(" Setting up regular expressions")]),a._v(" "),t("h2",{attrs:{id:"handling-complex-scenarios"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#handling-complex-scenarios"}},[a._v("#")]),a._v(" Handling complex scenarios")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/32.fdb53c8d.js b/assets/js/32.fdb53c8d.js new file mode 100644 index 0000000..f67dfa4 --- /dev/null +++ b/assets/js/32.fdb53c8d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{344:function(e,a,t){"use strict";t.r(a);var r=t(14),o=Object(r.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"configuring-the-auto-correlation-recorder-plugin"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-auto-correlation-recorder-plugin"}},[e._v("#")]),e._v(" Configuring the Auto Correlation Recorder Plugin")]),e._v(" "),a("p",[e._v("The Auto Correlation Recorder plugin in JMeter allows you to automatically correlate dynamic values in your\nHTTP requests. The plugin provides several configurations that can be customized to meet your specific needs.")]),e._v(" "),a("h2",{attrs:{id:"available-configurations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#available-configurations"}},[e._v("#")]),e._v(" Available Configurations")]),e._v(" "),a("p",[e._v("The following configurations can be set via JMeter properties:")]),e._v(" "),a("h3",{attrs:{id:"min-value-length"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#min-value-length"}},[e._v("#")]),e._v(" Min Value Length")]),e._v(" "),a("p",[e._v("The minimum length of a value to be considered for correlation. Values with less characters will be ignored.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.min_value_length=3\n")])])]),a("h3",{attrs:{id:"context-length"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#context-length"}},[e._v("#")]),e._v(" Context Length")]),e._v(" "),a("p",[e._v("The total of characters extracted for the context of a value. This is the total of characters that will be extracted from the left and right of the value when creating the Regex for the extraction.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.context_length=10\n")])])]),a("h3",{attrs:{id:"max-number-of-appearances"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#max-number-of-appearances"}},[e._v("#")]),e._v(" Max Number of Appearances")]),e._v(" "),a("p",[e._v("The maximum number of appearances of a value to be considered for correlation. Values that appear more than this number of times will be ignored. The value -1 disables the maximum control.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.max_number_of_appearances=50\n")])])]),a("h3",{attrs:{id:"ignore-boolean-values"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ignore-boolean-values"}},[e._v("#")]),e._v(" Ignore Boolean Values")]),e._v(" "),a("p",[e._v("If set to true, boolean values will be ignored for correlation.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.ignore_boolean_values=true\n")])])]),a("h3",{attrs:{id:"ignored-domains"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ignored-domains"}},[e._v("#")]),e._v(" Ignored Domains")]),e._v(" "),a("p",[e._v("Requests that have any of the following domains will be ignored for correlation.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.ignored_domains=mozilla.org, mozilla.net, mozilla.com\n")])])]),a("h3",{attrs:{id:"ignored-headers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ignored-headers"}},[e._v("#")]),e._v(" Ignored Headers")]),e._v(" "),a("p",[e._v("Headers that have any of the following names will be ignored for correlation.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.ignored_headers=Referer, Origin, Host, User-Agent, If-Modified-Since, Content-Length, Accept-Encoding, Connection, Accept, Accept-Language, Cache-Control, Pragma, Upgrade-Insecure-Requests, vary\n")])])]),a("h3",{attrs:{id:"ignored-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ignored-files"}},[e._v("#")]),e._v(" Ignored Files")]),e._v(" "),a("p",[e._v("Requests that have any of the following file extensions will be ignored for correlation.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.ignored_files=jpg, jpeg, png, css, js, woff, txt, svg, ico, pdf, zip, gzip, tar, gz, rar, 7z, exe, msi, woff2\n")])])]),a("h3",{attrs:{id:"ignored-keys"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ignored-keys"}},[e._v("#")]),e._v(" Ignored Keys")]),e._v(" "),a("p",[e._v("Keys (arguments, JSON keys, etc.) that have any of the following names will be ignored for correlation.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.ignored_keys=log, pwd, password, pass, passwd, action, testcookie, ver, widget, d, r, s, ipv6, ipv4, remind_me_later, content-type, content-length, redirect_to, pagenow, if-modified-since, url, redirect, redirect_uri, set-cookie, cache-control, host, expires, date, location, as, rel, link, returl, dur, vary, connection\n")])])]),a("h2",{attrs:{id:"examples"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[e._v("#")]),e._v(" Examples")]),e._v(" "),a("p",[e._v("Here are some examples of how you could use these configurations in real-world scenarios:")]),e._v(" "),a("h3",{attrs:{id:"exclude-certain-domains"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#exclude-certain-domains"}},[e._v("#")]),e._v(" Exclude certain domains")]),e._v(" "),a("p",[e._v("Lets say that alongside your recorded elements, some requests from "),a("code",[e._v("example.com")]),e._v(" were stored. Probably you would want\nto avoid the parameters sent there to be analysed and, potentially correlated. To do so, you need to go to your\n"),a("code",[e._v("user.properties")]),e._v(" file, find the "),a("code",[e._v("correlation.configuration.ignored_domains")]),e._v(" property and add the "),a("code",[e._v("example.com")]),e._v("\nthere. Like this:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.ignored_domains=example.com\n")])])]),a("p",[e._v("With this, the plugin will ignore any request that has "),a("code",[e._v("example.com")]),e._v(" in its domain.")]),e._v(" "),a("h3",{attrs:{id:"exclude-small-values"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#exclude-small-values"}},[e._v("#")]),e._v(" Exclude small values")]),e._v(" "),a("p",[e._v('Don\'t want the Auto Correlation Recorder Plugin to pick up certain small values? We get it! Sometimes those tiny arguments,\nlike "amount" with a value of "100", just aren\'t worth correlating.')]),e._v(" "),a("p",[e._v('If you\'re using Automatic Correlation analysis by Correlation Templates, this particular element probably won\'t be\naffected, since the rules only apply to values matched by their regular expressions, regardless of length. However,\nif you\'ve selected "by Replay and Compare", the plugin may locate all appearances of the string "100" in your\nrecording, causing unnecessary correlation.')]),e._v(" "),a("p",[e._v("To save yourself the hassle of correlating more than you need to, you can configure the analysis to not consider\nvalues below a certain length. That's where this configuration comes in handy! Simply set the\ncorrelation.configuration.min_value_length property to 10 in your user.properties file, and any value smaller than\nthat won't be considered for \"potential\" dynamic values. For example:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.min_value_length=10\n")])])]),a("h3",{attrs:{id:"exclude-certain-file-types-from-correlation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#exclude-certain-file-types-from-correlation"}},[e._v("#")]),e._v(" Exclude certain file types from correlation")]),e._v(" "),a("p",[e._v("Let's say that you have a web application that serves different types of files such as images, PDFs, or CSS files.\nWhen recording your test scenario, you notice that the Auto Correlation Recorder plugin is also capturing some of these\nfiles as dynamic values. Since these files are not part of the application's business logic, you may want to exclude\nthem from the correlation analysis.")]),e._v(" "),a("p",[e._v("To exclude certain file types, you can use the correlation.configuration.ignored_files property. This property allows\nyou to specify a comma-separated list of file extensions that should be ignored by the correlation analysis.\nFor example, if you want to exclude all image and CSS files, you can set the property like this:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("correlation.configuration.ignored_files=jpg,jpeg,png,css\n")])])]),a("p",[e._v("This will ensure that any requests that have a file extension of .jpg, .jpeg, .png, or .css will be ignored by the\ncorrelation analysis. To configure this property, you can simply add it to your user.properties file and set it\nto the desired list of file extensions.")]),e._v(" "),a("p",[e._v("By excluding certain file types from the correlation analysis, you can improve the accuracy of the correlation\nresults and avoid unnecessary correlations of non-dynamic values.")])])}),[],!1,null,null,null);a.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/33.0006e7ed.js b/assets/js/33.0006e7ed.js new file mode 100644 index 0000000..14a4815 --- /dev/null +++ b/assets/js/33.0006e7ed.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{345:function(e,t,r){"use strict";r.r(t);var a=r(14),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"best-practices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#best-practices"}},[e._v("#")]),e._v(" Best Practices")]),e._v(" "),t("p",[e._v("In this section you will find best practices for the creation of correlation rules, along with tips for optimizing\nyour current and past scripts.")]),e._v(" "),t("h2",{attrs:{id:"tips-for-optimizing-performance"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tips-for-optimizing-performance"}},[e._v("#")]),e._v(" Tips for optimizing performance")]),e._v(" "),t("h3",{attrs:{id:"review-your-correlation-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#review-your-correlation-rules"}},[e._v("#")]),e._v(" Review your correlation rules")]),e._v(" "),t("p",[e._v("Even though the plugin is designed to be as efficient as possible, it is still a good idea to review your correlation\nrules and make sure that they are not affecting the performance of your test scripts. The addition of unnecesary\ncorrelation rules can have a negative impact on the performance of your test scripts, making either the recording\nor the analysis of the script slower.")]),e._v(" "),t("p",[e._v("Likewise, it is also a good practice to review your correlated elements after the rules or suggestions being applied:\nif they added correlations that are not needed, you can remove them to improve the performance of your test scripts.")]),e._v(" "),t("h2",{attrs:{id:"collaboration-and-sharing-correlation-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#collaboration-and-sharing-correlation-rules"}},[e._v("#")]),e._v(" Collaboration and sharing correlation rules")]),e._v(" "),t("p",[e._v("When sharing your correlation rules (as Correlation Templates or simply sharing them individually), always remember to\ncheck for sensitive data. This is not as usual scenario, but often users forget to remove examples and testing information\nfrom their descriptions, regexes and Test Plans, exposing sensitive data to other users.")]),e._v(" "),t("h2",{attrs:{id:"other-best-practices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#other-best-practices"}},[e._v("#")]),e._v(" Other Best Practices")]),e._v(" "),t("p",[e._v("The following are a list of best practices, in general, that should be considered when doing any sort of Recordings in JMeter:")]),e._v(" "),t("h3",{attrs:{id:"always-update-the-security-certificate"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#always-update-the-security-certificate"}},[e._v("#")]),e._v(" Always update the security certificate")]),e._v(" "),t("p",[e._v("Once is never enough when it comes to security. Remember to update periodically the Security Certificate used during the recordings. It expires after 7 days of been created.")]),e._v(" "),t("h3",{attrs:{id:"use-the-latest-version-of-jmeter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-the-latest-version-of-jmeter"}},[e._v("#")]),e._v(" Use the latest version of JMeter")]),e._v(" "),t("p",[e._v("The newer, the better, try to use the latest version of the JMeter, allowing you to avoid dealing with unnecessary issues and use a more performant app.")]),e._v(" "),t("h3",{attrs:{id:"use-protocol-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-protocol-templates"}},[e._v("#")]),e._v(" Use Protocol Templates")]),e._v(" "),t("p",[e._v("Not only they have been tested by the development team but, they also come with configured components, allowing the recording to be more efficient and faster to configure.")]),e._v(" "),t("h3",{attrs:{id:"record-using-incognito-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#record-using-incognito-mode"}},[e._v("#")]),e._v(" Record using Incognito mode")]),e._v(" "),t("p",[e._v("Multiple times the browser stores information from previous visits, in order to ease the following usage of the pages, contaminating the recording with data that isn’t new and related to the flow at hand. To avoid this, always start a new “Incognito session” when making a recording. This ensures that the data that is being recorded is always complete and new, no matter when and where the recording is replayed.")]),e._v(" "),t("h3",{attrs:{id:"clean-cached-files-cookies-and-historical-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clean-cached-files-cookies-and-historical-data"}},[e._v("#")]),e._v(" Clean cached files, cookies, and historical data")]),e._v(" "),t("p",[e._v("Even if you are recording in incognito mode, it is not uncommon to perform another recording after the one you just made. If you did it in an Incognito window, either close that window and start with a brand new one or clean all the information that might affect your recording, such as cookies, cache, sessions, etc.")]),e._v(" "),t("h3",{attrs:{id:"close-other-tabs-and-apps-connected-to-the-internet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#close-other-tabs-and-apps-connected-to-the-internet"}},[e._v("#")]),e._v(" Close other tabs and apps connected to the internet")]),e._v(" "),t("p",[e._v("Avoid having other web pages or applications opened when recording. This will reduce the probability of having non-related requests in your recording.")]),e._v(" "),t("h3",{attrs:{id:"identify-each-step-of-the-workflow-while-recording"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#identify-each-step-of-the-workflow-while-recording"}},[e._v("#")]),e._v(" Identify each step of the workflow while recording")]),e._v(" "),t("p",[e._v("It’s suggested to use Transaction Controllers in order to group the requests for each step of the workflow, writing comments or a label to help understand and identify the requests sent in each step. The best way to do this is step by step while recording, for example: record the access to the main page, add a Transaction Controller and put all the requests recorded in it, record the next step of the workflow, add another transaction controller and put all the new recorded requests in it and so on.")]),e._v(" "),t("h3",{attrs:{id:"use-request-filter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-request-filter"}},[e._v("#")]),e._v(" Use Request filter")]),e._v(" "),t("p",[e._v("Avoid recording unnecessary requests when testing a flow, unless that’s exactly what you want to do. Is better to test a specific scenario rather than stressing the server with styles and fonts that won’t do any good in the functionality itself.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/34.f625dbc9.js b/assets/js/34.f625dbc9.js new file mode 100644 index 0000000..6efaa66 --- /dev/null +++ b/assets/js/34.f625dbc9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{346:function(e,t,a){"use strict";a.r(t);var r=a(14),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"concepts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concepts"}},[e._v("#")]),e._v(" Concepts")]),e._v(" "),t("h2",{attrs:{id:"dynamic-value"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-value"}},[e._v("#")]),e._v(" Dynamic Value")]),e._v(" "),t("p",[e._v("Dynamic values are variables that change each time a user interacts with a web application. Examples of dynamic\nvalues include session IDs, CSRF tokens, and timestamps. These values are used by the application to maintain\nstate and security.")]),e._v(" "),t("p",[e._v("When recording a test scenario using JMeter, dynamic values need to be captured and included in subsequent requests.\nFailure to do so can lead to errors and incorrect test results. However, capturing and handling dynamic values can\nbe challenging and requires careful configuration of the test script.")]),e._v(" "),t("p",[e._v("There are several potential issues that can arise when dealing with dynamic values in JMeter recordings.\nOne common issue is that the recorded values may be specific to a particular user session or request, and\ntherefore cannot be reused in subsequent requests without modification. Additionally, dynamic values may expire\nor become invalid after a certain period of time, requiring the test script to be updated to use new values.")]),e._v(" "),t("p",[e._v("Another issue is that dynamic values may need to be correlated or parameterized to ensure that each virtual user\nin the test uses a unique value. This can be complex and time-consuming, particularly for large or complex test\nscenarios.")]),e._v(" "),t("h2",{attrs:{id:"correlation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation"}},[e._v("#")]),e._v(" Correlation")]),e._v(" "),t("p",[e._v("As I mentioned earlier, dynamic values such as session IDs and tokens can change with each user interaction,\nand must be included in subsequent requests to properly simulate user behavior. Correlation allows JMeter to\nautomatically capture these values and replace them with unique values for each virtual user in the test.")]),e._v(" "),t("p",[e._v("The correlation process, or Correlation for shorts, typically involves identifying the dynamic value in the\nresponse using a regular expression or other pattern-matching mechanism, and then storing it in a JMeter\nvariable. This variable can then be used in subsequent requests by enclosing it in curly braces,\nlike this: ${myVariable}.")]),e._v(" "),t("p",[e._v("JMeter provides several built-in correlation functions, such as Regular Expression Extractor and CSS/JQuery Extractor,\nto simplify the process of capturing and storing dynamic values. However, more complex scenarios may require custom\nscripting to properly correlate values.")]),e._v(" "),t("h3",{attrs:{id:"manual-correlation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-correlation"}},[e._v("#")]),e._v(" Manual Correlation")]),e._v(" "),t("p",[e._v("Manually correlating dynamic values in JMeter involves several steps. Here is an overview of the process:")]),e._v(" "),t("p",[e._v("Identify the request that needs correlation: Begin by identifying the request that contains the dynamic value that\nneeds to be captured and used in subsequent requests.")]),e._v(" "),t("p",[e._v("Detect the argument that needs to be correlated: Once you have identified the request, you need to determine which\nargument within the request contains the dynamic value. This may involve examining the request payload or headers to\nlocate the relevant argument.")]),e._v(" "),t("p",[e._v("Locate the appearance of the dynamic value in responses: Once you have identified the argument, you need to locate the\ncorresponding dynamic value in the responses to the request. This may involve using a regular expression or other\npattern-matching mechanism to identify the value.")]),e._v(" "),t("p",[e._v("Add an extractor to obtain the value: Once you have located the dynamic value in the response, you need to add an\nextractor to capture it and store it in a JMeter variable. JMeter provides several built-in extractors, such as\nRegular Expression Extractor and CSS/JQuery Extractor, to simplify this process.")]),e._v(" "),t("p",[e._v("Store the value in a variable: Once you have extracted the dynamic value, you need to store it in a JMeter variable.\nThe variable name should be chosen carefully to ensure it is unique and descriptive.")]),e._v(" "),t("p",[e._v("Replace the variable in subsequent requests: Finally, you need to replace the original dynamic value in subsequent\nrequests with the JMeter variable containing the captured value. This ensures that each virtual user in the test uses\na unique value.")]),e._v(" "),t("p",[e._v("Manual correlation can be a time-consuming process, particularly when dealing with large or complex test scenarios\nthat involve multiple dynamic values. This is where Auto Correlation Recorder comes in handy.\nThe Auto Correlation Recorder provides several methods for automatically detecting and correlating dynamic\nvalues, including the use of regular expressions and JSON Path expressions.")]),e._v(" "),t("p",[e._v("Here are some of the Automatic Correlation methods supported by Auto Correlation Recorder:")]),e._v(" "),t("ol",[t("li",[e._v("RegEx (Regular Expression) Extractor")]),e._v(" "),t("li",[e._v("JSON Extractor")])]),e._v(" "),t("p",[e._v("By using the Auto Correlation Recorder, however, you can simplify the process of correlating dynamic values and save time when creating test scripts.")]),e._v(" "),t("p",[e._v("Please take a look at previous sections in the guide, where you can learn about the different mechanisms for\nautomatically correlating dynamic values, either after the recording is being done or after the whole recording\nis done.")]),e._v(" "),t("h2",{attrs:{id:"correlation-rule"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-rule"}},[e._v("#")]),e._v(" Correlation Rule")]),e._v(" "),t("p",[e._v('The Auto Correlation Recorder plugin provides a powerful feature called "Correlation Rules" that simplifies the process of\nmaking correlations in JMeter scripts. A Correlation Rule consists of three key components:')]),e._v(" "),t("p",[e._v("Reference Variable: This variable is used to store the dynamic value that will be extracted from a response and\nsubsequently used for replacements in subsequent requests.")]),e._v(" "),t("p",[e._v("Extractor: The Extractor component of a Correlation Rule allows you to configure how and where the dynamic value will\nbe extracted from the response. JMeter provides several built-in Extractors such as Regular Expression Extractor,\nCSS/JQuery Extractor, XPath Extractor, JSON Extractor and Boundary Extractor, to facilitate the process of\ncapturing dynamic values.")]),e._v(" "),t("p",[e._v("Replacement: The Replacement component of a Correlation Rule allows you to configure how and where the dynamic value\nwill be replaced in subsequent requests. You can specify which request parameter to replace, and how to format the\nreplacement string.")]),e._v(" "),t("p",[e._v('By defining Correlation Rules, you can easily extract and replace dynamic values in JMeter scripts without the need\nfor manual correlation. To learn more about how to create Correlation Rules and leverage this powerful feature,\nrefer to the "Correlation Rules" section of the JMeter User Manual.')]),e._v(" "),t("h2",{attrs:{id:"correlation-template"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-template"}},[e._v("#")]),e._v(" Correlation Template")]),e._v(" "),t("p",[e._v("The Auto Correlation Recorder Plugin in JMeter utilizes Correlation Templates to maintain a simplified versioning of\nCorrelation Rules and to store and organize them together. A Correlation Template includes essential information\nsuch as version number, name, description, and changes log.")]),e._v(" "),t("p",[e._v("The Correlation Template serves as the foundation for the Automatic Correlation Analysis in the Auto Correlation Recorder\nPlugin. It allows the user to keep track of the version of the Correlation Rules being used for the analysis.\nThis feature ensures that the user is always working with the latest version of the Correlation Rules and helps\nto maintain the accuracy of the results.")]),e._v(" "),t("p",[e._v("Additionally, BlazeMeter provides several Correlation Templates that are designed for different technologies and\nprotocols. These templates can be used to facilitate the correlation process for specific types of applications\nand make it easier for users to get started with the Auto Correlation Recorder Plugin. To learn more about how to use\nCorrelation Templates and benefit from this powerful feature, refer to the JMeter User Manual.")]),e._v(" "),t("h2",{attrs:{id:"correlation-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-repository"}},[e._v("#")]),e._v(" Correlation Repository")]),e._v(" "),t("p",[e._v("The Correlation Repository is a powerful mechanism used by the Auto Correlation Recorder Plugin in JMeter to keep your set\nof Correlation Templates up-to-date. This feature allows for continuous updates of Correlation Templates from external\nsources.")]),e._v(" "),t("p",[e._v("The Correlation Repository is similar to a GitHub repository, where you can upload new versions of your templates to be\nstored and shared with others, while also being able to download templates uploaded by others. In Blazemeter,\nyou have access to both your company's private Repository and the public repository, where Blazemeter's refined\nCorrelation Templates are stored and updated regularly.")]),e._v(" "),t("p",[e._v("By utilizing the Correlation Repository, you can streamline the Correlation process and reduce the amount of time\nrequired to create and maintain Correlation Templates. This feature allows for collaboration between team members and\nsimplifies the process of sharing Correlation Templates across different projects. To learn more about how to use the\nCorrelation Repository and take advantage of this powerful feature, refer to the JMeter User Manual.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/35.fd546874.js b/assets/js/35.fd546874.js new file mode 100644 index 0000000..6f0e484 --- /dev/null +++ b/assets/js/35.fd546874.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{347:function(e,t,r){"use strict";r.r(t);var a=r(14),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"correlation-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-rules"}},[e._v("#")]),e._v(" Correlation Rules")]),e._v(" "),t("p",[e._v("Correlation rules are the mechanism that allows you to define how to the Auto Correlation Recorder will detect dynamic values, extract and replacement them in your recorded flow.")]),e._v(" "),t("h2",{attrs:{id:"concepts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concepts"}},[e._v("#")]),e._v(" Concepts")]),e._v(" "),t("p",[e._v("A Correlation Rule consists of three elements: a "),t("strong",[e._v("Reference variable name")]),e._v(", an "),t("strong",[e._v("Extractor")]),e._v(", and a "),t("strong",[e._v("Replacement")]),e._v(".")]),e._v(" "),t("p",[e._v("It's important to note that while the "),t("strong",[e._v("Reference variable name must be defined,")]),e._v(" it doesn't have to be unique. You can create "),t("strong",[e._v("multiple")]),e._v(" correlation rules with "),t("strong",[e._v("the same name")]),e._v(".")]),e._v(" "),t("p",[e._v("You can create a Correlation Rule with only an Extractor or only a Replacement, but at least one of them must be defined. If you create multiple rules with the same reference variable name, but different extractors or replacements, you'll be able to extract or replace the same dynamic value in different ways.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/36.bcf45902.js b/assets/js/36.bcf45902.js new file mode 100644 index 0000000..ee4aef0 --- /dev/null +++ b/assets/js/36.bcf45902.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{348:function(e,t,o){"use strict";o.r(t);var r=o(14),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"correlation-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-process"}},[e._v("#")]),e._v(" Correlation Process")]),e._v(" "),t("p",[e._v("Let's review the whole process of correlation, from the beginning, when we start recording and configuring\nthe JMeter plugin, until the end, when we have a fully functional test plan.")]),e._v(" "),t("h2",{attrs:{id:"recording"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recording"}},[e._v("#")]),e._v(" Recording")]),e._v(" "),t("p",[e._v("If you are new to making recordings in JMeter, we recommend you read the following articles from their\nofficial documentation:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Recording a Test Plan"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/best-practices.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Recording best practices"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("With this, you will be able to understand the basics of how to make a recording in JMeter and how to get the most out of it.")]),e._v(" "),t("h2",{attrs:{id:"correlation-process-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-process-2"}},[e._v("#")]),e._v(" Correlation Process")]),e._v(" "),t("p",[e._v('The "Correlation Process" is the technique of locating within the recording requests the values (arguments)\nthat vary in each iteration (replays), calling them "dynamic". Whenever a dynamic value is found in a request, usually one that failed, we need to locate the response upon which it depends, extract it using extractors in\nthe Test Plan, store it in a variable, and replace it in the corresponding request.')]),e._v(" "),t("p",[e._v("This process is repeated on each failed request until all the dynamic values are found and replaced. Sometimes,\nthe dynamic values are not easy to locate, and sometimes, they might even have different values for the same argument\nwithin the same recording.")]),e._v(" "),t("p",[e._v("When performing this process manually, it can be very time-consuming and frustrating. That's why we created the Auto Correlation Recorder plugin, to automate this process and make it easier for you.")]),e._v(" "),t("h2",{attrs:{id:"methods-of-correlation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#methods-of-correlation"}},[e._v("#")]),e._v(" Methods of Correlation")]),e._v(" "),t("p",[e._v("The Auto Correlation Recorder plugin offers different methods of correlation, each one with its own advantages and disadvantages. In this section, we will cover all of them divided into two categories: Before the Recording and After the Recording.")]),e._v(" "),t("h3",{attrs:{id:"before-the-recording"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#before-the-recording"}},[e._v("#")]),e._v(" Before the Recording")]),e._v(" "),t("p",[e._v("When we say 'Before the Recording,' it refers to the process between loading the Correlation Template into JMeter and completing the recording. We use this terminology instead of saying 'while it is being recorded' because this method requires you to properly configure the plugin before performing the recording using what is known as a Correlation Rule (or Rule for short).")]),e._v(" "),t("p",[e._v("Once you have finished configuring the rules, you can start the recording, and the plugin will automatically compare each request and response with the configured rules.")]),e._v(" "),t("p",[e._v("Pros:")]),e._v(" "),t("ul",[t("li",[e._v("It is the most flexible method since you can configure it to your needs.")]),e._v(" "),t("li",[e._v("It is the most efficient method since it is the only one that does not require you to replay the recording.")]),e._v(" "),t("li",[e._v("It supports extensibility, allowing you to develop your own rules according to your needs.")])]),e._v(" "),t("p",[e._v("Cons:")]),e._v(" "),t("ul",[t("li",[e._v("It requires you to configure the rules before the recording is done.")]),e._v(" "),t("li",[e._v("It requires prior knowledge of potential dynamic values and how to configure the rules to extract them.")]),e._v(" "),t("li",[e._v("It requires a re-recording to test the changes made to the rules.")]),e._v(" "),t("li",[e._v("It doesn't support rolling back changes made to the recording, since the elements are modified in the recording itself.")])]),e._v(" "),t("p",[e._v("To know more about this method, how to configure it, and how to use it, read "),t("RouterLink",{attrs:{to:"/guide/before-recording.html"}},[e._v("Correlation Rules")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"after-the-recording"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#after-the-recording"}},[e._v("#")]),e._v(" After the Recording")]),e._v(" "),t("p",[e._v("Unlike the previous point, these methods are performed after the recording is done, and they are used to analyze the recording and the recording results to find the dynamic values. It is important to note that these methods work in the form of an analysis of the recording, and they do not modify the recording itself, and they are done automatically by the plugin.")]),e._v(" "),t("p",[e._v("At this stage, the supported methods can correlate by:")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/guide/after-recording.html#by-using-correlation-templates"}},[e._v("By Using Correlation Templates")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/guide/after-recording.html#by-replay-and-compare"}},[e._v("By Replay and Compare")])],1)]),e._v(" "),t("p",[e._v("Let's see what each one of these methods has to offer.")]),e._v(" "),t("h4",{attrs:{id:"correlation-by-using-correlation-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-by-using-correlation-templates"}},[e._v("#")]),e._v(" Correlation by Using Correlation Templates")]),e._v(" "),t("p",[e._v("This method involves analyzing a recording using different Correlation Templates to automatically detect dynamic values. It generates a list of Correlation Suggestions based on those values and lets you choose which ones to apply in the Test Plan.")]),e._v(" "),t("p",[e._v("Pros:")]),e._v(" "),t("ul",[t("li",[e._v("This is the most reliable method as it only correlates the dynamic values found with the rules in the Correlation Template.")]),e._v(" "),t("li",[e._v("It lets you test any set of Correlation Rules before applying them to the Test Plan.")]),e._v(" "),t("li",[e._v("You can easily roll-back changes made to the Test Plan as it stores it in a separate file.")]),e._v(" "),t("li",[e._v("It integrates with the Correlation Repository feature, allowing you to use the Correlation Templates from BlazeMeter, GitHub, or any other sources, aside from your local ones.")])]),e._v(" "),t("p",[e._v("Cons:")]),e._v(" "),t("ul",[t("li",[e._v("It still requires Rules to properly correlate the dynamic values.")]),e._v(" "),t("li",[e._v("It does not detect dynamic values that are not present in the Correlation Templates.")])]),e._v(" "),t("h4",{attrs:{id:"correlation-by-replay-and-compare"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-by-replay-and-compare"}},[e._v("#")]),e._v(" Correlation by Replay and Compare")]),e._v(" "),t("p",[e._v("This method involves analyzing the results of a recording replay by comparing them with the original recording. It only focuses on the arguments of the requests that failed in the replay. By doing so, it generates a list of Correlation Suggestions based on the differences found, allowing you to select which ones to apply in the Test Plan.")]),e._v(" "),t("p",[e._v("Pros:")]),e._v(" "),t("ul",[t("li",[e._v("It is pretty flexible since it detects dynamic values that you might not be aware of.")]),e._v(" "),t("li",[e._v("It is customizable since you can configure how the analysis is done.")])]),e._v(" "),t("p",[e._v("Cons:")]),e._v(" "),t("ul",[t("li",[e._v("It is not 100% bullet-proof since it might correlate dynamic values that are not dynamic.")]),e._v(" "),t("li",[e._v("It requires your input of which of the detected dynamic values you are interested in correlating. Otherwise, it will end up correlating values that you might not be interested in.")])]),e._v(" "),t("p",[e._v("While they both have their own advantages and disadvantages, we recommend you use the "),t("strong",[e._v("Correlation by Using Correlation Templates")]),e._v(" method as it is the most reliable one. With that being said, the "),t("strong",[e._v("Correlation by Replay and Compare")]),e._v(" method can be pretty useful when you are not sure where the dynamic values are present in the recording.")]),e._v(" "),t("p",[e._v("In conclusion, the Correlation Process is a crucial step in JMeter testing, and the Auto Correlation Recorder plugin provides several methods to make it easier and more efficient. By following the recommended methods, you can save time and effort and ensure a more accurate and reliable test plan.")]),e._v(" "),t("p",[e._v("If you are new to JMeter, we recommend you start with the basics of recording and gradually move on to the more advanced topics of correlation. Take your time to learn and practice the different methods, and find the one that works best for your specific scenario.")]),e._v(" "),t("p",[e._v("Also, keep in mind that correlation is not a one-time process. Dynamic values can change over time, and you may need to update your correlation rules or templates accordingly. So, make sure to regularly review and update your test plan to ensure its accuracy and reliability.")]),e._v(" "),t("p",[e._v("In summary, the correlation process is a crucial part of JMeter testing, and the Auto Correlation Recorder plugin provides valuable tools to make it easier and more efficient. By mastering the different methods and techniques, you can create accurate and reliable test plans that can help you identify performance issues and optimize your applications.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/37.47ca7661.js b/assets/js/37.47ca7661.js new file mode 100644 index 0000000..1b63e4a --- /dev/null +++ b/assets/js/37.47ca7661.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{352:function(e,t,r){"use strict";r.r(t);var a=r(14),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"the-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-flow"}},[e._v("#")]),e._v(" The Flow")]),e._v(" "),t("p",[e._v("In the following sections, we will cover topics regarding how JMeter process and sends the Requests and Responses to the plugin, when and where this will be affected by the configured Correlation Rules, and how the order of the methods affects the results the user will see during the recording.")]),e._v(" "),t("h2",{attrs:{id:"the-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-steps"}},[e._v("#")]),e._v(" The Steps")]),e._v(" "),t("p",[e._v("In General Terms, the recording follows this order, for the case that involves processing with the plugin:")]),e._v(" "),t("ol",[t("li",[e._v("One Request goes to the server")]),e._v(" "),t("li",[e._v("The server gives a Response")]),e._v(" "),t("li",[e._v("JMeter takes both and sends them to the plugin")]),e._v(" "),t("li",[e._v("The Proxy verifies and sends them to the CorrelationEngine (deliverSampler() method)")]),e._v(" "),t("li",[e._v("The Engine applies all the Rules to the Response, Request and Recorded Sampler (process() method)")]),e._v(" "),t("li",[e._v("The Proxy takes the processed values back to JMeter (super.deliverSampler() method)")]),e._v(" "),t("li",[e._v("JMeter sends the Recorded Sampler to the configured Recording Controller")])]),e._v(" "),t("h2",{attrs:{id:"the-explanation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-explanation"}},[e._v("#")]),e._v(" The Explanation")]),e._v(" "),t("p",[e._v("Now, on a detailed point of view, let's talk about each one of the steps of processing the recorded Samplers")]),e._v(" "),t("h3",{attrs:{id:"proxy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#proxy"}},[e._v("#")]),e._v(" Proxy")]),e._v(" "),t("h4",{attrs:{id:"deliver-recorded-sampler"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#deliver-recorded-sampler"}},[e._v("#")]),e._v(" Deliver Recorded Sampler")]),e._v(" "),t("p",[e._v("For the Auto Correlation Recorder Plugin, the Proxy is handled by "),t("code",[e._v("CorrelationProxyControl.java")]),e._v(", who receives an HTTPSamplerBase (the recorded Sampler), and the SampleResult (the request and the response), process and sends it to the CorrelationEngine to be processed.")]),e._v(" "),t("p",[e._v("All that occurs in the deliverSampler method.")]),e._v(" "),t("div",{staticClass:"language-java extra-class"},[t("pre",{pre:!0,attrs:{class:"language-java"}},[t("code",[e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("public")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("void")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("deliverSampler")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("HTTPSamplerBase")]),e._v(" sampler"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("TestElement")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v(" testElements"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("SampleResult")]),e._v(" result"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("h4",{attrs:{id:"context-reset"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#context-reset"}},[e._v("#")]),e._v(" Context Reset")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("CorrelationProxyControl.java")]),e._v(" also holds the responsibility of triggering the Contexts reset when a new recording starts, so each recorder flow starts from a clean base.")]),e._v(" "),t("h3",{attrs:{id:"engine"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#engine"}},[e._v("#")]),e._v(" Engine")]),e._v(" "),t("p",[e._v("The Engine contains, not only the configured Correlation Rules setup before starting the recording, but also each one of the Contexts (CorrelationContexts and any Custom Context) associated with then, in their updated form. This role is been handled by the "),t("code",[e._v("CorrelationEngine.java")])]),e._v(" "),t("h4",{attrs:{id:"responsibilities"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#responsibilities"}},[e._v("#")]),e._v(" Responsibilities")]),e._v(" "),t("p",[e._v("At this point, the only responsibilities of the Engine are:")]),e._v(" "),t("ol",[t("li",[e._v("Apply all the configured CorrelationReplacements to the HTTPSamplerBase (the record)")]),e._v(" "),t("li",[e._v("Update all the Contexts with the info that comes from the SampleResult (the result)")]),e._v(" "),t("li",[e._v("Filter the Recorder HTTPSamplerBase by the "),t("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/blob/master/README.md#filtering-your-requests",target:"_blank",rel:"noopener noreferrer"}},[e._v("Response Filter"),t("OutboundLink")],1),e._v("'s type")]),e._v(" "),t("li",[e._v("Apply all the configured CorrelationExtractors to the HTTPSamplerBase (in case this one matches the "),t("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types",target:"_blank",rel:"noopener noreferrer"}},[e._v("Filter MIME Type"),t("OutboundLink")],1),e._v(" from Step 3)")])]),e._v(" "),t("p",[e._v("Anything that happens in the steps 1 and 4, will be handled by the "),t("code",[e._v("CorrelationRule")]),e._v(" (applyReplacements for the former, and addExtractors for the later), for each configured Rule.")]),e._v(" "),t("h4",{attrs:{id:"special-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#special-considerations"}},[e._v("#")]),e._v(" Special Considerations")]),e._v(" "),t("ol",[t("li",[e._v("Is important to mention that, because of the order of how the Correlation Components are applied and updated, the values that they extract or replace, only will be used after a future request. Because of this:")])]),e._v(" "),t("ul",[t("li",[e._v("Each value that is extracted from a Correlation Extractor, during the recording, will only be available for a Correlation Replacements in the next Request made")]),e._v(" "),t("li",[e._v("All the updated context values only will be considered, in the actual Sampler, by the Correlation Extractor but, the Correlation Replacements will need to wait for the next Sampler to be able to see it. The execution of the Correlation’s Flow is, as mentioned before:")])]),e._v(" "),t("blockquote",[t("p",[e._v("Receives a Request → Receives a Response → Applies Correlation Replacements → Update Correlation Contexts → Applies Correlation Replacements")])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/38.12ba9131.js b/assets/js/38.12ba9131.js new file mode 100644 index 0000000..b3bf317 --- /dev/null +++ b/assets/js/38.12ba9131.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{353:function(e,t,o){"use strict";o.r(t);var r=o(14),n=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"installation-and-configuration-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation-and-configuration-guide"}},[e._v("#")]),e._v(" Installation and Configuration Guide")]),e._v(" "),t("p",[e._v("This guide will walk you through the process of installing the Auto Correlation Recorder plugin for JMeter.\nIt's quick and easy, but you will need to make sure you have a few prerequisites before you start.")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("JMeter")]),e._v(": If you haven't done so already, download and install JMeter. You can find the latest version of\nJMeter "),t("a",{attrs:{href:"https://jmeter.apache.org/download_jmeter.cgi",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("JMeter Plugins Manager")]),e._v(": Ensure that you have installed the JMeter Plugins Manager before installing\nthe Auto Correlation Recorder plugin. Learn how to install it in "),t("a",{attrs:{href:"https://jmeter-plugins.org/install/Install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("this article."),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("p",[e._v("Follow these steps for an automatic installation of the latest version:")]),e._v(" "),t("ol",[t("li",[e._v("Launch "),t("strong",[e._v("JMeter")]),e._v(" and open the "),t("strong",[e._v("JMeter Plugins Manager")]),e._v(".")]),e._v(" "),t("li",[e._v('In the Available Plugins tab, search and select "'),t("strong",[e._v("BlazeMeter - Auto Correlation Recorder Plugin")]),e._v('".')]),e._v(" "),t("li",[e._v('Click the "'),t("strong",[e._v("Apply Changes and Restart JMeter")]),e._v('" button and wait for the installation process to complete.')])]),e._v(" "),t("p",[e._v("Once JMeter restarts, the Auto Correlation Recorder plugin will be installed. You can verify this by opening the\nPlugins Manager and checking the Installed Plugins tab.")]),e._v(" "),t("h2",{attrs:{id:"configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[e._v("#")]),e._v(" Configuration")]),e._v(" "),t("p",[e._v("Before we jump right into recording, let's take a look at the basic configuration options available for the\nAuto Correlation Recorder plugin.")]),e._v(" "),t("h3",{attrs:{id:"local-configurations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-configurations"}},[e._v("#")]),e._v(" Local configurations")]),e._v(" "),t("ol",[t("li",[e._v("Disable redirect disabling: Set the "),t("code",[e._v("proxy.redirect.disabling")]),e._v(" property to false in your "),t("code",[e._v("user.properties")]),e._v(" file.\nThis is required for a proper and automatic correlation experience.")]),e._v(" "),t("li",[e._v("Set deflate mode: If you plan to record in "),t("em",[e._v("Siebel CRM environments")]),e._v(", set the "),t("code",[e._v("httpclient4.deflate_relax_mode")]),e._v("\nproperty to true in your "),t("code",[e._v("user.properties")]),e._v(" file. This will help you avoid "),t("code",[e._v("Unexpected end of input stream")]),e._v(" errors.")])]),e._v(" "),t("h3",{attrs:{id:"proxy-configurations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#proxy-configurations"}},[e._v("#")]),e._v(" Proxy configurations")]),e._v(" "),t("p",[t("em",[e._v("If you have already configured the local proxy, you can skip this section.")])]),e._v(" "),t("p",[e._v("We need to configure the "),t("em",[e._v("local proxy")]),e._v(", otherwise, "),t("strong",[e._v("you will not be able to record\nany requests")]),e._v('. To do so, take a look at the "Configure your browser to use the JMeter Proxy" section in the\n'),t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("JMeter documentation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("If the server you are recording is running in your local machine, you will need to configure your browser to\nallow recording of local requests.")]),e._v(" "),t("p",[e._v('In such case, you will need to search for "How to configure the JMeter proxy to record local requests" and follow\nthe instructions for your browser.')]),e._v(" "),t("p",[e._v("In "),t("strong",[e._v("Firefox")]),e._v(", for instance, go to "),t("code",[e._v("about:config")]),e._v(" and set "),t("code",[e._v("network.proxy.allow_hijacking_localhost")]),e._v(" to true.")])]),e._v(" "),t("p",[e._v("After this, you should be able to start recording.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/39.a3169305.js b/assets/js/39.a3169305.js new file mode 100644 index 0000000..7852cc9 --- /dev/null +++ b/assets/js/39.a3169305.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{354:function(e,t,r){"use strict";r.r(t);var o=r(14),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"installing-the-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-plugin"}},[e._v("#")]),e._v(" Installing the Plugin")]),e._v(" "),t("p",[e._v("In this section, you will find instructions on how to install the plugin on your system.")]),e._v(" "),t("p",[e._v("The installation is usually the same regardless of your operating system. However, the configuration steps may vary\nsince it depends on how your proxy is configured.")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("h3",{attrs:{id:"plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin"}},[e._v("#")]),e._v(" Plugin")]),e._v(" "),t("p",[e._v("Before attempting to install the plugin, make sure you have the following prerequisites:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("JMeter")]),e._v(": If you haven't done so already, download and install JMeter. You can find the latest version of\nJMeter "),t("a",{attrs:{href:"https://jmeter.apache.org/download_jmeter.cgi",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("strong",[e._v("JMeter Plugins Manager")]),e._v(": Ensure that you have installed the JMeter Plugins Manager before installing\nthe Auto Correlation Recorder plugin. Learn how to install it in "),t("a",{attrs:{href:"https://jmeter-plugins.org/install/Install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("this article."),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("These two downloads are all you need to get started.")]),e._v(" "),t("h3",{attrs:{id:"integration-with-blazemeter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#integration-with-blazemeter"}},[e._v("#")]),e._v(" Integration with BlazeMeter")]),e._v(" "),t("p",[e._v("If you want to use the plugin with BlazeMeter, you will also need to have the following:")]),e._v(" "),t("ol",[t("li",[e._v("A BlazeMeter account. If you don't have one, you can "),t("a",{attrs:{href:"https://accounts.blazemeter.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("sign up for free"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("A BlazeMeter api-key. If you don't have one, you can learn how to generate it from this article "),t("a",{attrs:{href:"https://guide.blazemeter.com/hc/en-us/articles/13329040973073-BlazeMeter-API-keys-",target:"_blank",rel:"noopener noreferrer"}},[e._v("BlazeMeter Api Key"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("p",[e._v("The installation of the plugin is usually done using the Plugin Manager, which is the recommended way of installing, however,\nyou can also do it manually. This section will cover both methods.")]),e._v(" "),t("h3",{attrs:{id:"with-plugin-manager"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#with-plugin-manager"}},[e._v("#")]),e._v(" With Plugin Manager")]),e._v(" "),t("ol",[t("li",[e._v("Launch "),t("strong",[e._v("JMeter")]),e._v(" and open the "),t("strong",[e._v("JMeter Plugins Manager")]),e._v(".")]),e._v(" "),t("li",[e._v('In the Available Plugins tab, search and select "'),t("strong",[e._v("BlazeMeter - Auto Correlation Recorder Plugin")]),e._v('".')]),e._v(" "),t("li",[e._v('Click the "'),t("strong",[e._v("Apply Changes and Restart JMeter")]),e._v('" button and wait for the installation process to complete.')])]),e._v(" "),t("p",[e._v("Once JMeter restarts, the Auto Correlation Recorder plugin will be installed.")]),e._v(" "),t("h3",{attrs:{id:"manually"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manually"}},[e._v("#")]),e._v(" Manually")]),e._v(" "),t("ol",[t("li",[e._v("Go to the "),t("a",{attrs:{href:"https://jmeter-plugins.org/?search=Blazemeter%20-%20Auto%20Correlation%20Recorder%20Plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Auto Correlation Recorder plugin page"),t("OutboundLink")],1),e._v(" and download the\nlatest version of the plugin, with the dependencies.")]),e._v(" "),t("li",[e._v("Place the Plugin jar in the ext folder of your JMeter installation. The ext folder is usually located in\n"),t("code",[e._v("/lib/ext")]),e._v(".")]),e._v(" "),t("li",[e._v("Place the dependencies jars in the lib folder of your JMeter installation. The lib folder is usually located in\n"),t("code",[e._v("/lib")]),e._v(".")]),e._v(" "),t("li",[e._v("Restart JMeter.")])]),e._v(" "),t("h2",{attrs:{id:"verifying"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#verifying"}},[e._v("#")]),e._v(" Verifying")]),e._v(" "),t("p",[e._v("You can verify the plugin being installed by opening the Plugins Manager and checking the Installed Plugins tab. Search for\nthe Auto Correlation Recorder plugin and make sure it is listed there.")]),e._v(" "),t("p",[e._v("Another way to ensure the plugin is properly installed, is by attempting to load the Auto Correlation Recorder template. To do so,\nfollow these steps:")]),e._v(" "),t("ol",[t("li",[e._v("Launch "),t("strong",[e._v("JMeter")]),e._v(" and open the "),t("strong",[e._v("File")]),e._v(" menu.")]),e._v(" "),t("li",[e._v("Select the "),t("strong",[e._v("Templates")]),e._v(" option and then click on "),t("strong",[e._v("Load")]),e._v(".")]),e._v(" "),t("li",[e._v("Search for the "),t("strong",[e._v("Auto Correlation Recorder")]),e._v(" template and click on "),t("strong",[e._v("Open")]),e._v(".")]),e._v(" "),t("li",[e._v("If the template loads successfully, the plugin is properly installed.")])]),e._v(" "),t("h2",{attrs:{id:"updating"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#updating"}},[e._v("#")]),e._v(" Updating")]),e._v(" "),t("p",[e._v("If you already had the plugin installed and want to update it, you can do so by following the same steps as the installation,\nbut instead of searching the plugin in the Available Plugins tab, search for it in the Installed Plugins tab.")]),e._v(" "),t("p",[e._v("In case there is a new version of the plugin, the name of the extension will be bold and list of updated artifacts will be listed. Press "),t("em",[e._v("Install and Restart JMeter")])]),e._v(" "),t("h2",{attrs:{id:"uninstall"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#uninstall"}},[e._v("#")]),e._v(" Uninstall")]),e._v(" "),t("p",[e._v("If you want to uninstall the plugin, you can do so by following these steps:")]),e._v(" "),t("ol",[t("li",[e._v("Launch "),t("strong",[e._v("JMeter")]),e._v(" and open the "),t("strong",[e._v("JMeter Plugins Manager")]),e._v(".")]),e._v(" "),t("li",[e._v('In the Installed Plugins tab, search and select "'),t("strong",[e._v("BlazeMeter - Auto Correlation Recorder Plugin")]),e._v('".')]),e._v(" "),t("li",[e._v('Uncheck the plugin and click the "'),t("strong",[e._v("Apply Changes and Restart JMeter")]),e._v('" button.')]),e._v(" "),t("li",[e._v("Wait for the uninstallation process to complete.")]),e._v(" "),t("li",[e._v("Restart JMeter.")])]),e._v(" "),t("h2",{attrs:{id:"configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[e._v("#")]),e._v(" Configuration")]),e._v(" "),t("p",[e._v("Before we jump right into recording, let's take a look at the basic configuration options available for the Auto Correlation Recorder plugin.")]),e._v(" "),t("h3",{attrs:{id:"properties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[e._v("#")]),e._v(" Properties")]),e._v(" "),t("p",[e._v("Here is a list of properties that you need to configure in order to use the Auto Correlation Recorder plugin:")]),e._v(" "),t("ol",[t("li",[e._v("Disable redirect disabling: Set the "),t("code",[e._v("proxy.redirect.disabling")]),e._v(" property to false in your "),t("code",[e._v("user.properties")]),e._v(" file.\nThis is required for a proper and automatic correlation experience.")]),e._v(" "),t("li",[e._v("Set deflate mode: If you plan to record in "),t("em",[e._v("Siebel CRM environments")]),e._v(", set the "),t("code",[e._v("httpclient4.deflate_relax_mode")]),e._v("\nproperty to true in your "),t("code",[e._v("user.properties")]),e._v(" file. This will help you avoid "),t("code",[e._v("Unexpected end of input stream")]),e._v(" errors.")]),e._v(" "),t("li",[e._v("(Optional) Set the scope of post-processors to all: Set the "),t("code",[e._v("Sample.scope")]),e._v(" property to "),t("code",[e._v("all")]),e._v(" in your\n"),t("code",[e._v("user.properties")]),e._v(" file. This will help you to avoid the post-processors to only limit to the main sampler.")])]),e._v(" "),t("h3",{attrs:{id:"blazemeter-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#blazemeter-api-key"}},[e._v("#")]),e._v(" BlazeMeter Api Key")]),e._v(" "),t("p",[e._v("If you are planning on using the integration with Blazemeter, you need to provide your BlazeMeter api-key.\nYou can do that by doing one of the following options:")]),e._v(" "),t("p",[t("strong",[e._v("1. Drop the file in your bin directory")])]),e._v(" "),t("p",[e._v("It is as simple as it sounds. You just need to drop the "),t("code",[e._v("api-key.json")]),e._v(" file in your "),t("code",[e._v("/bin")]),e._v(" directory,\nmaking sure you don't have any other "),t("code",[e._v("api-key.json")]),e._v(" file in that directory.")]),e._v(" "),t("p",[e._v("Restart JMeter")]),e._v(" "),t("p",[t("strong",[e._v("2. Configure the properties file")])]),e._v(" "),t("p",[e._v("If you don't want to drop the api-key.json file in your bin directory, you can provide the path to your api-key.json file in the configuration.\nTo do that, you need to open the "),t("code",[e._v("blazemeter.properties")]),e._v(" file in your "),t("code",[e._v("/bin")]),e._v(" directory and add the following line:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("blazemeter.api.key.file=\n")])])]),t("p",[e._v("Restart JMeter")]),e._v(" "),t("p",[e._v("Note: make sure the path you provide is correct, it points to a file, rather than a folder, and the file exists.\nIt should look something like this:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("blazemeter.api.key.file=/Users/username/.blazemeter/api-key.json\n")])])]),t("h3",{attrs:{id:"proxy-configurations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#proxy-configurations"}},[e._v("#")]),e._v(" Proxy configurations")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[t("em",[e._v("If you have already configured the local proxy, you can skip this section.")])])]),e._v(" "),t("p",[e._v("You might also follow the steps in JMeter's Official documentation as can be seen in\n"),t("a",{attrs:{href:"https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("this article."),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("To configure JMeter to record HTTP/HTTPS traffic in "),t("strong",[e._v("Chrome")]),e._v(", "),t("strong",[e._v("Firefox")]),e._v(", or "),t("strong",[e._v("Opera")]),e._v(", you need to set up a proxy server in\nJMeter and configure your web browser to use that proxy.")]),e._v(" "),t("h4",{attrs:{id:"windows"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#windows"}},[e._v("#")]),e._v(" Windows")]),e._v(" "),t("h4",{attrs:{id:"_1-configure-jmeter-proxy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-configure-jmeter-proxy"}},[e._v("#")]),e._v(" 1. "),t("strong",[e._v("Configure JMeter Proxy")])]),e._v(" "),t("ol",[t("li",[e._v("Open JMeter and create a new Test Plan.")]),e._v(" "),t("li",[e._v('Right-click on the Test Plan and select "Add" > "Threads (Users)" > "Thread Group".')]),e._v(" "),t("li",[e._v('Right-click on the Thread Group and select "Add" > "Logic Controller" > "Recording Controller".')]),e._v(" "),t("li",[e._v('Right-click on the Recording Controller and select "Add" > "Sampler" > "HTTP(S) Test Script Recorder".')]),e._v(" "),t("li",[e._v('In the HTTP(S) Test Script Recorder, click on the "Start" button to start the proxy server.')]),e._v(" "),t("li",[e._v('Click on the "HTTP(S) Test Script Recorder" element in the tree view and configure the following settings:')]),e._v(" "),t("li",[e._v('Set the "Target Controller" to the Recording Controller you created in step 3.')]),e._v(" "),t("li",[e._v('Set the "Port" to an available port (e.g. 8888).')]),e._v(" "),t("li",[e._v('Set the "Grouping" to "Put each group in a new transaction controller".')]),e._v(" "),t("li",[e._v('Click on the "SSL Manager" button and create a new SSL certificate.')])]),e._v(" "),t("h4",{attrs:{id:"_2-configure-web-browser"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-configure-web-browser"}},[e._v("#")]),e._v(" "),t("strong",[e._v("2. Configure Web Browser")])]),e._v(" "),t("ol",[t("li",[e._v("Open Chrome/Firefox/Opera and go to the settings menu.")]),e._v(" "),t("li",[e._v('Search for "proxy" or "network settings".')]),e._v(" "),t("li",[e._v('Under the "Proxy" section, select "Manual proxy configuration".')]),e._v(" "),t("li",[e._v('In the "HTTP Proxy" field, enter "localhost" and the port number you set in step 6 of the JMeter configuration (e.g. 8888).')]),e._v(" "),t("li",[e._v('Click on the "OK" button to save the settings.')])]),e._v(" "),t("h4",{attrs:{id:"_3-record-traffic"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-record-traffic"}},[e._v("#")]),e._v(" "),t("strong",[e._v("3. Record Traffic")])]),e._v(" "),t("ol",[t("li",[e._v('In JMeter, click on the "Start" button in the HTTP(S) Test Script Recorder to start recording.')]),e._v(" "),t("li",[e._v("In your web browser, navigate to the website you want to record.")]),e._v(" "),t("li",[e._v("Perform the actions you want to record (e.g. filling out forms, clicking links).")]),e._v(" "),t("li",[e._v('In JMeter, click on the "Stop" button to stop recording.')])]),e._v(" "),t("h4",{attrs:{id:"macos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#macos"}},[e._v("#")]),e._v(" macOS")]),e._v(" "),t("h5",{attrs:{id:"_1-configure-jmeter-proxy-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-configure-jmeter-proxy-2"}},[e._v("#")]),e._v(" 1. "),t("strong",[e._v("Configure JMeter Proxy")])]),e._v(" "),t("ol",[t("li",[e._v("Open JMeter and create a new Test Plan.")]),e._v(" "),t("li",[e._v('Right-click on the Test Plan and select "Add" > "Threads (Users)" > "Thread Group".')]),e._v(" "),t("li",[e._v('Right-click on the Thread Group and select "Add" > "Logic Controller" > "Recording Controller".')]),e._v(" "),t("li",[e._v('Right-click on the Recording Controller and select "Add" > "Sampler" > "HTTP(S) Test Script Recorder".')]),e._v(" "),t("li",[e._v('In the HTTP(S) Test Script Recorder, click on the "Start" button to start the proxy server.')]),e._v(" "),t("li",[e._v('Click on the "HTTP(S) Test Script Recorder" element in the tree view and configure the following settings:')])]),e._v(" "),t("ul",[t("li",[e._v('Set the "Target Controller" to the Recording Controller you created in step 3.')]),e._v(" "),t("li",[e._v('Set the "Port" to an available port (e.g. 8888).')]),e._v(" "),t("li",[e._v('Set the "Grouping" to "Put each group in a new transaction controller".')])]),e._v(" "),t("ol",{attrs:{start:"7"}},[t("li",[e._v('Click on the "SSL Manager" button and create a new SSL certificate.')])]),e._v(" "),t("h5",{attrs:{id:"_2-configure-web-browser-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-configure-web-browser-2"}},[e._v("#")]),e._v(" "),t("strong",[e._v("2. Configure Web Browser")])]),e._v(" "),t("ol",[t("li",[e._v("Open Chrome/Firefox/Opera and go to the settings menu.")]),e._v(" "),t("li",[e._v('Search for "proxy" or "network settings".')]),e._v(" "),t("li",[e._v('Under the "Proxy" section, select "Manual proxy configuration".')]),e._v(" "),t("li",[e._v('In the "HTTP Proxy" field, enter "localhost" and the port number you set in step 6 of the JMeter configuration (e.g. 8888).')]),e._v(" "),t("li",[e._v('Click on the "OK" button to save the settings.')])]),e._v(" "),t("h5",{attrs:{id:"_3-record-traffic-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-record-traffic-2"}},[e._v("#")]),e._v(" "),t("strong",[e._v("3. Record Traffic")])]),e._v(" "),t("ol",[t("li",[e._v('In JMeter, click on the "Start" button in the HTTP(S) Test Script Recorder to start recording.')]),e._v(" "),t("li",[e._v("In your web browser, navigate to the website you want to record.")]),e._v(" "),t("li",[e._v("Perform the actions you want to record (e.g. filling out forms, clicking links).")]),e._v(" "),t("li",[e._v('In JMeter, click on the "Stop" button to stop recording.')])]),e._v(" "),t("h4",{attrs:{id:"recording-on-localhost-configurations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recording-on-localhost-configurations"}},[e._v("#")]),e._v(" Recording on Localhost configurations")]),e._v(" "),t("p",[e._v("We need to configure the "),t("em",[e._v("local proxy")]),e._v(", otherwise, "),t("strong",[e._v("you will not be able to record\nany requests")]),e._v('. To do so, take a look at the "Configure your browser to use the JMeter Proxy" section in the')]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("If the server you are recording is running in your local machine, you will need to configure your browser to\nallow recording of local requests.")]),e._v(" "),t("p",[e._v('In such case, you will need to search for "How to configure the JMeter proxy to record local requests" and follow\nthe instructions for your browser.')]),e._v(" "),t("p",[e._v("In "),t("strong",[e._v("Firefox")]),e._v(", for instance, go to "),t("code",[e._v("about:config")]),e._v(" and set "),t("code",[e._v("network.proxy.allow_hijacking_localhost")]),e._v(" to true.")])]),e._v(" "),t("p",[e._v("After this, you should be able to start recording.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/4.7c1d9227.js b/assets/js/4.7c1d9227.js new file mode 100644 index 0000000..3612cb4 --- /dev/null +++ b/assets/js/4.7c1d9227.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{306:function(t,e,n){},320:function(t,e,n){"use strict";n(306)},338:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type],style:{verticalAlign:e.vertical}},e.text||n().default)},p=(n(320),n(14)),l=Object(p.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/40.f43a83ab.js b/assets/js/40.f43a83ab.js new file mode 100644 index 0000000..50034b8 --- /dev/null +++ b/assets/js/40.f43a83ab.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{355:function(e,t,r){"use strict";r.r(t);var a=r(14),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"known-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#known-issues"}},[e._v("#")]),e._v(" Known issues")]),e._v(" "),t("p",[e._v("This section contains a list of known issues and workarounds.")]),e._v(" "),t("h2",{attrs:{id:"_1-correlation-history-is-isolated"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-correlation-history-is-isolated"}},[e._v("#")]),e._v(" 1. Correlation History is isolated")]),e._v(" "),t("p",[e._v('After a recording or a correlation process is done and, the Test Plan is saved, if you open it again,\nthe Correlation History of that "session" is not associated to the Test Plan anymore. This impacts the correlation\nprocess, as there is no Original Recording JMX or JTL associated to the Correlation History for the "current" session.')]),e._v(" "),t("h3",{attrs:{id:"workaround-manually-feeding-the-files-to-the-correlation-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#workaround-manually-feeding-the-files-to-the-correlation-process"}},[e._v("#")]),e._v(" Workaround: Manually feeding the files to the Correlation Process")]),e._v(" "),t("h4",{attrs:{id:"correlating-by-correlation-template"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlating-by-correlation-template"}},[e._v("#")]),e._v(" Correlating by Correlation Template")]),e._v(" "),t("ol",[t("li",[e._v("You need to open the correlation history JSON file stored at "),t("code",[e._v("jmeter/bin/History/")])]),e._v(" "),t("li",[e._v("Take the path of the "),t("code",[e._v("recordingTraceFilepath")]),e._v(" in the "),t("code",[e._v("Original Recording")]),e._v(" step.")]),e._v(" "),t("li",[e._v('Use that path in the JTL file selector in the "Select Correlation Template" window.')])]),e._v(" "),t("p",[e._v('This will enforce the use of the JTL file you want to use for the correlation process for that "session".')]),e._v(" "),t("h4",{attrs:{id:"correlating-by-replay-and-comparison"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlating-by-replay-and-comparison"}},[e._v("#")]),e._v(" Correlating by Replay and Comparison")]),e._v(" "),t("p",[e._v('Take the steps from the previous section, but instead of feeding the JTL file to the JTL file selector,\nset it as the JTL file in the View result tree for the "bzm - Auto Correlation Recorder" sampler.')]),e._v(" "),t("p",[e._v("This will use the back method of the Correlating by Replay and Comparison method of using that auxiliary JTL file to\nperform the correlation process.")]),e._v(" "),t("h2",{attrs:{id:"_2-manual-replay-correlation-analysis-issue-after-choosing-no-to-wizard-prompt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-manual-replay-correlation-analysis-issue-after-choosing-no-to-wizard-prompt"}},[e._v("#")]),e._v(" 2. Manual Replay Correlation Analysis Issue After Choosing 'No' to Wizard Prompt")]),e._v(" "),t("p",[e._v('We are aware that there is an issue where, if you click "No" when the Automatic Correlation Wizard offers\nto generate suggestions after recording, manually opening the wizard, replaying, and selecting the Correlation\nmethod may not trigger the analysis.')]),e._v(" "),t("p",[e._v('We recommend selecting "Yes" when the wizard prompts you to generate suggestions to avoid this issue.')]),e._v(" "),t("h2",{attrs:{id:"_3-gui-crash-and-console-error-logging-null-pointer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-gui-crash-and-console-error-logging-null-pointer"}},[e._v("#")]),e._v(" 3. GUI crash and console error logging null pointer.")]),e._v(" "),t("p",[e._v("We have identified an issue with java 1.8 primarily happening on macOS when using this plugin.\nWe have fixed the issue in the table renderer, but there can still be some cases where this might happen.\nIn case you are getting a GUI crash and null pointer references in jmeter console, you might want to consider\nupgrading java version.")]),e._v(" "),t("p",[e._v("If you are getting this error or a similar one:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" java.lang.NullPointerException: null\n at com.blazemeter.jmeter.correlation.gui.RulesTableGui$CustomCellRenderer.getTableCellRendererComponent(RulesTableGui.java:178) ~[jmeter-bzm-correlation-recorder-2.2.1.jar:?]\n at javax.swing.JTable$AccessibleJTable.getAccessibleChild(JTable.java:7037) ~[?:1.8.0_345]\n")])])]),t("p",[e._v("We recommend using java 11 or higher.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/41.db0f52e0.js b/assets/js/41.db0f52e0.js new file mode 100644 index 0000000..1a55b5d --- /dev/null +++ b/assets/js/41.db0f52e0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{356:function(e,t,a){"use strict";a.r(t);var o=a(14),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"create-template"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-template"}},[e._v("#")]),e._v(" Create Template")]),e._v(" "),t("p",[e._v("The only requisite for creating a Template is having Correlation Rules on it. These can be added to the Plugin by:")]),e._v(" "),t("ul",[t("li",[e._v("Manually inserting a new Rule")]),e._v(" "),t("li",[e._v("Exporting the Correlation Suggestions as Rules")]),e._v(" "),t("li",[e._v("Loading one or multiple templates")])]),e._v(" "),t("p",[e._v('Once you are satisfied with the final set of Correlation Rules, you can click on "Save Template", proceed to fill in all the required fields, and click on "Save".')]),e._v(" "),t("h2",{attrs:{id:"manual-template-creation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-template-creation"}},[e._v("#")]),e._v(" Manual Template Creation")]),e._v(" "),t("p",[e._v("By default, you can create local Templates, which are stored in your local Repository, but you can also create Templates in your BlazeMeter account and upload them to a Repository for you and your team to use (since they are stored in the cloud, you can access them from any machine with the Plugin installed and they are shared with your team).")]),e._v(" "),t("p",[e._v("To create a Template, regardless to where you want to store it, you need to provide the following information:")]),e._v(" "),t("ol",[t("li",[e._v("A "),t("strong",[e._v("Name")]),e._v(" or "),t("strong",[e._v("Id")]),e._v(' (*): representing the application or type of application it handles (e.g. "SAP", "Salesforce", "SAP Fiori", etc.)')]),e._v(" "),t("li",[e._v("A "),t("strong",[e._v("Version number")]),e._v(" (*): to identify the version of the Template (we recommend to use "),t("a",{attrs:{href:"https://semver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("semantic versioning"),t("OutboundLink")],1),e._v(' for this, e.g. "1.0.0", "1.0.1", "1.1.0", etc.)')]),e._v(" "),t("li",[e._v("A list of "),t("strong",[e._v("Changes")]),e._v(' (*): to inform the others what has changed in the Template (e.g. "Added a new Correlation Rule to handle the CSRF token", "Added a new Correlation Rule to handle the session ID", etc.)')]),e._v(" "),t("li",[e._v("A "),t("strong",[e._v("Description")]),e._v(' (*) text: to inform the others what the Template is for (e.g. "Template to handle SAP applications", "Template to handle Salesforce applications", etc.)')]),e._v(" "),t("li",[e._v("The Author's "),t("strong",[e._v("Name")]),e._v(' (*): to identify who created the Template (e.g. "John Doe", "Your Company", etc.)')]),e._v(" "),t("li",[e._v("The Author's "),t("strong",[e._v("Email")]),e._v(' (*): to contact the author (e.g. "email@example.com", "example.com", etc.)')]),e._v(" "),t("li",[e._v('Dependencies list: to inform the others what other libraries are required to use this one (e.g. "our-logic.jar", "logging.jar", etc.)')])]),e._v(" "),t("p",[t("strong",[e._v("Note")]),e._v(": The fields marked with an asterisk (*) are mandatory. The rest are optional.")]),e._v(" "),t("p",[e._v("When you are creating a new Template, you can either create it from scratch or use an existing one as a base. If you choose to use an existing one, you will be able to select it from a list of Templates that are stored in your configured Repository.\nEven if they are a combination of other Templates, you are not limited to store them in the same Repository, on any of the selected Templates, you can store it in a different repository with a different name and version; it's up to you and how you want to organize your Templates.\nIt is advisable to make mention of the Templates you used as a base in the Description field, specially if you are combining support for different applications and technologies or if they have dependencies associated.")]),e._v(" "),t("h2",{attrs:{id:"export-suggestions-as-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#export-suggestions-as-rules"}},[e._v("#")]),e._v(" Export Suggestions as Rules")]),e._v(" "),t("p",[e._v("If you have Correlation Suggestions generated from your Test Plan, you can export them as Rules to your plugin, modify them and, after, to create a Template.")]),e._v(" "),t("p",[e._v("To do so, you need to:")]),e._v(" "),t("ol",[t("li",[e._v("Make a Recording and generate Correlation Suggestions (by any method)")]),e._v(" "),t("li",[e._v('Click on the "Export Suggestions" button in the Auto Correlation Recorder Plugin')]),e._v(" "),t("li",[e._v("Select the Rules you want to save as a Template (eliminate the rest)")]),e._v(" "),t("li",[e._v('Click on "Save Template" and fill in the required fields')]),e._v(" "),t("li",[e._v('Click on "Save"')])]),e._v(" "),t("p",[e._v("Note: If you are generating Suggestions from a Template that you have access to manage (e.g. a local Template), you can make use of the Export Suggestions as Rules as a way to ensure "),t("strong",[e._v("which Rules are effectively applying")]),e._v(", since the Suggestions are generated from the Rules that actually applied in your Recordings. This is a goo way to refine your Rules before saving or sharing them.")]),e._v(" "),t("h2",{attrs:{id:"load-template"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#load-template"}},[e._v("#")]),e._v(" Load Template")]),e._v(" "),t("p",[e._v("Another way to create a Template is by loading different Templates into the Plugin and manually editing them to fit your use case. This is useful when you want to combine different Templates into a single one or when you want to create a Template from scratch.\nWhen you are done editing the Template, you can save it as a new one.")]),e._v(" "),t("p",[e._v("The Auto Correlation Recorder Plugin do not keep track of the Templates you load, except from the last one, so you need to make sure you save them in the proper Repository.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/42.20dc1926.js b/assets/js/42.20dc1926.js new file mode 100644 index 0000000..a9324dd --- /dev/null +++ b/assets/js/42.20dc1926.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{357:function(e,t,a){"use strict";a.r(t);var o=a(14),s=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"_1-140-0-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-140-0-0"}},[e._v("#")]),e._v(" @@ -1,140 +0,0 @@")]),e._v(" "),t("h2",{attrs:{id:"next-guide-templates-create-md"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#next-guide-templates-create-md"}},[e._v("#")]),e._v(" next: /guide/templates/create.md")]),e._v(" "),t("h1",{attrs:{id:"correlation-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correlation-templates"}},[e._v("#")]),e._v(" Correlation Templates")]),e._v(" "),t("p",[e._v("The Templates are part of the core functionalities of the Auto Correlation Recorder Plugin. They are the structure that groups a set of Correlation Rules inside the Plugin for various uses.")]),e._v(" "),t("p",[e._v("In this section, you will learn about:")]),e._v(" "),t("ol",[t("li",[e._v("Definitions")]),e._v(" "),t("li",[e._v("Types")]),e._v(" "),t("li",[e._v("Management")]),e._v(" "),t("li",[e._v("Limitations")])]),e._v(" "),t("h2",{attrs:{id:"definitions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#definitions"}},[e._v("#")]),e._v(" Definitions")]),e._v(" "),t("p",[e._v("A Correlation Template, or a Template for shorts, is the structure used to group a set of Correlation Rules inside the Auto Correlation Recorder Plugin for different purposes, such as:")]),e._v(" "),t("ul",[t("li",[e._v("Sharing with coworkers")]),e._v(" "),t("li",[e._v("Analyzing the recordings")]),e._v(" "),t("li",[e._v("Versioning your changes")]),e._v(" "),t("li",[e._v("Organizing your Correlation Rules")])]),e._v(" "),t("p",[e._v("We will talk about each other in their respective sections. For now, let's jump into the types of Templates you can access.")]),e._v(" "),t("h2",{attrs:{id:"types"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#types"}},[e._v("#")]),e._v(" Types")]),e._v(" "),t("p",[e._v("What differentiates one Template from another is the source or Repository it comes from, and it highly impacts your capabilities over them.")]),e._v(" "),t("p",[e._v("Initially, you can lose control over their content and configuration while you gain a range of Correlation possibilities. It is a matter of the policies of your Template providers.")]),e._v(" "),t("p",[e._v("Based on their sources, you might have:")]),e._v(" "),t("ul",[t("li",[e._v("Local Templates")]),e._v(" "),t("li",[e._v("Central Templates")]),e._v(" "),t("li",[e._v("BlazeMeter Templates (built-in, Workspace and Enterprise)")]),e._v(" "),t("li",[e._v("Custom Templates")])]),e._v(" "),t("p",[e._v("Most of these Templates have the same capabilities. However, they might restrict you based on your user access level. Let's talk about it.")]),e._v(" "),t("h3",{attrs:{id:"local-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-templates"}},[e._v("#")]),e._v(" Local Templates")]),e._v(" "),t("p",[e._v("These Templates are the ones created by yourself. They are located in your local machine and maintained by you. Because of this, you have full access to them, allowing you to:")]),e._v(" "),t("ul",[t("li",[e._v("Load them")]),e._v(" "),t("li",[e._v("Configure them")]),e._v(" "),t("li",[e._v("Save new versions")]),e._v(" "),t("li",[e._v("Use them for Analysis")]),e._v(" "),t("li",[e._v("Export the suggestions as Rules")])]),e._v(" "),t("h3",{attrs:{id:"central-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#central-templates"}},[e._v("#")]),e._v(" Central Templates")]),e._v(" "),t("p",[e._v("These Templates come from GitHub Central, and since they come from the community, you can treat them as a Local Template, with the difference that the Saving of a new version (directly to GitHub) still needs to be supported.")]),e._v(" "),t("ul",[t("li",[e._v("For the sake of consistency, these Template allows you to:")]),e._v(" "),t("li",[e._v("Load them")]),e._v(" "),t("li",[e._v("Configure them")]),e._v(" "),t("li",[e._v("Use them for Analysis")]),e._v(" "),t("li",[e._v("Export the suggestions as Rules")])]),e._v(" "),t("h3",{attrs:{id:"blazemeter-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#blazemeter-templates"}},[e._v("#")]),e._v(" BlazeMeter Templates")]),e._v(" "),t("p",[e._v("These are the Templates that come from BlazeMeter's Repository. You get access to them after configuring your BlazeMeter's API and forcing a sync of your Templates if needed.")]),e._v(" "),t("p",[e._v("Depending on your account level, you might need special access to some of their capabilities; however, in general terms, you are allowed to:")]),e._v(" "),t("ul",[t("li",[e._v("Use them for Analysis (Built-in, Workspace, Enterprise(*))")]),e._v(" "),t("li",[e._v("Load them (Workspace)")]),e._v(" "),t("li",[e._v("Configure them (Workspace)")]),e._v(" "),t("li",[e._v("Save new versions (Workspace)")]),e._v(" "),t("li",[e._v("Export the suggestions as Rules (Workspace)")])]),e._v(" "),t("p",[e._v('In general terms, everything you or your coworkers created is available as if they were Local Templates: you own and use them. These are marked as "Workspace Templates".')]),e._v(" "),t("p",[e._v('The rest of the Templates from BlazeMeter are proprietary; you can access them "as it is" exclusively for Analysis.')]),e._v(" "),t("h3",{attrs:{id:"manually-imported-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manually-imported-templates"}},[e._v("#")]),e._v(" Manually Imported Templates")]),e._v(" "),t("p",[e._v("These are Templates that come from manually importing them. Since there is no way to keep track of them, we consider them just like a Local Template, meaning that you are allowed to:")]),e._v(" "),t("ul",[t("li",[e._v("Load them")]),e._v(" "),t("li",[e._v("Configure them")]),e._v(" "),t("li",[e._v("Save new versions")]),e._v(" "),t("li",[e._v("Use them for Analysis")]),e._v(" "),t("li",[e._v("Export the suggestions as Rules")])]),e._v(" "),t("h2",{attrs:{id:"management"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#management"}},[e._v("#")]),e._v(" Management")]),e._v(" "),t("p",[e._v("Let's talk about how you get access to your Templates and how to store them properly.")]),e._v(" "),t("p",[e._v("You can either create your Templates or import them from external sources or Repositories, as we call them.")]),e._v(" "),t("h3",{attrs:{id:"create-template"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-template"}},[e._v("#")]),e._v(" Create Template")]),e._v(" "),t("p",[e._v("The only requisite for creating a Template is having Correlation Rules on it. These can be added to the Plugin by:")]),e._v(" "),t("ul",[t("li",[e._v("Manually inserting a new Rule")]),e._v(" "),t("li",[e._v("Exporting the Correlation Suggestions as Rules")]),e._v(" "),t("li",[e._v("Loading one or multiple templates")])]),e._v(" "),t("p",[e._v('Once you are satisfied with the final set of Correlation Rules, you can click on "Save Template", proceed to fill in all the required fields, and click on "Save".')]),e._v(" "),t("h3",{attrs:{id:"load-template"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#load-template"}},[e._v("#")]),e._v(" Load Template")]),e._v(" "),t("p",[e._v("When you load a Template to the Plugin, you manually edit the configurations the Correlation Rules have to fit your use case properly. Bear in mind that only some of the Templates can be loaded to be manually edited (this might depend on your access level over these Templates, depending on the sources they come from).")]),e._v(" "),t("p",[e._v("To load a Template to the Plugin, you must:")]),e._v(" "),t("ol",[t("li",[e._v("Load the Auto Correlation Recorder Plugin")]),e._v(" "),t("li",[e._v('Click on the "Load Template" button')]),e._v(" "),t("li",[e._v("Select the Template from the list of Installed and Available (*)")]),e._v(" "),t("li",[e._v('Click on the "Load" button')])]),e._v(" "),t("p",[e._v("Depending on your access level over the selected Template, you can load it into the Plugin. If you don't have access, you will be prompted with a warning pop-up informing you that you don't have access.")]),e._v(" "),t("p",[e._v("(*): If you select a Template from the Available list, you should install that Template first before. Sometimes, this installation might require resetting your JMeter; in such scenarios, you will be prompted to ask if you want to restart, giving you time to store unsaved changes in your Test Plan.")]),e._v(" "),t("h3",{attrs:{id:"sync-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sync-templates"}},[e._v("#")]),e._v(" Sync Templates")]),e._v(" "),t("p",[e._v("We have spoken about sources or Repositories, which are the ones that supply you with Templates when they are not created locally in your machine. Some of these Repositories come from external sources (such as BlazeMeter, GitHub, or other HTTP-related locations) and might require you to manually sync them to obtain the most recent versions of their Templates.")]),e._v(" "),t("p",[e._v('To keep your local Repository up to date, please remember to click the "Refresh" button. It can be found right next to the "Config" button and looks like two arrows following each other.')]),e._v(" "),t("h3",{attrs:{id:"manually-importing-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manually-importing-templates"}},[e._v("#")]),e._v(" Manually importing Templates")]),e._v(" "),t("p",[e._v("If anyone gave you the JSON file related to a Template, you could import it into your local Repository by adding the file to your "),t("code",[e._v("correlation-template")]),e._v(" folder, located in "),t("code",[e._v("/bin/.")]),e._v(" after that, you force a manual sync so the Plugin to index it as local.")]),e._v(" "),t("h3",{attrs:{id:"delete-templates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#delete-templates"}},[e._v("#")]),e._v(" Delete Templates")]),e._v(" "),t("p",[e._v("Currently, the Auto Correlation Recorder Plugin does not support Deleting Templates, neither from your local Repository nor any other external repository.")]),e._v(" "),t("p",[e._v("You can delete your local repository Templates by manually deleting the correlation-templates folder in the bin folder inside your JMeter installation folder; however, this is not advisable, and you must do it at your own risk.")]),e._v(" "),t("h2",{attrs:{id:"usages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usages"}},[e._v("#")]),e._v(" Usages")]),e._v(" "),t("p",[e._v("Templates are used in two different ways:")]),e._v(" "),t("ol",[t("li",[e._v("To store Correlation Rules for a specific application or type of application")]),e._v(" "),t("li",[e._v("To do an Analysis of your recordings and suggest changes")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Always sync your repositories before analyzing your recordings to have the latest version of the Templates.")])]),e._v(" "),t("h2",{attrs:{id:"limitations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#limitations"}},[e._v("#")]),e._v(" Limitations")]),e._v(" "),t("p",[e._v("There are some limitations when using Templates:")]),e._v(" "),t("ol",[t("li",[e._v("You can't edit BlazeMeter built-in Enterprise Templates")]),e._v(" "),t("li",[e._v("You can't overwrite versions of any Template (regardless of the type)")])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/43.d4c83866.js b/assets/js/43.d4c83866.js new file mode 100644 index 0000000..afde064 --- /dev/null +++ b/assets/js/43.d4c83866.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{358:function(e,t,r){"use strict";r.r(t);var o=r(14),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("p",[e._v("In this section you will find information about:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#common-issues-and-solutions"}},[e._v("Common issues and solutions")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#debugging-tips"}},[e._v("Debugging tips")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#faq"}},[e._v("FAQ")])])]),e._v(" "),t("p",[e._v("Most of these issues, if not all, can be solved by:")]),e._v(" "),t("ul",[t("li",[e._v("Ensuring your plugin is appropriately "),t("RouterLink",{attrs:{to:"/guide/installation-guide.html#configuration"}},[e._v("configured")])],1),e._v(" "),t("li",[e._v("Ensuring that your Test Plan aligns "),t("a",{attrs:{href:"#the-replay-is-not-consistent-with-the-recording"}},[e._v("consistently with the recording")]),e._v(".")])]),e._v(" "),t("p",[e._v("Make sure you check aforementioned point and the following sections before opening a "),t("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("new issue"),t("OutboundLink")],1),e._v(" in the repository.")]),e._v(" "),t("h2",{attrs:{id:"common-issues-and-solutions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#common-issues-and-solutions"}},[e._v("#")]),e._v(" Common issues and solutions")]),e._v(" "),t("p",[e._v("We will assume that you have already reviewed the previously mentioned guides and that you have a basic understanding of how the plugin works.")]),e._v(" "),t("h3",{attrs:{id:"my-correlation-rules-are-not-being-applied"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#my-correlation-rules-are-not-being-applied"}},[e._v("#")]),e._v(" My correlation rules are not being applied")]),e._v(" "),t("p",[e._v("If your correlation rules aren't being applied, it's likely that they aren't matching. This mismatch can occur due to various reasons, but the most prevalent ones include:")]),e._v(" "),t("ul",[t("li",[e._v("The Regex for the Extractor doesn't match the value you aim to correlate.")]),e._v(" "),t("li",[e._v("The Regex for the Replacement doesn't match the request.")]),e._v(" "),t("li",[e._v("The Regex for the Replacement matches the value, but the extracted value isn't what you anticipated.")]),e._v(" "),t("li",[e._v("Interference from other third-party plugins affecting the behavior of your plugin.")])]),e._v(" "),t("p",[e._v("If, after reviewing the previous reasons, you still can't find the root cause of the issue, we recommend you:")]),e._v(" "),t("ul",[t("li",[e._v("Review if your issues was already "),t("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("reported"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/issues?q=is%3Aissue+is%3Aclosed",target:"_blank",rel:"noopener noreferrer"}},[e._v("solved"),t("OutboundLink")],1),e._v(" in our GitHub's repository.")]),e._v(" "),t("li",[e._v("For Local Repository Templates, initiate a "),t("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("new issue"),t("OutboundLink")],1),e._v(" in the GitHub's repository.")]),e._v(" "),t("li",[e._v("For BlazeMeter Cloud Templates, please reach out to "),t("a",{attrs:{href:"https://guide.blazemeter.com/hc/en-us/requests/new",target:"_blank",rel:"noopener noreferrer"}},[e._v("BlazeMeter Support"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"debugging-tips"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#debugging-tips"}},[e._v("#")]),e._v(" Debugging tips")]),e._v(" "),t("p",[e._v("In general, we recommend always using the JMeter Template (not to be confused with Correlation Templates) for the Plugin to do all your recordings since we have added all the necessary elements, preconfigured, to make the recording process as easy as possible. This template also has all the required elements in the correct order and in the right places so that the information is not only shown correctly but can also be used in the debugging process.")]),e._v(" "),t("p",[e._v("The most common debugging tips are:")]),e._v(" "),t("ul",[t("li",[e._v("Enable the Debug Post processor element when doing the replay as it will show the variables in JMeter by the moment the replay reaches that particular step.")]),e._v(" "),t("li",[e._v("Always review the state of the value in both the recording and the replay. It is pretty common that the value is not being displayed correctly in the rendered view in JMeter (due to the encoding of the value).")]),e._v(" "),t("li",[e._v("Use the Raw Display of the values in the view result tree. It is pretty common that, when using other rendering of the results in JMeter, the value is shown in a different manner than its real state, making it difficult to debug.")]),e._v(" "),t("li",[e._v("Keep the Test Plan as clean as possible. Always try to filter the requests that are not needed (such as fonts, styles, telemetry, google ads, etc.) as they only add noise to the debugging process.")]),e._v(" "),t("li",[e._v("Alternatively, the opposite is also possible: add all the elements to the Test Plan, in cases where you might end up filtering requests that could contain important information for the correlation. This does not occur that often with the default filters added to the template, but if you find yourself simply unable to locate a value (neither in the recording nor the replay), it could be possible that it was filtered.")])]),e._v(" "),t("h2",{attrs:{id:"how-to-properly-report-an-issue"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-properly-report-an-issue"}},[e._v("#")]),e._v(" How to properly report an issue")]),e._v(" "),t("p",[e._v("If by the end of the debugging process you are still not able to find the root cause of the issue, you can always\nrequest help. We encourage you ask for help in the following ways:")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Prepare the information following the steps in the next section")])]),e._v(" "),t("li",[e._v("Contact the BlazeMeter team for proper support and guidance.")]),e._v(" "),t("li",[e._v("Alternatively, you can create an issue in the "),t("a",{attrs:{href:"https://github.com/Blazemeter/CorrelationRecorder/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub repository"),t("OutboundLink")],1),e._v(" of the plugin, and get assistance by the Open source community.")])]),e._v(" "),t("h3",{attrs:{id:"how-to-prepare-the-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-prepare-the-information"}},[e._v("#")]),e._v(" How to prepare the information")]),e._v(" "),t("p",[e._v("In order to properly report an issue, we need to have as much information as possible. This is why we encourage you to\nfollow the next steps:")]),e._v(" "),t("h4",{attrs:{id:"gather-system-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gather-system-information"}},[e._v("#")]),e._v(" Gather system information")]),e._v(" "),t("p",[e._v("Make sure to include relevant information about your system and environment, such as:")]),e._v(" "),t("p",[e._v("Operating system (e.g. Windows, macOS, Linux)\nBrowser and version (if applicable)\nJava version (if applicable)\nOther relevant software versions")]),e._v(" "),t("h4",{attrs:{id:"describe-the-issue"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#describe-the-issue"}},[e._v("#")]),e._v(" Describe the issue")]),e._v(" "),t("p",[e._v("Provide a clear and concise description of the issue you are experiencing. Include any error messages or unexpected behavior that you have observed.")]),e._v(" "),t("h4",{attrs:{id:"steps-to-reproduce"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#steps-to-reproduce"}},[e._v("#")]),e._v(" Steps to reproduce")]),e._v(" "),t("p",[e._v("Provide a step-by-step guide to reproduce the issue. Include any relevant information, such as the test scenario you were running, the specific action you were performing, or the data you were using.")]),e._v(" "),t("h4",{attrs:{id:"expected-behavior"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#expected-behavior"}},[e._v("#")]),e._v(" Expected behavior")]),e._v(" "),t("p",[e._v("Describe what you expected to happen when performing the steps outlined in the previous section.")]),e._v(" "),t("h4",{attrs:{id:"actual-behavior"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#actual-behavior"}},[e._v("#")]),e._v(" Actual behavior")]),e._v(" "),t("p",[e._v("Describe what actually happened when performing the steps outlined in the previous section.")]),e._v(" "),t("h4",{attrs:{id:"additional-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-information"}},[e._v("#")]),e._v(" Additional information")]),e._v(" "),t("p",[e._v("Include any additional information that you think might be relevant or helpful in diagnosing the issue. This could include screenshots, log files, or any other relevant details.")]),e._v(" "),t("p",[e._v("By following these steps and providing as much detail as possible, you can help ensure that your issue is properly diagnosed and resolved.")]),e._v(" "),t("h2",{attrs:{id:"guides"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#guides"}},[e._v("#")]),e._v(" Guides")]),e._v(" "),t("h3",{attrs:{id:"checking-your-jmeter-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#checking-your-jmeter-configuration"}},[e._v("#")]),e._v(" Checking your JMeter configuration")]),e._v(" "),t("p",[e._v("One of the many reason as why the Templates or Rules do not work is because the plugin is not properly configured. This means that the plugin might be missing critical configuration in order to work properly.")]),e._v(" "),t("p",[e._v("Make sure you have followed the instructions in the "),t("RouterLink",{attrs:{to:"/guide/installation-guide.html"}},[e._v("Installation Guide")]),e._v(" and the "),t("RouterLink",{attrs:{to:"/guide/installation-guide.html#configuration"}},[e._v("Configuration Guide")]),e._v(" in order to properly configure the plugin.")],1),e._v(" "),t("h3",{attrs:{id:"checking-your-test-plan-for-consistency"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#checking-your-test-plan-for-consistency"}},[e._v("#")]),e._v(" Checking your Test Plan for consistency")]),e._v(" "),t("p",[e._v("One of the many reason as why the Templates or Rules do not work is because the Test Plan is not consistent. This means that the Test Plan is not being executed in the same way as it was recorded.")]),e._v(" "),t("p",[e._v("This can happen for a variety of reasons, but the most common ones are:")]),e._v(" "),t("ul",[t("li",[e._v("The Test Plan's elements is not being executed in the same order as it was recorded.")]),e._v(" "),t("li",[e._v("The Test Plan is missing elements that were present in the recording.")]),e._v(" "),t("li",[e._v("The Test Plan has elements that are disabled and are relevant in the recording.")])]),e._v(" "),t("h3",{attrs:{id:"checking-the-server-responses"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#checking-the-server-responses"}},[e._v("#")]),e._v(" Checking the server responses")]),e._v(" "),t("p",[e._v("Another common reason as why the Templates or Rules do not work is because the responses from the server are totally different from the recording. This means that the server is not responding with the same values as it was recorded.")]),e._v(" "),t("p",[e._v("This can happen for a variety of reasons, but the most common ones are:")]),e._v(" "),t("ul",[t("li",[e._v("The server returns a different response due to:\n"),t("ul",[t("li",[e._v("previous requests not being properly correlated.")]),e._v(" "),t("li",[e._v("the Test Plan not being consistent.")]),e._v(" "),t("li",[e._v("Additional configuration's required to run the Test Plan.")])])]),e._v(" "),t("li",[e._v("The server needs Javascript to be executed in order to return the correct response.")])]),e._v(" "),t("h2",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h3",{attrs:{id:"the-value-that-i-need-to-correlate-does-not-appear-in-the-tree-view"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-value-that-i-need-to-correlate-does-not-appear-in-the-tree-view"}},[e._v("#")]),e._v(" The value that I need to Correlate does not appear in the Tree View")]),e._v(" "),t("p",[e._v("This is a pretty common issue that can affect the capabilities of you or the plugin to correlate a value.")]),e._v(" "),t("p",[e._v("The most common reasons are:")]),e._v(" "),t("ol",[t("li",[e._v("Cookies and cached values are not being cleared before recording.")]),e._v(" "),t("li",[e._v("Requests are being filtered on recording.")])]),e._v(" "),t("p",[e._v("Can these be fixed? Yes, they can. Here is how:")]),e._v(" "),t("h4",{attrs:{id:"cookies-and-cached-values-are-not-being-cleared-before-recording"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cookies-and-cached-values-are-not-being-cleared-before-recording"}},[e._v("#")]),e._v(" Cookies and cached values are not being cleared before recording")]),e._v(" "),t("p",[e._v("The short recommendation for this problem is: "),t("strong",[e._v("Always clear your cookies and cached values before recording")])]),e._v(" "),t("p",[t("strong",[e._v("Explanation:")])]),e._v(" "),t("p",[e._v("If your browser has "),t("strong",[e._v("cached values")]),e._v(" or "),t("strong",[e._v("cookies")]),e._v(" from previous sessions, it is possible that the value you are trying\nto correlate "),t("strong",[e._v("is not being sent to JMeter")]),e._v(" from the server (because your browser already has the value stored and\nuse it directly).")]),e._v(" "),t("p",[e._v("This is why we always "),t("strong",[e._v("recommend")]),e._v(" to "),t("em",[e._v("clear your cookies and cached values before recording")]),e._v(" or "),t("em",[e._v("make a new Incognito\nsession in your browser")]),e._v(" each time you record.")]),e._v(" "),t("h4",{attrs:{id:"requests-are-being-filtered-on-recording"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requests-are-being-filtered-on-recording"}},[e._v("#")]),e._v(" Requests are being filtered on recording")]),e._v(" "),t("p",[e._v("If the Request are being filtered on recording, it is possible that the server is sending the request to JMeter,\nbut it is not being stored since it matches the filtering configurations.")]),e._v(" "),t("p",[e._v("By default, these filtered request won't appear in the Recording's View Result tree. However, you can disable this\nbehavior and retry the recording to ensure this is the problem.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[t("strong",[e._v("Note:")]),e._v(" Only use this for debugging purposes since the plugin can misbehave if there are inconsistencies between the recorded elements and the requests that are stored in the View Result Tree.")]),e._v(" "),t("p",[e._v("Along the possible issues this can cause, the most common ones are:")]),e._v(" "),t("ul",[t("li",[e._v("The plugin will identify values in requests that is not part of the Test Plan and will make incorrect suggestions. This will give the impression of a value being correlated when it is not.")]),e._v(" "),t("li",[e._v("The plugin will identify the appearance of a value more times than it should. This will give the impression of a value being more important than it actually is.")]),e._v(" "),t("li",[e._v("The analysis (either by Templates or by Automatic detection) will take longer than usual since it will have to go through all the requests in the View Result Tree, even the ones that are not part of the Test Plan.")])])]),e._v(" "),t("p",[e._v("Before jumping into conclusions, let's test the hypothesis that the request is being filtered.")]),e._v(" "),t("p",[t("strong",[e._v("Check if the request appears in the Recording JTL:")])]),e._v(" "),t("ol",[t("li",[e._v("Go to your Test Plan")]),e._v(" "),t("li",[e._v('Click in the "bzm - Auto Correlation Recorder" element')]),e._v(" "),t("li",[e._v('Click the "View Results Tree" element')])]),e._v(" "),t("p",[e._v("Either manually review the list of elements or use the search field to find the request you are looking for.")]),e._v(" "),t("p",[e._v("If the request does not appear in the recording JTL, it might have been filtered.\nIf the request is present in the recording JTL, it was not filtered.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("If the request is present in the Recording JTL but the name appears between brackets ([]), it means that the request was filtered, and you have the notify children option enabled.")])]),e._v(" "),t("p",[t("strong",[e._v("Disable the filtering of requests in the Recording JTL:")]),e._v("\nIf you validated that the request is being filtered, you can disable the filtering of requests in the Recording JTL by following these steps:")]),e._v(" "),t("ol",[t("li",[e._v("Go to the Request filtering tab (Test Plan > bzm - Auto Correlation Recorder > Requests Filtering\ntab).")]),e._v(" "),t("li",[e._v('Check the "Notify Child Listeners of filtered samplers" option at the bottom of the\nelement in the "Notify Child Listeners of filtered samplers" section.')]),e._v(" "),t("li",[e._v("Clear the recording (Test Plan > Recording Controller > Clear all the recorded samples).")]),e._v(" "),t("li",[e._v("Clear the Recording JTL (Test Plan > bzm - Auto Correlation Recorder > View Results Tree >\nRight Click > Clear).")]),e._v(" "),t("li",[e._v("Record again.")])]),e._v(" "),t("p",[e._v("Now, when you check the Recording's View Result Tree, you should see all the requests that are being sent to JMeter.\nThe ones that are being filtered will appear between brackets ([]), while the ones that are not being filtered will\nappear normally (without the wrapping brackets).")]),e._v(" "),t("p",[e._v("Just like the previous step, you can either manually review the list of elements or use the search field to find the\nrequest you are looking for.")]),e._v(" "),t("p",[e._v("If you confirmed that the request is being filtered, you might need to review the filtering configuration to ensure\nthat the request is not being filtered.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[t("strong",[e._v("Note:")]),e._v(' You will feel tempted to leave the "Notify Child Listeners of filtered samplers" option enabled. However, this is not recommended since it can cause the plugin to misbehave.\nLikewise, we highly encourage you to fine tune the filtering configuration to ensure that the request is not being filtered rather than removing the filtering altogether. Having extra requests in the Recording will only make the analysis slower and suggest values that are not relevant or should not be correlated.')])]),e._v(" "),t("h2",{attrs:{id:"your-regular-expression-is-not-matching-the-value-you-are-trying-to-correlate"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#your-regular-expression-is-not-matching-the-value-you-are-trying-to-correlate"}},[e._v("#")]),e._v(" Your regular expression is not matching the value you are trying to correlate")]),e._v(" "),t("p",[e._v("More often than not, the regular expression that you are using to correlate a value is not matching the value you are\ntrying to correlate.")]),e._v(" "),t("p",[e._v("Depending on which part of the Correlation Rule you are configuring or testing, you might need to use a different\nmechanism to validate that the regular expression is matching the value you are trying to correlate.")]),e._v(" "),t("h3",{attrs:{id:"for-extraction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#for-extraction"}},[e._v("#")]),e._v(" For Extraction")]),e._v(" "),t("p",[e._v("You can test your Regex inside JMeter by going into your Recording's View Result Tree do one of the following:")]),e._v(" "),t("ol",[t("li",[e._v("Search by Regular exp.")]),e._v(" "),t("li",[e._v('Use the "RegExp Tester" view.')])]),e._v(" "),t("h3",{attrs:{id:"for-replacement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#for-replacement"}},[e._v("#")]),e._v(" For Replacement")]),e._v(" "),t("p",[e._v("By default, the Plugin will concatenate both the "),t("code",[e._v("name of the argument")]),e._v(" and "),t("code",[e._v("value")]),e._v(" with "),t("code",[e._v(":")]),e._v(", when evaluating the replacement.")]),e._v(" "),t("p",[e._v("For instance:\nIf the value you want to correlate appears in the HTTP Sampler as "),t("code",[e._v("wpnonce")]),e._v(" (in name's column) and "),t("code",[e._v("123ABC")]),e._v(" (in value's column), when the plugin tries to match the Regex, it will do it against "),t("code",[e._v("wpnonce: 123ABC")]),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Even if your Regex matches the value you are trying to correlate, in the request body or headers, you still need to make sure that the Extractor effectively extracted the value you are trying to correlate.")])]),e._v(" "),t("h2",{attrs:{id:"how-to-confirm-the-value-is-being-extracted-correctly"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-confirm-the-value-is-being-extracted-correctly"}},[e._v("#")]),e._v(" How to confirm the value is being extracted correctly")]),e._v(" "),t("p",[e._v('If you are not sure if the value is being extracted correctly, you can use the "Debug Post-Processor" to confirm it.')]),e._v(" "),t("p",[e._v("To do this, you need to:")]),e._v(" "),t("ol",[t("li",[e._v('Add a "Debug Post-Processor" to your Test Plan.')]),e._v(" "),t("li",[e._v('Add a "View Results Tree" element to your Test Plan.')]),e._v(" "),t("li",[e._v("Replay the Test Plan")])]),e._v(" "),t("p",[e._v("You will see that now every request will have a child element inside them in the View Result Tree. Inside this child element, in the Response Body tab, you will see all the JMeter variables and their respective values during the replay in that request.")]),e._v(" "),t("p",[e._v("If your Regex Extractor is located inside the Request #1, the value will appear (or will be available) from the Request #2 onwards.")]),e._v(" "),t("p",[e._v("If the variable "),t("strong",[e._v("is not present")]),e._v(" in the Debug Sampler, it means that the "),t("strong",[e._v("regex is not matching")]),e._v(" any value in the recording until that point and that "),t("strong",[e._v("you don't have a default value assigned to it")]),e._v(".\nIf the variable "),t("strong",[e._v("is present")]),e._v(" but the "),t("strong",[e._v('value is "NOT_FOUND"')]),e._v(", it means that the regex "),t("strong",[e._v("is not matching")]),e._v(" any value.\nIf the variable "),t("strong",[e._v("is present")]),e._v(" but the value "),t("strong",[e._v("is not the one that you want")]),e._v(", it means "),t("strong",[e._v("you need to improve")]),e._v(" either "),t("strong",[e._v("the Regex")]),e._v(" or "),t("strong",[e._v("the configuration")]),e._v(" of the Extractor.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/44.0e37abe4.js b/assets/js/44.0e37abe4.js new file mode 100644 index 0000000..a01ae25 --- /dev/null +++ b/assets/js/44.0e37abe4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{359:function(t,n,s){"use strict";s.r(n);var e=s(14),o=Object(e.a)({},(function(){return(0,this._self._c)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/5.b32ba761.js b/assets/js/5.b32ba761.js new file mode 100644 index 0000000..8dd6194 --- /dev/null +++ b/assets/js/5.b32ba761.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{307:function(t,e,a){},321:function(t,e,a){"use strict";a(307)},334:function(t,e,a){"use strict";a.r(e);var s={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}},mounted(){this.$parent&&this.$parent.loadTabs&&this.$parent.loadTabs()}},i=(a(321),a(14)),n=Object(i.a)(s,(function(){return(0,this._self._c)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"759a7d02",null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/6.01aebba6.js b/assets/js/6.01aebba6.js new file mode 100644 index 0000000..1253f16 --- /dev/null +++ b/assets/js/6.01aebba6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{308:function(e,t,a){},322:function(e,t,a){"use strict";a(308)},335:function(e,t,a){"use strict";a.r(t);var o={name:"CodeGroup",data:()=>({codeTabs:[],activeCodeTabIndex:-1}),watch:{activeCodeTabIndex(e){this.activateCodeTab(e)}},mounted(){this.loadTabs()},methods:{changeCodeTab(e){this.activeCodeTabIndex=e},loadTabs(){this.codeTabs=(this.$slots.default||[]).filter(e=>Boolean(e.componentOptions)).map((e,t)=>(""===e.componentOptions.propsData.active&&(this.activeCodeTabIndex=t),{title:e.componentOptions.propsData.title,elm:e.elm})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0),this.activateCodeTab(0)},activateCodeTab(e){this.codeTabs.forEach(e=>{e.elm&&e.elm.classList.remove("theme-code-block__active")}),this.codeTabs[e].elm&&this.codeTabs[e].elm.classList.add("theme-code-block__active")}}},s=(a(322),a(14)),c=Object(s.a)(o,(function(){var e=this,t=e._self._c;return t("ClientOnly",[t("div",{staticClass:"theme-code-group"},[t("div",{staticClass:"theme-code-group__nav"},[t("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(a,o){return t("li",{key:a.title,staticClass:"theme-code-group__li"},[t("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":o===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(o)}}},[e._v("\n "+e._s(a.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?t("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)])}),[],!1,null,"deefee04",null);t.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/7.ea74cf62.js b/assets/js/7.ea74cf62.js new file mode 100644 index 0000000..0f78f6f --- /dev/null +++ b/assets/js/7.ea74cf62.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{256:function(t,e,a){},271:function(t,e,a){"use strict";a(256)},309:function(t,e,a){"use strict";a.r(e);var s={name:"Home",components:{NavLink:a(241).default},computed:{data(){return this.$page.frontmatter},actionLink(){return{link:this.data.actionLink,text:this.data.actionText}}}},i=(a(271),a(14)),n=Object(i.a)(s,(function(){var t=this,e=t._self._c;return e("main",{staticClass:"home",attrs:{"aria-labelledby":null!==t.data.heroText?"main-title":null}},[e("header",{staticClass:"hero"},[t.data.heroImage?e("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:t.data.heroAlt||"hero"}}):t._e(),t._v(" "),t._m(0),t._v(" "),t.data.actionText&&t.data.actionLink?e("p",{staticClass:"action"},[e("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?e("div",{staticClass:"features"},t._l(t.data.features,(function(a,s){return e("div",{key:s,staticClass:"feature"},[e("h2",[t._v(t._s(a.title))]),t._v(" "),e("p",[t._v(t._s(a.details))])])})),0):t._e(),t._v(" "),e("Content",{staticClass:"theme-default-content custom"}),t._v(" "),t._m(1)],1)}),[function(){var t=this._self._c;return t("p",{staticClass:"description"},[this._v("\n Effortlessly handle dynamic values in "),t("a",{attrs:{href:"https://jmeter.apache.org/"}},[this._v("JMeter")]),this._v(" with the Correlation recorder plugin.\n ")])},function(){var t=this._self._c;return t("div",{staticClass:"footer"},[this._v("\n Made by "),t("a",{attrs:{href:"https://guide.blazemeter.com/hc/en-us"}},[this._v("Blazemeter")]),this._v("️ | Apache 2.0 Licensed | Powered by "),t("a",{attrs:{href:"https://vuepress.vuejs.org/"}},[this._v("Vuepress")])])}],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/8.faaa76af.js b/assets/js/8.faaa76af.js new file mode 100644 index 0000000..9c14acf --- /dev/null +++ b/assets/js/8.faaa76af.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{336:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(14),i=Object(h.a)(n,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-default-content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/app.eda5ff09.js b/assets/js/app.eda5ff09.js new file mode 100644 index 0000000..3701776 --- /dev/null +++ b/assets/js/app.eda5ff09.js @@ -0,0 +1,16 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],u=e[1],c=e[2],f=0,p=[];f
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var u=n.render(!e),c=u.querySelector(r.barSelector),l=r.speed,f=r.easing;return u.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,l,f)),1===t?(s(u,{transition:"none",opacity:1}),u.offsetWidth,setTimeout((function(){s(u,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),l)}),l)):setTimeout(e,l)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),u=t?"-100":i(n.status||0),l=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+u+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),l!=document.body&&c(l,"nprogress-custom-parent"),l.appendChild(e),e},n.remove=function(){l(document.documentElement,"nprogress-busy"),l(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function u(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function c(t,e){var n=f(t),r=n+e;u(n,e)||(t.className=r.substring(1))}function l(t,e){var n,r=f(t);u(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e,n){"use strict";var r=n(2),o=n(45).f,i=n(12),a=n(92),s=n(32),u=n(61),c=n(120);t.exports=function(t,e){var n,l,f,p,d,h=t.target,v=t.global,g=t.stat;if(n=v?r:g?r[h]||s(h,{}):(r[h]||{}).prototype)for(l in e){if(p=e[l],f=t.dontCallGetSet?(d=o(n,l))&&d.value:n[l],!c(v?l:h+(g?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;u(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),a(n,l,p,t)}}},function(t,e,n){"use strict";var r=n(25),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(t,e,n){"use strict";var r=n(3);t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},function(t,e,n){"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){"use strict";var r=n(46),o=n(47);t.exports=function(t){return r(o(t))}},function(t,e,n){"use strict";var r=n(2),o=n(0),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},function(t,e,n){"use strict";var r=n(0),o=n(102),i=TypeError;t.exports=function(t){if(r(t))return t;throw i(o(t)+" is not a function")}},function(t,e,n){"use strict";var r=n(2),o=n(56),i=n(7),a=n(58),s=n(54),u=n(53),c=r.Symbol,l=o("wks"),f=u?c.for||c:c&&c.withoutSetter||a;t.exports=function(t){return i(l,t)||(l[t]=s&&i(c,t)?c[t]:f("Symbol."+t)),l[t]}},function(t,e,n){"use strict";var r=n(2),o=n(32),i=r["__core-js_shared__"]||o("__core-js_shared__",{});t.exports=i},function(t,e,n){"use strict";var r=n(2),o=Object.defineProperty;t.exports=function(t,e){try{o(r,t,{value:e,configurable:!0,writable:!0})}catch(n){r[t]=e}return e}},function(t,e,n){"use strict";var r=n(47),o=Object;t.exports=function(t){return o(r(t))}},function(t,e,n){"use strict";var r=n(8),o=String,i=TypeError;t.exports=function(t){if(r(t))return t;throw i(o(t)+" is not an object")}},function(t,e,n){"use strict";var r=n(117);t.exports=function(t){return r(t.length)}},function(t,e,n){var r=n(143),o=n(10),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=u},function(t,e,n){var r=n(9)(n(6),"Map");t.exports=r},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(163),o=n(170),i=n(172),a=n(173),s=n(174);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){var r=n(4),o=n(43),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function(t,e){if(r(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!o(t))||(a.test(t)||!i.test(t)||null!=e&&t in Object(e))}},function(t,e,n){var r=n(11),o=n(10);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},function(t,e){t.exports=function(t){return t}},function(t,e,n){"use strict";var r=n(5),o=n(24),i=n(98),a=n(26),s=n(27),u=n(49),c=n(7),l=n(59),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=s(t),e=u(e),l)try{return f(t,e)}catch(t){}if(c(t,e))return a(!o(i.f,t,e),t[e])}},function(t,e,n){"use strict";var r=n(1),o=n(3),i=n(16),a=Object,s=r("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?s(t,""):a(t)}:a},function(t,e,n){"use strict";var r=n(48),o=TypeError;t.exports=function(t){if(r(t))throw o("Can't call method on "+t);return t}},function(t,e,n){"use strict";t.exports=function(t){return null==t}},function(t,e,n){"use strict";var r=n(99),o=n(51);t.exports=function(t){var e=r(t,"string");return o(e)?e:e+""}},function(t,e,n){"use strict";var r="object"==typeof document&&document.all,o=void 0===r&&void 0!==r;t.exports={all:r,IS_HTMLDDA:o}},function(t,e,n){"use strict";var r=n(28),o=n(0),i=n(52),a=n(53),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=r("Symbol");return o(e)&&i(e.prototype,s(t))}},function(t,e,n){"use strict";var r=n(1);t.exports=r({}.isPrototypeOf)},function(t,e,n){"use strict";var r=n(54);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,e,n){"use strict";var r=n(55),o=n(3),i=n(2).String;t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol();return!i(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(t,e,n){"use strict";var r,o,i=n(2),a=n(100),s=i.process,u=i.Deno,c=s&&s.versions||u&&u.version,l=c&&c.v8;l&&(o=(r=l.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),t.exports=o},function(t,e,n){"use strict";var r=n(57),o=n(31);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.32.0",mode:r?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.32.0/LICENSE",source:"https://github.com/zloirock/core-js"})},function(t,e,n){"use strict";t.exports=!1},function(t,e,n){"use strict";var r=n(1),o=0,i=Math.random(),a=r(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+i,36)}},function(t,e,n){"use strict";var r=n(5),o=n(3),i=n(104);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){"use strict";t.exports={}},function(t,e,n){"use strict";var r=n(7),o=n(111),i=n(45),a=n(15);t.exports=function(t,e,n){for(var s=o(e),u=a.f,c=i.f,l=0;ll))return!1;var p=u.get(t),d=u.get(e);if(p&&d)return p==e&&d==t;var h=-1,v=!0,g=2&n?new r:void 0;for(u.set(t,e),u.set(e,t);++h-1&&t%1==0&&t]/;t.exports=function(t){var e,n=""+t,o=r.exec(n);if(!o)return n;var i="",a=0,s=0;for(a=o.index;a=e||n<0||g&&t-c>=i}function x(){var t=d();if(_(t))return w(t);s=setTimeout(x,function(t){var n=e-(t-u);return g?p(n,i-(t-c)):n}(t))}function w(t){return s=void 0,m&&r?y(t):(r=o=void 0,a)}function C(){var t=d(),n=_(t);if(r=arguments,o=this,u=t,n){if(void 0===s)return b(u);if(g)return s=setTimeout(x,e),y(u)}return void 0===s&&(s=setTimeout(x,e)),a}return e=v(e)||0,h(n)&&(l=!!n.leading,i=(g="maxWait"in n)?f(v(n.maxWait)||0,e):i,m="trailing"in n?!!n.trailing:m),C.cancel=function(){void 0!==s&&clearTimeout(s),c=0,r=u=o=s=void 0},C.flush=function(){return void 0===s?a:w(d())},C}},function(t,e,n){"use strict";var r=n(23),o=n(33),i=n(35),a=n(124),s=n(126);r({target:"Array",proto:!0,arity:1,forced:n(3)((function(){return 4294967297!==[].push.call({length:4294967296},1)}))||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(t){return t instanceof TypeError}}()},{push:function(t){var e=o(this),n=i(e),r=arguments.length;s(n+r);for(var u=0;u79&&a<83||!i("reduce")},{reduce:function(t){var e=arguments.length;return o(this,t,e,e>1?arguments[1]:void 0)}})},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},function(t,e,n){"use strict";var r=n(24),o=n(8),i=n(51),a=n(101),s=n(103),u=n(30),c=TypeError,l=u("toPrimitive");t.exports=function(t,e){if(!o(t)||i(t))return t;var n,u=a(t,l);if(u){if(void 0===e&&(e="default"),n=r(u,t,e),!o(n)||i(n))return n;throw c("Can't convert object to primitive value")}return void 0===e&&(e="number"),s(t,e)}},function(t,e,n){"use strict";t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},function(t,e,n){"use strict";var r=n(29),o=n(48);t.exports=function(t,e){var n=t[e];return o(n)?void 0:r(n)}},function(t,e,n){"use strict";var r=String;t.exports=function(t){try{return r(t)}catch(t){return"Object"}}},function(t,e,n){"use strict";var r=n(24),o=n(0),i=n(8),a=TypeError;t.exports=function(t,e){var n,s;if("string"===e&&o(n=t.toString)&&!i(s=r(n,t)))return s;if(o(n=t.valueOf)&&!i(s=r(n,t)))return s;if("string"!==e&&o(n=t.toString)&&!i(s=r(n,t)))return s;throw a("Can't convert object to primitive value")}},function(t,e,n){"use strict";var r=n(2),o=n(8),i=r.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},function(t,e,n){"use strict";var r=n(5),o=n(3);t.exports=r&&o((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},function(t,e,n){"use strict";var r=n(5),o=n(7),i=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,s=o(i,"name"),u=s&&"something"===function(){}.name,c=s&&(!r||r&&a(i,"name").configurable);t.exports={EXISTS:s,PROPER:u,CONFIGURABLE:c}},function(t,e,n){"use strict";var r=n(1),o=n(0),i=n(31),a=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(t){return a(t)}),t.exports=i.inspectSource},function(t,e,n){"use strict";var r,o,i,a=n(109),s=n(2),u=n(8),c=n(12),l=n(7),f=n(31),p=n(110),d=n(60),h=s.TypeError,v=s.WeakMap;if(a||f.state){var g=f.state||(f.state=new v);g.get=g.get,g.has=g.has,g.set=g.set,r=function(t,e){if(g.has(t))throw h("Object already initialized");return e.facade=t,g.set(t,e),e},o=function(t){return g.get(t)||{}},i=function(t){return g.has(t)}}else{var m=p("state");d[m]=!0,r=function(t,e){if(l(t,m))throw h("Object already initialized");return e.facade=t,c(t,m,e),e},o=function(t){return l(t,m)?t[m]:{}},i=function(t){return l(t,m)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!u(e)||(n=o(e)).type!==t)throw h("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){"use strict";var r=n(2),o=n(0),i=r.WeakMap;t.exports=o(i)&&/native code/.test(String(i))},function(t,e,n){"use strict";var r=n(56),o=n(58),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e,n){"use strict";var r=n(28),o=n(1),i=n(112),a=n(119),s=n(34),u=o([].concat);t.exports=r("Reflect","ownKeys")||function(t){var e=i.f(s(t)),n=a.f;return n?u(e,n(t)):e}},function(t,e,n){"use strict";var r=n(113),o=n(118).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e,n){"use strict";var r=n(1),o=n(7),i=n(27),a=n(114).indexOf,s=n(60),u=r([].push);t.exports=function(t,e){var n,r=i(t),c=0,l=[];for(n in r)!o(s,n)&&o(r,n)&&u(l,n);for(;e.length>c;)o(r,n=e[c++])&&(~a(l,n)||u(l,n));return l}},function(t,e,n){"use strict";var r=n(27),o=n(115),i=n(35),a=function(t){return function(e,n,a){var s,u=r(e),c=i(u),l=o(a,c);if(t&&n!=n){for(;c>l;)if((s=u[l++])!=s)return!0}else for(;c>l;l++)if((t||l in u)&&u[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,e,n){"use strict";var r=n(62),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},function(t,e,n){"use strict";var r=Math.ceil,o=Math.floor;t.exports=Math.trunc||function(t){var e=+t;return(e>0?o:r)(e)}},function(t,e,n){"use strict";var r=n(62),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,n){"use strict";e.f=Object.getOwnPropertySymbols},function(t,e,n){"use strict";var r=n(3),o=n(0),i=/#|\.prototype\./,a=function(t,e){var n=u[s(t)];return n==l||n!=c&&(o(e)?r(e):!!e)},s=a.normalize=function(t){return String(t).replace(i,".").toLowerCase()},u=a.data={},c=a.NATIVE="N",l=a.POLYFILL="P";t.exports=a},function(t,e,n){"use strict";var r=n(29),o=n(33),i=n(46),a=n(35),s=TypeError,u=function(t){return function(e,n,u,c){r(n);var l=o(e),f=i(l),p=a(l),d=t?p-1:0,h=t?-1:1;if(u<2)for(;;){if(d in f){c=f[d],d+=h;break}if(d+=h,t?d<0:p<=d)throw s("Reduce of empty array with no initial value")}for(;t?d>=0:p>d;d+=h)d in f&&(c=n(c,f[d],d,l));return c}};t.exports={left:u(!1),right:u(!0)}},function(t,e,n){"use strict";var r=n(3);t.exports=function(t,e){var n=[][t];return!!n&&r((function(){n.call(null,e||function(){return 1},1)}))}},function(t,e,n){"use strict";var r=n(16);t.exports="undefined"!=typeof process&&"process"==r(process)},function(t,e,n){"use strict";var r=n(5),o=n(125),i=TypeError,a=Object.getOwnPropertyDescriptor,s=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=s?function(t,e){if(o(t)&&!a(t,"length").writable)throw i("Cannot set read only .length");return t.length=e}:function(t,e){return t.length=e}},function(t,e,n){"use strict";var r=n(16);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){"use strict";var r=TypeError;t.exports=function(t){if(t>9007199254740991)throw r("Maximum allowed index exceeded");return t}},function(t,e,n){"use strict";var r=n(23),o=n(2),i=n(128),a=n(129),s=o.WebAssembly,u=7!==Error("e",{cause:7}).cause,c=function(t,e){var n={};n[t]=a(t,e,u),r({global:!0,constructor:!0,arity:1,forced:u},n)},l=function(t,e){if(s&&s[t]){var n={};n[t]=a("WebAssembly."+t,e,u),r({target:"WebAssembly",stat:!0,constructor:!0,arity:1,forced:u},n)}};c("Error",(function(t){return function(e){return i(t,this,arguments)}})),c("EvalError",(function(t){return function(e){return i(t,this,arguments)}})),c("RangeError",(function(t){return function(e){return i(t,this,arguments)}})),c("ReferenceError",(function(t){return function(e){return i(t,this,arguments)}})),c("SyntaxError",(function(t){return function(e){return i(t,this,arguments)}})),c("TypeError",(function(t){return function(e){return i(t,this,arguments)}})),c("URIError",(function(t){return function(e){return i(t,this,arguments)}})),l("CompileError",(function(t){return function(e){return i(t,this,arguments)}})),l("LinkError",(function(t){return function(e){return i(t,this,arguments)}})),l("RuntimeError",(function(t){return function(e){return i(t,this,arguments)}}))},function(t,e,n){"use strict";var r=n(25),o=Function.prototype,i=o.apply,a=o.call;t.exports="object"==typeof Reflect&&Reflect.apply||(r?a.bind(i):function(){return a.apply(i,arguments)})},function(t,e,n){"use strict";var r=n(28),o=n(7),i=n(12),a=n(52),s=n(63),u=n(61),c=n(132),l=n(133),f=n(134),p=n(137),d=n(138),h=n(5),v=n(57);t.exports=function(t,e,n,g){var m=g?2:1,y=t.split("."),b=y[y.length-1],_=r.apply(null,y);if(_){var x=_.prototype;if(!v&&o(x,"cause")&&delete x.cause,!n)return _;var w=r("Error"),C=e((function(t,e){var n=f(g?e:t,void 0),r=g?new _(t):new _;return void 0!==n&&i(r,"message",n),d(r,C,r.stack,2),this&&a(x,this)&&l(r,this,C),arguments.length>m&&p(r,arguments[m]),r}));if(C.prototype=x,"Error"!==b?s?s(C,w):u(C,w,{name:!0}):h&&"stackTraceLimit"in _&&(c(C,_,"stackTraceLimit"),c(C,_,"prepareStackTrace")),u(C,_),!v)try{x.name!==b&&i(x,"name",b),x.constructor=C}catch(t){}return C}}},function(t,e,n){"use strict";var r=n(1),o=n(29);t.exports=function(t,e,n){try{return r(o(Object.getOwnPropertyDescriptor(t,e)[n]))}catch(t){}}},function(t,e,n){"use strict";var r=n(0),o=String,i=TypeError;t.exports=function(t){if("object"==typeof t||r(t))return t;throw i("Can't set "+o(t)+" as a prototype")}},function(t,e,n){"use strict";var r=n(15).f;t.exports=function(t,e,n){n in t||r(t,n,{configurable:!0,get:function(){return e[n]},set:function(t){e[n]=t}})}},function(t,e,n){"use strict";var r=n(0),o=n(8),i=n(63);t.exports=function(t,e,n){var a,s;return i&&r(a=e.constructor)&&a!==n&&o(s=a.prototype)&&s!==n.prototype&&i(t,s),t}},function(t,e,n){"use strict";var r=n(93);t.exports=function(t,e){return void 0===t?arguments.length<2?"":e:r(t)}},function(t,e,n){"use strict";var r=n(136),o=n(0),i=n(16),a=n(30)("toStringTag"),s=Object,u="Arguments"==i(function(){return arguments}());t.exports=r?i:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=s(t),a))?n:u?i(e):"Object"==(r=i(e))&&o(e.callee)?"Arguments":r}},function(t,e,n){"use strict";var r={};r[n(30)("toStringTag")]="z",t.exports="[object z]"===String(r)},function(t,e,n){"use strict";var r=n(8),o=n(12);t.exports=function(t,e){r(e)&&"cause"in e&&o(t,"cause",e.cause)}},function(t,e,n){"use strict";var r=n(12),o=n(139),i=n(140),a=Error.captureStackTrace;t.exports=function(t,e,n,s){i&&(a?a(t,e):r(t,"stack",o(n,s)))}},function(t,e,n){"use strict";var r=n(1),o=Error,i=r("".replace),a=String(o("zxcasd").stack),s=/\n\s*at [^:]*:[^\n]*/,u=s.test(a);t.exports=function(t,e){if(u&&"string"==typeof t&&!o.prepareStackTrace)for(;e--;)t=i(t,s,"");return t}},function(t,e,n){"use strict";var r=n(3),o=n(26);t.exports=!r((function(){var t=Error("a");return!("stack"in t)||(Object.defineProperty(t,"stack",o(1,7)),7!==t.stack)}))},function(t,e,n){var r=n(64),o=n(142);t.exports=function t(e,n,i,a,s){var u=-1,c=e.length;for(i||(i=o),s||(s=[]);++u0&&i(l)?n>1?t(l,n-1,i,a,s):r(s,l):a||(s[s.length]=l)}return s}},function(t,e,n){var r=n(13),o=n(36),i=n(4),a=r?r.isConcatSpreadable:void 0;t.exports=function(t){return i(t)||o(t)||!!(a&&t&&t[a])}},function(t,e,n){var r=n(11),o=n(10);t.exports=function(t){return o(t)&&"[object Arguments]"==r(t)}},function(t,e,n){var r=n(13),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=i.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var o=a.call(t);return r&&(e?t[s]=n:delete t[s]),o}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var r=n(147),o=n(203),i=n(44),a=n(4),s=n(213);t.exports=function(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):r(t):s(t)}},function(t,e,n){var r=n(148),o=n(202),i=n(82);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?i(e[0][0],e[0][1]):function(n){return n===t||r(n,t,e)}}},function(t,e,n){var r=n(66),o=n(70);t.exports=function(t,e,n,i){var a=n.length,s=a,u=!i;if(null==t)return!s;for(t=Object(t);a--;){var c=n[a];if(u&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++a-1}},function(t,e,n){var r=n(18);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var r=n(17);t.exports=function(){this.__data__=new r,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(17),o=n(37),i=n(39);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new i(a)}return n.set(t,e),this.size=n.size,this}},function(t,e,n){var r=n(68),o=n(160),i=n(38),a=n(69),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,f=c.hasOwnProperty,p=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?p:s).test(a(t))}},function(t,e,n){var r,o=n(161),i=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!i&&i in t}},function(t,e,n){var r=n(6)["__core-js_shared__"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var r=n(164),o=n(17),i=n(37);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}},function(t,e,n){var r=n(165),o=n(166),i=n(167),a=n(168),s=n(169);function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var r=n(72),o=n(225),i=n(230),a=n(73),s=n(231),u=n(40);t.exports=function(t,e,n){var c=-1,l=o,f=t.length,p=!0,d=[],h=d;if(n)p=!1,l=i;else if(f>=200){var v=e?null:s(t);if(v)return u(v);p=!1,l=a,h=new r}else h=e?[]:d;t:for(;++c-1}},function(t,e,n){var r=n(227),o=n(228),i=n(229);t.exports=function(t,e,n){return e==e?i(t,e,n):r(t,o,n)}},function(t,e){t.exports=function(t,e,n,r){for(var o=t.length,i=n+(r?1:-1);r?i--:++i=0&&Math.floor(e)===e&&isFinite(t)}function v(t){return a(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function g(t){return null==t?"":Array.isArray(t)||p(t)&&t.toString===f?JSON.stringify(t,null,2):String(t)}function m(t){var e=parseFloat(t);return isNaN(e)?t:e}function y(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(r,1)}}var x=Object.prototype.hasOwnProperty;function w(t,e){return x.call(t,e)}function C(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var O=/-(\w)/g,k=C((function(t){return t.replace(O,(function(t,e){return e?e.toUpperCase():""}))})),$=C((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),j=/\B([A-Z])/g,S=C((function(t){return t.replace(j,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function P(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function T(t,e){for(var n in e)t[n]=e[n];return t}function A(t){for(var e={},n=0;n0,Q=J&&J.indexOf("edge/")>0;J&&J.indexOf("android");var Z=J&&/iphone|ipad|ipod|ios/.test(J);J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J);var tt,et=J&&J.match(/firefox\/(\d+)/),nt={}.watch,rt=!1;if(G)try{var ot={};Object.defineProperty(ot,"passive",{get:function(){rt=!0}}),window.addEventListener("test-passive",null,ot)}catch(t){}var it=function(){return void 0===tt&&(tt=!G&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),tt},at=G&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function st(t){return"function"==typeof t&&/native code/.test(t.toString())}var ut,ct="undefined"!=typeof Symbol&&st(Symbol)&&"undefined"!=typeof Reflect&&st(Reflect.ownKeys);ut="undefined"!=typeof Set&&st(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var lt=null;function ft(t){void 0===t&&(t=null),t||lt&<._scope.off(),lt=t,t&&t._scope.on()}var pt=function(){function t(t,e,n,r,o,i,a,s){this.tag=t,this.data=e,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),dt=function(t){void 0===t&&(t="");var e=new pt;return e.text=t,e.isComment=!0,e};function ht(t){return new pt(void 0,void 0,void 0,String(t))}function vt(t){var e=new pt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}var gt=0,mt=[],yt=function(){function t(){this._pending=!1,this.id=gt++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,mt.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){var e=this.subs.filter((function(t){return t}));for(var n=0,r=e.length;n0&&(Jt((c=t(c,"".concat(n||"","_").concat(r)))[0])&&Jt(f)&&(p[l]=ht(f.text+c[0].text),c.shift()),p.push.apply(p,c)):u(c)?Jt(f)?p[l]=ht(f.text+c):""!==c&&p.push(ht(c)):Jt(c)&&Jt(f)?p[l]=ht(f.text+c.text):(s(e._isVList)&&a(c.tag)&&i(c.key)&&a(n)&&(c.key="__vlist".concat(n,"_").concat(r,"__")),p.push(c)));return p}(t):void 0}function Jt(t){return a(t)&&a(t.text)&&!1===t.isComment}function Xt(t,e){var n,r,i,s,u=null;if(o(t)||"string"==typeof t)for(u=new Array(t.length),n=0,r=t.length;n0,s=e?!!e.$stable:!a,u=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&o&&o!==r&&u===o.$key&&!a&&!o.$hasNormal)return o;for(var c in i={},e)e[c]&&"$"!==c[0]&&(i[c]=ve(t,n,c,e[c]))}else i={};for(var l in n)l in i||(i[l]=ge(n,l));return e&&Object.isExtensible(e)&&(e._normalized=i),H(i,"$stable",s),H(i,"$key",u),H(i,"$hasNormal",a),i}function ve(t,e,n,r){var i=function(){var e=lt;ft(t);var n=arguments.length?r.apply(null,arguments):r({}),i=(n=n&&"object"==typeof n&&!o(n)?[n]:Gt(n))&&n[0];return ft(e),n&&(!i||1===n.length&&i.isComment&&!de(i))?void 0:n};return r.proxy&&Object.defineProperty(e,n,{get:i,enumerable:!0,configurable:!0}),i}function ge(t,e){return function(){return t[e]}}function me(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};H(e,"_v_attr_proxy",!0),ye(e,t.$attrs,r,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||ye(t._listenersProxy={},t.$listeners,r,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||_e(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:E(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return Ut(t,e,n)}))}}}function ye(t,e,n,r,o){var i=!1;for(var a in e)a in t?e[a]!==n[a]&&(i=!0):(i=!0,be(t,a,r,o));for(var a in t)a in e||(i=!0,delete t[a]);return i}function be(t,e,n,r){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[r][e]}})}function _e(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var xe=null;function we(t,e){return(t.__esModule||ct&&"Module"===t[Symbol.toStringTag])&&(t=t.default),l(t)?e.extend(t):t}function Ce(t){if(o(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(un=function(){return cn.now()})}var ln=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function fn(){var t,e;for(sn=un(),on=!0,tn.sort(ln),an=0;anan&&tn[n].id>t.id;)n--;tn.splice(n+1,0,t)}else tn.push(t);rn||(rn=!0,Ne(fn))}}function dn(t,e){if(t){for(var n=Object.create(null),r=ct?Reflect.ownKeys(t):Object.keys(t),o=0;o-1)if(i&&!w(o,"default"))a=!1;else if(""===a||a===S(t)){var u=Mn(String,o.type);(u<0||s-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!d(t)&&t.test(e)}function Xn(t,e){var n=t.cache,r=t.keys,o=t._vnode;for(var i in n){var a=n[i];if(a){var s=a.name;s&&!e(s)&&Yn(n,i,r,o)}}}function Yn(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,_(n,e)}Wn.prototype._init=function(t){var e=this;e._uid=Vn++,e._isVue=!0,e.__v_skip=!0,e._scope=new zt(!0),e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=En(Hn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ge(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=fe(e._renderChildren,o),t.$scopedSlots=n?he(t.$parent,n.data.scopedSlots,t.$slots):r,t._c=function(e,n,r,o){return Oe(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return Oe(t,e,n,r,o,!0)};var i=n&&n.data;Tt(t,"$attrs",i&&i.attrs||r,null,!0),Tt(t,"$listeners",e._parentListeners||r,null,!0)}(e),Ze(e,"beforeCreate",void 0,!1),function(t){var e=dn(t.$options.inject,t);e&&(jt(!1),Object.keys(e).forEach((function(n){Tt(t,n,e[n])})),jt(!0))}(e),Nn(e),function(t){var e=t.$options.provide;if(e){var n=c(e)?e.call(t):e;if(!l(n))return;for(var r=Bt(t),o=ct?Reflect.ownKeys(n):Object.keys(n),i=0;i1?P(n):n;for(var r=P(arguments,1),o='event handler for "'.concat(t,'"'),i=0,a=n.length;iparseInt(this.max)&&Yn(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Yn(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Xn(t,(function(t){return Jn(e,t)}))})),this.$watch("exclude",(function(e){Xn(t,(function(t){return!Jn(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Ce(t),n=e&&e.componentOptions;if(n){var r=Gn(n),o=this.include,i=this.exclude;if(o&&(!r||!Jn(o,r))||i&&r&&Jn(i,r))return e;var a=this.cache,s=this.keys,u=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;a[u]?(e.componentInstance=a[u].componentInstance,_(s,u),s.push(u)):(this.vnodeToCache=e,this.keyToCache=u),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return B}};Object.defineProperty(t,"config",e),t.util={warn:wn,extend:T,mergeOptions:En,defineReactive:Tt},t.set=At,t.delete=Rt,t.nextTick=Ne,t.observable=function(t){return Pt(t),t},t.options=Object.create(null),F.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,T(t.options.components,Zn),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=P(arguments,1);return n.unshift(this),c(t.install)?t.install.apply(t,n):c(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=En(this.options,t),this}}(t),Kn(t),function(t){F.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&p(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&c(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(Wn),Object.defineProperty(Wn.prototype,"$isServer",{get:it}),Object.defineProperty(Wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Wn,"FunctionalRenderContext",{value:hn}),Wn.version="2.7.14";var tr=y("style,class"),er=y("input,textarea,option,select,progress"),nr=y("contenteditable,draggable,spellcheck"),rr=y("events,caret,typing,plaintext-only"),or=y("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),ir="http://www.w3.org/1999/xlink",ar=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},sr=function(t){return ar(t)?t.slice(6,t.length):""},ur=function(t){return null==t||!1===t};function cr(t){for(var e=t.data,n=t,r=t;a(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=lr(r.data,e));for(;a(n=n.parent);)n&&n.data&&(e=lr(e,n.data));return function(t,e){if(a(t)||a(e))return fr(t,pr(e));return""}(e.staticClass,e.class)}function lr(t,e){return{staticClass:fr(t.staticClass,e.staticClass),class:a(t.class)?[t.class,e.class]:e.class}}function fr(t,e){return t?e?t+" "+e:t:e||""}function pr(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?Ir(t,e,n):or(e)?ur(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):nr(e)?t.setAttribute(e,function(t,e){return ur(e)||"false"===e?"false":"contenteditable"===t&&rr(e)?e:"true"}(e,n)):ar(e)?ur(n)?t.removeAttributeNS(ir,sr(e)):t.setAttributeNS(ir,e,n):Ir(t,e,n)}function Ir(t,e,n){if(ur(n))t.removeAttribute(e);else{if(X&&!Y&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Dr={create:Lr,update:Lr};function Nr(t,e){var n=e.elm,r=e.data,o=t.data;if(!(i(r.staticClass)&&i(r.class)&&(i(o)||i(o.staticClass)&&i(o.class)))){var s=cr(e),u=n._transitionClasses;a(u)&&(s=fr(s,pr(u))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Ur,Fr={create:Nr,update:Nr};function zr(t,e,n){var r=Ur;return function o(){var i=e.apply(null,arguments);null!==i&&Vr(t,o,n,r)}}var Br=Pe&&!(et&&Number(et[1])<=53);function qr(t,e,n,r){if(Br){var o=sn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Ur.addEventListener(t,e,rt?{capture:n,passive:r}:n)}function Vr(t,e,n,r){(r||Ur).removeEventListener(t,e._wrapper||e,n)}function Hr(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Ur=e.elm||t.elm,function(t){if(a(t.__r)){var e=X?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}a(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),Ht(n,r,qr,Vr,zr,e.context),Ur=void 0}}var Wr,Kr={create:Hr,update:Hr,destroy:function(t){return Hr(t,Cr)}};function Gr(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,r,o=e.elm,u=t.data.domProps||{},c=e.data.domProps||{};for(n in(a(c.__ob__)||s(c._v_attr_proxy))&&(c=e.data.domProps=T({},c)),u)n in c||(o[n]="");for(n in c){if(r=c[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===u[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=r;var l=i(r)?"":String(r);Jr(o,l)&&(o.value=l)}else if("innerHTML"===n&&vr(o.tagName)&&i(o.innerHTML)){(Wr=Wr||document.createElement("div")).innerHTML="".concat(r,"");for(var f=Wr.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;f.firstChild;)o.appendChild(f.firstChild)}else if(r!==u[n])try{o[n]=r}catch(t){}}}}function Jr(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(a(r)){if(r.number)return m(n)!==m(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Xr={create:Gr,update:Gr},Yr=C((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function Qr(t){var e=Zr(t.style);return t.staticStyle?T(t.staticStyle,e):e}function Zr(t){return Array.isArray(t)?A(t):"string"==typeof t?Yr(t):t}var to,eo=/^--/,no=/\s*!important$/,ro=function(t,e,n){if(eo.test(e))t.style.setProperty(e,n);else if(no.test(n))t.style.setProperty(S(e),n.replace(no,""),"important");else{var r=io(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(uo).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function lo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(uo).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function fo(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&T(e,po(t.name||"v")),T(e,t),e}return"string"==typeof t?po(t):void 0}}var po=C((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),ho=G&&!Y,vo="transition",go="transitionend",mo="animation",yo="animationend";ho&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(vo="WebkitTransition",go="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(mo="WebkitAnimation",yo="webkitAnimationEnd"));var bo=G?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function _o(t){bo((function(){bo(t)}))}function xo(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),co(t,e))}function wo(t,e){t._transitionClasses&&_(t._transitionClasses,e),lo(t,e)}function Co(t,e,n){var r=ko(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?go:yo,u=0,c=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++u>=a&&c()};setTimeout((function(){u0&&(n="transition",l=a,f=i.length):"animation"===e?c>0&&(n="animation",l=c,f=u.length):f=(n=(l=Math.max(a,c))>0?a>c?"transition":"animation":null)?"transition"===n?i.length:u.length:0,{type:n,timeout:l,propCount:f,hasTransform:"transition"===n&&Oo.test(r[vo+"Property"])}}function $o(t,e){for(;t.length1}function Ao(t,e){!0!==e.data.show&&So(e)}var Ro=function(t){var e,n,r={},c=t.modules,l=t.nodeOps;for(e=0;eh?_(t,i(n[m+1])?null:n[m+1].elm,n,d,m,r):d>m&&w(e,f,h)}(f,v,m,n,c):a(m)?(a(t.text)&&l.setTextContent(f,""),_(f,null,m,0,m.length-1,n)):a(v)?w(v,0,v.length-1):a(t.text)&&l.setTextContent(f,""):t.text!==e.text&&l.setTextContent(f,e.text),a(h)&&a(d=h.hook)&&a(d=d.postpatch)&&d(t,e)}}}function $(t,e,n){if(s(n)&&a(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(I(No(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function Do(t,e){return e.every((function(e){return!I(e,t)}))}function No(t){return"_value"in t?t._value:t.value}function Uo(t){t.target.composing=!0}function Fo(t){t.target.composing&&(t.target.composing=!1,zo(t.target,"input"))}function zo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Bo(t){return!t.componentInstance||t.data&&t.data.transition?t:Bo(t.componentInstance._vnode)}var qo={model:Lo,show:{bind:function(t,e,n){var r=e.value,o=(n=Bo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,So(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=Bo(n)).data&&n.data.transition?(n.data.show=!0,r?So(n,(function(){t.style.display=t.__vOriginalDisplay})):Eo(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},Vo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Ho(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?Ho(Ce(e.children)):t}function Wo(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var r in o)e[k(r)]=o[r];return e}function Ko(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var Go=function(t){return t.tag||de(t)},Jo=function(t){return"show"===t.name},Xo={name:"transition",props:Vo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(Go)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=Ho(o);if(!i)return o;if(this._leaving)return Ko(t,o);var a="__transition-".concat(this._uid,"-");i.key=null==i.key?i.isComment?a+"comment":a+i.tag:u(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s=(i.data||(i.data={})).transition=Wo(this),c=this._vnode,l=Ho(c);if(i.data.directives&&i.data.directives.some(Jo)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!de(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=T({},s);if("out-in"===r)return this._leaving=!0,Wt(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),Ko(t,o);if("in-out"===r){if(de(i))return c;var p,d=function(){p()};Wt(s,"afterEnter",d),Wt(s,"enterCancelled",d),Wt(f,"delayLeave",(function(t){p=t}))}}return o}}},Yo=T({tag:String,moveClass:String},Vo);function Qo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function Zo(t){t.data.newPos=t.elm.getBoundingClientRect()}function ti(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate(".concat(r,"px,").concat(o,"px)"),i.transitionDuration="0s"}}delete Yo.mode;var ei={Transition:Xo,TransitionGroup:{props:Yo,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Xe(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=Wo(this),s=0;s-1?mr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:mr[t]=/HTMLUnknownElement/.test(e.toString())},T(Wn.options.directives,qo),T(Wn.options.components,ei),Wn.prototype.__patch__=G?Ro:R,Wn.prototype.$mount=function(t,e){return function(t,e,n){var r;t.$el=e,t.$options.render||(t.$options.render=dt),Ze(t,"beforeMount"),r=function(){t._update(t._render(),n)},new Ve(t,r,R,{before:function(){t._isMounted&&!t._isDestroyed&&Ze(t,"beforeUpdate")}},!0),n=!1;var o=t._preWatchers;if(o)for(var i=0;i=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),c=e&&e.path||"/",l=u.path?wi(u.path,c,n||o.append):c,f=function(t,e,n){void 0===e&&(e={});var r,o=n||ci;try{r=o(t||"")}catch(t){r={}}for(var i in e){var a=e[i];r[i]=Array.isArray(a)?a.map(ui):ui(a)}return r}(u.query,o.query,r&&r.options.parseQuery),p=o.hash||u.hash;return p&&"#"!==p.charAt(0)&&(p="#"+p),{_normalized:!0,path:l,query:f,hash:p}}var qi,Vi=function(){},Hi={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,s=o.href,u={},c=n.options.linkActiveClass,l=n.options.linkExactActiveClass,f=null==c?"router-link-active":c,p=null==l?"router-link-exact-active":l,d=null==this.activeClass?f:this.activeClass,h=null==this.exactActiveClass?p:this.exactActiveClass,v=a.redirectedFrom?pi(null,Bi(a.redirectedFrom),null,n):a;u[h]=mi(r,v,this.exactPath),u[d]=this.exact||this.exactPath?u[h]:function(t,e){return 0===t.path.replace(fi,"/").indexOf(e.path.replace(fi,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,v);var g=u[h]?this.ariaCurrentValue:null,m=function(t){Wi(t)&&(e.replace?n.replace(i,Vi):n.push(i,Vi))},y={click:Wi};Array.isArray(this.event)?this.event.forEach((function(t){y[t]=m})):y[this.event]=m;var b={class:u},_=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:s,route:a,navigate:m,isActive:u[d],isExactActive:u[h]});if(_){if(1===_.length)return _[0];if(_.length>1||!_.length)return 0===_.length?t():t("span",{},_)}if("a"===this.tag)b.on=y,b.attrs={href:s,"aria-current":g};else{var x=function t(e){var n;if(e)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=zi(l.path,s.params),u(l,s,a)}if(s.path){s.params={};for(var d=0;d-1}function Ca(t,e){return wa(t)&&t._isRouter&&(null==e||t.type===e)}function Oa(t,e,n){var r=function(o){o>=t.length?n():t[o]?e(t[o],(function(){r(o+1)})):r(o+1)};r(0)}function ka(t){return function(e,n,r){var o=!1,i=0,a=null;$a(t,(function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){o=!0,i++;var u,c=Ea((function(e){var o;((o=e).__esModule||Sa&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:qi.extend(e),n.components[s]=e,--i<=0&&r()})),l=Ea((function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=wa(t)?t:new Error(e),r(a))}));try{u=t(c,l)}catch(t){l(t)}if(u)if("function"==typeof u.then)u.then(c,l);else{var f=u.component;f&&"function"==typeof f.then&&f.then(c,l)}}})),o||r()}}function $a(t,e){return ja(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function ja(t){return Array.prototype.concat.apply([],t)}var Sa="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Ea(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Pa=function(t,e){this.router=t,this.base=function(t){if(!t)if(Ki){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=hi,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Ta(t,e,n,r){var o=$a(t,(function(t,r,o,i){var a=function(t,e){"function"!=typeof t&&(t=qi.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,r,o,i)})):n(a,r,o,i)}));return ja(r?o.reverse():o)}function Aa(t,e){if(e)return function(){return t.apply(e,arguments)}}Pa.prototype.listen=function(t){this.cb=t},Pa.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Pa.prototype.onError=function(t){this.errorCbs.push(t)},Pa.prototype.transitionTo=function(t,e,n){var r,o=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),e&&e(r),o.ensureURL(),o.router.afterHooks.forEach((function(t){t&&t(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(t){t(r)})))}),(function(t){n&&n(t),t&&!o.ready&&(Ca(t,ma.redirected)&&i===hi||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(t)}))))}))},Pa.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current;this.pending=t;var i,a,s=function(t){!Ca(t)&&wa(t)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},u=t.matched.length-1,c=o.matched.length-1;if(mi(t,o)&&u===c&&t.matched[u]===o.matched[c])return this.ensureURL(),t.hash&&ia(this.router,o,t,!1),s(((a=_a(i=o,t,ma.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var l=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=ha&&n;r&&this.listeners.push(oa());var o=function(){var n=t.current,o=La(t.base);t.current===hi&&o===t._startLocation||t.transitionTo(o,(function(t){r&&ia(e,t,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){va(Ci(r.base+t.fullPath)),ia(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){ga(Ci(r.base+t.fullPath)),ia(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(La(this.base)!==this.current.fullPath){var e=Ci(this.base+this.current.fullPath);t?va(e):ga(e)}},e.prototype.getCurrentLocation=function(){return La(this.base)},e}(Pa);function La(t){var e=window.location.pathname,n=e.toLowerCase(),r=t.toLowerCase();return!t||n!==r&&0!==n.indexOf(Ci(r+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Ma=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=La(t);if(!/^\/#/.test(e))return window.location.replace(Ci(t+"/#"+e)),!0}(this.base)||Ia()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=ha&&e;n&&this.listeners.push(oa());var r=function(){var e=t.current;Ia()&&t.transitionTo(Da(),(function(r){n&&ia(t.router,r,e,!0),ha||Fa(r.fullPath)}))},o=ha?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ua(t.fullPath),ia(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Fa(t.fullPath),ia(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Da()!==e&&(t?Ua(e):Fa(e))},e.prototype.getCurrentLocation=function(){return Da()},e}(Pa);function Ia(){var t=Da();return"/"===t.charAt(0)||(Fa("/"+t),!1)}function Da(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Na(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Ua(t){ha?va(Na(t)):window.location.hash=t}function Fa(t){ha?ga(Na(t)):window.location.replace(Na(t))}var za=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,t)}))}),(function(t){Ca(t,ma.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Pa),Ba=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Xi(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!ha&&!1!==t.fallback,this.fallback&&(e="hash"),Ki||(e="abstract"),this.mode=e,e){case"history":this.history=new Ra(this,t.base);break;case"hash":this.history=new Ma(this,t.base,this.fallback);break;case"abstract":this.history=new za(this,t.base);break;default:0}},qa={currentRoute:{configurable:!0}};Ba.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},qa.currentRoute.get=function(){return this.history&&this.history.current},Ba.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof Ra||n instanceof Ma){var r=function(t){n.setupListeners(),function(t){var r=n.current,o=e.options.scrollBehavior;ha&&o&&"fullPath"in t&&ia(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Ba.prototype.beforeEach=function(t){return Ha(this.beforeHooks,t)},Ba.prototype.beforeResolve=function(t){return Ha(this.resolveHooks,t)},Ba.prototype.afterEach=function(t){return Ha(this.afterHooks,t)},Ba.prototype.onReady=function(t,e){this.history.onReady(t,e)},Ba.prototype.onError=function(t){this.history.onError(t)},Ba.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.push(t,e,n)}));this.history.push(t,e,n)},Ba.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.replace(t,e,n)}));this.history.replace(t,e,n)},Ba.prototype.go=function(t){this.history.go(t)},Ba.prototype.back=function(){this.go(-1)},Ba.prototype.forward=function(){this.go(1)},Ba.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Ba.prototype.resolve=function(t,e,n){var r=Bi(t,e=e||this.history.current,n,this),o=this.match(r,e),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?Ci(t+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},Ba.prototype.getRoutes=function(){return this.matcher.getRoutes()},Ba.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==hi&&this.history.transitionTo(this.history.getCurrentLocation())},Ba.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==hi&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Ba.prototype,qa);var Va=Ba;function Ha(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Ba.install=function t(e){if(!t.installed||qi!==e){t.installed=!0,qi=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",_i),e.component("RouterLink",Hi);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},Ba.version="3.6.5",Ba.isNavigationFailure=Ca,Ba.NavigationFailureType=ma,Ba.START_LOCATION=hi,Ki&&window.Vue&&window.Vue.use(Ba);n(97);n(90),n(127);var Wa={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,333)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(18)]).then(n.bind(null,254)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(24)]).then(n.bind(null,242)),"components/Home":()=>Promise.all([n.e(0),n.e(21)]).then(n.bind(null,309)),"components/NavLink":()=>n.e(26).then(n.bind(null,241)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,265)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,330)),"components/Page":()=>Promise.all([n.e(0),n.e(14)]).then(n.bind(null,310)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(22)]).then(n.bind(null,269)),"components/PageNav":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,270)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(13)]).then(n.bind(null,311)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(25)]).then(n.bind(null,312)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,266)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(23)]).then(n.bind(null,255)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,253)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,338)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,334)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,335)),"layouts/404":()=>n.e(8).then(n.bind(null,336)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(7)]).then(n.bind(null,337)),NotFound:()=>n.e(8).then(n.bind(null,336)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(7)]).then(n.bind(null,337))},Ka={"v-5cb20fa9":()=>n.e(30).then(n.bind(null,339)),"v-0efb2450":()=>n.e(31).then(n.bind(null,340)),"v-1670d1f3":()=>n.e(27).then(n.bind(null,341)),"v-0d475d18":()=>n.e(19).then(n.bind(null,342)),"v-4a4cacf8":()=>n.e(11).then(n.bind(null,343)),"v-74e44f34":()=>n.e(32).then(n.bind(null,344)),"v-1de4cf60":()=>n.e(33).then(n.bind(null,345)),"v-02619128":()=>n.e(34).then(n.bind(null,346)),"v-2b00cd98":()=>n.e(35).then(n.bind(null,347)),"v-1cdbca18":()=>n.e(36).then(n.bind(null,348)),"v-ba1b4750":()=>n.e(12).then(n.bind(null,349)),"v-cb974eb2":()=>n.e(28).then(n.bind(null,350)),"v-0281f210":()=>n.e(29).then(n.bind(null,351)),"v-9971bfd8":()=>n.e(37).then(n.bind(null,352)),"v-06e34cf8":()=>n.e(38).then(n.bind(null,353)),"v-bbc75128":()=>n.e(39).then(n.bind(null,354)),"v-42a12e9a":()=>n.e(40).then(n.bind(null,355)),"v-a25ba4cc":()=>n.e(41).then(n.bind(null,356)),"v-72c8df95":()=>n.e(42).then(n.bind(null,357)),"v-d15a5850":()=>n.e(43).then(n.bind(null,358)),"v-6c05b11e":()=>n.e(44).then(n.bind(null,359)),"v-d294a064":()=>n.e(16).then(n.bind(null,360))};function Ga(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const Ja=/-(\w)/g,Xa=Ga(t=>t.replace(Ja,(t,e)=>e?e.toUpperCase():"")),Ya=/\B([A-Z])/g,Qa=Ga(t=>t.replace(Ya,"-$1").toLowerCase()),Za=Ga(t=>t.charAt(0).toUpperCase()+t.slice(1));function ts(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(Za(Xa(e))):t(Za(e))||t(Qa(e))}const es=Object.assign({},Wa,Ka),ns=t=>es[t],rs=t=>Ka[t],os=t=>Wa[t],is=t=>Wn.component(t);function as(t){return ts(rs,t)}function ss(t){return ts(os,t)}function us(t){return ts(ns,t)}function cs(t){return ts(is,t)}function ls(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!cs(t)&&us(t)){const e=await us(t)();Wn.component(t,e.default)}}))}function fs(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var ps=n(87),ds=n.n(ps),hs=n(88),vs=n.n(hs),gs={created(){if(this.siteMeta=this.$site.headTags.filter(([t])=>"meta"===t).map(([t,e])=>e),this.$ssrContext){const e=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(t=e)?t.map(t=>{let e="{e+=` ${n}="${vs()(t[n])}"`}),e+">"}).join("\n "):"",this.$ssrContext.canonicalLink=ys(this.$canonicalUrl)}var t},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.getMergedMetaTags();this.currentMetaTags=bs(t,this.currentMetaTags)},getMergedMetaTags(){const t=this.$page.frontmatter.meta||[];return ds()([{name:"description",content:this.$description}],t,this.siteMeta,_s)},updateCanonicalLink(){ms(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",ys(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){bs(null,this.currentMetaTags),ms()}};function ms(){const t=document.querySelector("link[rel='canonical']");t&&t.remove()}function ys(t=""){return t?``:""}function bs(t,e){if(e&&[...e].filter(t=>t.parentNode===document.head).forEach(t=>document.head.removeChild(t)),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}function _s(t){for(const e of["name","property","itemprop"])if(t.hasOwnProperty(e))return t[e]+e;return JSON.stringify(t)}var xs=n(89),ws={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(xs)()((function(){this.setActiveHash()}),300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Cs=n(22),Os=n.n(Cs),ks=[gs,ws,{mounted(){Os.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||Wn.component(t.name)||Os.a.start(),n()}),this.$router.afterEach(()=>{Os.a.done(),this.isSidebarOpen=!1})}}],$s={name:"GlobalLayout",computed:{layout(){const t=this.getLayout();return fs("layout",t),Wn.component(t)}},methods:{getLayout(){if(this.$page.path){const t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},js=n(14),Ss=Object(js.a)($s,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}(Ss,"mixins",ks);const Es=[{name:"v-5cb20fa9",path:"/guide/",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-5cb20fa9").then(n)}},{path:"/guide/index.html",redirect:"/guide/"},{name:"v-0efb2450",path:"/guide/advanced-features.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-0efb2450").then(n)}},{name:"v-1670d1f3",path:"/contributing/",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-1670d1f3").then(n)}},{path:"/contributing/index.html",redirect:"/contributing/"},{name:"v-0d475d18",path:"/guide/after-recording.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-0d475d18").then(n)}},{name:"v-4a4cacf8",path:"/guide/before-recording.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-4a4cacf8").then(n)}},{name:"v-74e44f34",path:"/guide/analysis-configuration.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-74e44f34").then(n)}},{name:"v-1de4cf60",path:"/guide/best-practices.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-1de4cf60").then(n)}},{name:"v-02619128",path:"/guide/concepts.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-02619128").then(n)}},{name:"v-2b00cd98",path:"/guide/configuring-correlation-rules.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-2b00cd98").then(n)}},{name:"v-1cdbca18",path:"/guide/correlation-process.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-1cdbca18").then(n)}},{name:"v-ba1b4750",path:"/guide/correlation-rules.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-ba1b4750").then(n)}},{name:"v-cb974eb2",path:"/guide/custom-extensions/",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-cb974eb2").then(n)}},{path:"/guide/custom-extensions/index.html",redirect:"/guide/custom-extensions/"},{name:"v-0281f210",path:"/guide/custom-extensions/custom-extensions.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-0281f210").then(n)}},{name:"v-9971bfd8",path:"/guide/custom-extensions/the_flow_explanation.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-9971bfd8").then(n)}},{name:"v-06e34cf8",path:"/guide/installation-configuration.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-06e34cf8").then(n)}},{name:"v-bbc75128",path:"/guide/installation-guide.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-bbc75128").then(n)}},{name:"v-42a12e9a",path:"/guide/knonw-issues.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-42a12e9a").then(n)}},{name:"v-a25ba4cc",path:"/guide/templates/create.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-a25ba4cc").then(n)}},{name:"v-72c8df95",path:"/guide/templates/",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-72c8df95").then(n)}},{path:"/guide/templates/index.html",redirect:"/guide/templates/"},{name:"v-d15a5850",path:"/guide/troubleshooting.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-d15a5850").then(n)}},{name:"v-6c05b11e",path:"/",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-6c05b11e").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-d294a064",path:"/guide/using-the-plugin.html",component:Ss,beforeEnter:(t,e,n)=>{ls("Layout","v-d294a064").then(n)}},{path:"*",component:Ss}],Ps={title:"Auto Correlation Recorder",description:"Effortlessly handle dynamic values in JMeter with the Auto Correlation Recorder plugin.",base:"/CorrelationRecorder/",headTags:[["meta",{name:"theme-color",content:"#00ace6"}],["meta",{name:"apple-mobile-web-app-capable",content:"yes"}],["meta",{name:"apple-mobile-web-app-status-bar-style",content:"black"}]],pages:[{title:"User Guide",frontmatter:{next:"/guide/installation-guide.md"},regularPath:"/guide/",relativePath:"guide/README.md",key:"v-5cb20fa9",path:"/guide/",headers:[{level:2,title:"Key Features",slug:"key-features"},{level:2,title:"Benefits",slug:"benefits"},{level:2,title:"System requirements",slug:"system-requirements"}]},{title:"Advanced Features",frontmatter:{},regularPath:"/guide/advanced-features.html",relativePath:"guide/advanced-features.md",key:"v-0efb2450",path:"/guide/advanced-features.html",headers:[{level:2,title:"Using the variable extractor",slug:"using-the-variable-extractor"},{level:2,title:"Setting up regular expressions",slug:"setting-up-regular-expressions"},{level:2,title:"Handling complex scenarios",slug:"handling-complex-scenarios"}]},{title:"Contributing",frontmatter:{sidebar:"auto"},regularPath:"/contributing/",relativePath:"contributing/README.md",key:"v-1670d1f3",path:"/contributing/",headers:[{level:2,title:"Building",slug:"building"},{level:3,title:"Pre-requisites",slug:"pre-requisites"},{level:3,title:"Build",slug:"build"},{level:3,title:"Installation",slug:"installation"},{level:3,title:"Class Diagram",slug:"class-diagram"}]},{title:"Automatic Correlation methods",frontmatter:{next:"/guide/analysis-configuration.md",prev:"/guide/correlation-process.md"},regularPath:"/guide/after-recording.html",relativePath:"guide/after-recording.md",key:"v-0d475d18",path:"/guide/after-recording.html",headers:[{level:2,title:"By using Correlation Templates",slug:"by-using-correlation-templates"},{level:3,title:"Usage",slug:"usage"},{level:3,title:"Forcing the correlation of a dynamic value",slug:"forcing-the-correlation-of-a-dynamic-value"},{level:2,title:"Automatic Comparison and Variable Detection",slug:"automatic-comparison-and-variable-detection"},{level:3,title:"Usage",slug:"usage-2"}]},{title:"Before the Recording",frontmatter:{next:"/guide/concepts.md",prev:"/guide/analysis-configuration.md"},regularPath:"/guide/before-recording.html",relativePath:"guide/before-recording.md",key:"v-4a4cacf8",path:"/guide/before-recording.html",headers:[{level:2,title:"Correlation Rules",slug:"correlation-rules"},{level:2,title:"Correlation Extractor",slug:"correlation-extractor"},{level:2,title:"Correlation Replacement",slug:"correlation-replacement"},{level:2,title:"Reference Variable",slug:"reference-variable"},{level:3,title:"Configuration",slug:"configuration"},{level:3,title:"Adding Groups",slug:"adding-groups"},{level:3,title:"Adding Rules",slug:"adding-rules"},{level:3,title:"List of Correlation Extractors",slug:"list-of-correlation-extractors"},{level:2,title:"Variable Generation",slug:"variable-generation"},{level:3,title:"Extract specific match from the response (overwritable)",slug:"extract-specific-match-from-the-response-overwritable"},{level:3,title:"Extract specific match from a response (not overwritable)",slug:"extract-specific-match-from-a-response-not-overwritable"},{level:3,title:"Extract multiple variables that can be overwritten",slug:"extract-multiple-variables-that-can-be-overwritten"},{level:3,title:"Extract multiple variables that can NOT be overwritten",slug:"extract-multiple-variables-that-can-not-be-overwritten"},{level:2,title:"Variable Replacement",slug:"variable-replacement"},{level:3,title:"Replace single parameter for a variable in request",slug:"replace-single-parameter-for-a-variable-in-request"},{level:3,title:"Replace multiple parameters for variables in request",slug:"replace-multiple-parameters-for-variables-in-request"},{level:3,title:"Replace a parameter for the result of a variable transformation in request",slug:"replace-a-parameter-for-the-result-of-a-variable-transformation-in-request"},{level:3,title:"Replace multiple parameters for the result of a variable transformation in request",slug:"replace-multiple-parameters-for-the-result-of-a-variable-transformation-in-request"},{level:3,title:"Replace single parameter ignoring matched value",slug:"replace-single-parameter-ignoring-matched-value"},{level:2,title:"List of Correlation Replacements",slug:"list-of-correlation-replacements"}]},{title:"Configuring the Auto Correlation Recorder Plugin",frontmatter:{prev:"/guide/after-recording.md",next:"/guide/before-recording.md"},regularPath:"/guide/analysis-configuration.html",relativePath:"guide/analysis-configuration.md",key:"v-74e44f34",path:"/guide/analysis-configuration.html",headers:[{level:2,title:"Available Configurations",slug:"available-configurations"},{level:3,title:"Min Value Length",slug:"min-value-length"},{level:3,title:"Context Length",slug:"context-length"},{level:3,title:"Max Number of Appearances",slug:"max-number-of-appearances"},{level:3,title:"Ignore Boolean Values",slug:"ignore-boolean-values"},{level:3,title:"Ignored Domains",slug:"ignored-domains"},{level:3,title:"Ignored Headers",slug:"ignored-headers"},{level:3,title:"Ignored Files",slug:"ignored-files"},{level:3,title:"Ignored Keys",slug:"ignored-keys"},{level:2,title:"Examples",slug:"examples"},{level:3,title:"Exclude certain domains",slug:"exclude-certain-domains"},{level:3,title:"Exclude small values",slug:"exclude-small-values"},{level:3,title:"Exclude certain file types from correlation",slug:"exclude-certain-file-types-from-correlation"}]},{title:"Best Practices",frontmatter:{next:"/guide/troubleshooting.md",prev:"/guide/concepts.md"},regularPath:"/guide/best-practices.html",relativePath:"guide/best-practices.md",key:"v-1de4cf60",path:"/guide/best-practices.html",headers:[{level:2,title:"Tips for optimizing performance",slug:"tips-for-optimizing-performance"},{level:3,title:"Review your correlation rules",slug:"review-your-correlation-rules"},{level:2,title:"Collaboration and sharing correlation rules",slug:"collaboration-and-sharing-correlation-rules"},{level:2,title:"Other Best Practices",slug:"other-best-practices"},{level:3,title:"Always update the security certificate",slug:"always-update-the-security-certificate"},{level:3,title:"Use the latest version of JMeter",slug:"use-the-latest-version-of-jmeter"},{level:3,title:"Use Protocol Templates",slug:"use-protocol-templates"},{level:3,title:"Record using Incognito mode",slug:"record-using-incognito-mode"},{level:3,title:"Clean cached files, cookies, and historical data",slug:"clean-cached-files-cookies-and-historical-data"},{level:3,title:"Close other tabs and apps connected to the internet",slug:"close-other-tabs-and-apps-connected-to-the-internet"},{level:3,title:"Identify each step of the workflow while recording",slug:"identify-each-step-of-the-workflow-while-recording"},{level:3,title:"Use Request filter",slug:"use-request-filter"}]},{title:"Concepts",frontmatter:{prev:"/guide/before-recording.md",next:"/guide/best-practices.md"},regularPath:"/guide/concepts.html",relativePath:"guide/concepts.md",key:"v-02619128",path:"/guide/concepts.html",headers:[{level:2,title:"Dynamic Value",slug:"dynamic-value"},{level:2,title:"Correlation",slug:"correlation"},{level:3,title:"Manual Correlation",slug:"manual-correlation"},{level:2,title:"Correlation Rule",slug:"correlation-rule"},{level:2,title:"Correlation Template",slug:"correlation-template"},{level:2,title:"Correlation Repository",slug:"correlation-repository"}]},{title:"Correlation Rules",frontmatter:{sidebar:"auto"},regularPath:"/guide/configuring-correlation-rules.html",relativePath:"guide/configuring-correlation-rules.md",key:"v-2b00cd98",path:"/guide/configuring-correlation-rules.html",headers:[{level:2,title:"Concepts",slug:"concepts"}]},{title:"Correlation Process",frontmatter:{next:"/guide/after-recording.md",prev:"/guide/using-the-plugin.md"},regularPath:"/guide/correlation-process.html",relativePath:"guide/correlation-process.md",key:"v-1cdbca18",path:"/guide/correlation-process.html",headers:[{level:2,title:"Recording",slug:"recording"},{level:2,title:"Correlation Process",slug:"correlation-process-2"},{level:2,title:"Methods of Correlation",slug:"methods-of-correlation"},{level:3,title:"Before the Recording",slug:"before-the-recording"},{level:3,title:"After the Recording",slug:"after-the-recording"}]},{title:"Correlation",frontmatter:{},regularPath:"/guide/correlation-rules.html",relativePath:"guide/correlation-rules.md",key:"v-ba1b4750",path:"/guide/correlation-rules.html",headers:[{level:2,title:"Correlation Extractor",slug:"correlation-extractor"},{level:2,title:"Correlation Replacement",slug:"correlation-replacement"},{level:2,title:"Reference Variable",slug:"reference-variable"},{level:3,title:"Configuration",slug:"configuration"},{level:3,title:"Adding Groups",slug:"adding-groups"},{level:3,title:"Adding Rules",slug:"adding-rules"},{level:3,title:"List of Correlation Extractors",slug:"list-of-correlation-extractors"},{level:2,title:"Variable Generation",slug:"variable-generation"},{level:3,title:"Extract specific match from the response (overridable)",slug:"extract-specific-match-from-the-response-overridable"},{level:3,title:"Extract specific match from a response (not overridable)",slug:"extract-specific-match-from-a-response-not-overridable"},{level:3,title:"Extract multiple variables that can be overwritten",slug:"extract-multiple-variables-that-can-be-overwritten"},{level:3,title:"Extract multiple variables that can NOT be overwritten",slug:"extract-multiple-variables-that-can-not-be-overwritten"},{level:2,title:"Variable Replacement",slug:"variable-replacement"},{level:3,title:"Replace single parameter for a variable in request",slug:"replace-single-parameter-for-a-variable-in-request"},{level:3,title:"Replace multiple parameters for variables in request",slug:"replace-multiple-parameters-for-variables-in-request"},{level:3,title:"Replace a parameter for the result of a variable transformation in request",slug:"replace-a-parameter-for-the-result-of-a-variable-transformation-in-request"},{level:3,title:"Replace multiple parameters for the result of a variable transformation in request",slug:"replace-multiple-parameters-for-the-result-of-a-variable-transformation-in-request"},{level:3,title:"Replace single parameter ignoring matched value",slug:"replace-single-parameter-ignoring-matched-value"},{level:2,title:"List of Correlation Replacements",slug:"list-of-correlation-replacements"}]},{title:"Custom Extensions",frontmatter:{prev:"/guide/templates/create.md"},regularPath:"/guide/custom-extensions/",relativePath:"guide/custom-extensions/README.md",key:"v-cb974eb2",path:"/guide/custom-extensions/",headers:[{level:2,title:"Requisites",slug:"requisites"},{level:2,title:"Dependencies",slug:"dependencies"},{level:2,title:"Correlation Rule Structure",slug:"correlation-rule-structure"},{level:3,title:"Reference Variable",slug:"reference-variable"},{level:3,title:"Correlation Extractor",slug:"correlation-extractor"},{level:3,title:"Correlation Replacement",slug:"correlation-replacement"},{level:2,title:"Order",slug:"order"},{level:2,title:"Relationships",slug:"relationships"},{level:2,title:"CorrelationRulePartTestElement",slug:"correlationruleparttestelement"},{level:2,title:"CorrelationExtractor",slug:"correlationextractor"},{level:2,title:"CorrelationReplacement",slug:"correlationreplacement"},{level:2,title:"A Valid Rule",slug:"a-valid-rule"},{level:2,title:"JComponents allowed for each rule",slug:"jcomponents-allowed-for-each-rule"},{level:2,title:"Unique class names",slug:"unique-class-names"},{level:2,title:"Basic Relationship on each rule part",slug:"basic-relationship-on-each-rule-part"}]},{title:"Custom Extensions",frontmatter:{sidebar:"auto"},regularPath:"/guide/custom-extensions/custom-extensions.html",relativePath:"guide/custom-extensions/custom-extensions.md",key:"v-0281f210",path:"/guide/custom-extensions/custom-extensions.html",headers:[{level:2,title:"Reference Variable",slug:"reference-variable"},{level:2,title:"Correlation Extractor",slug:"correlation-extractor"},{level:2,title:"Correlation Replacement",slug:"correlation-replacement"},{level:2,title:"Order",slug:"order"},{level:2,title:"Relationships",slug:"relationships"},{level:2,title:"CorrelationRulePartTestElement",slug:"correlationruleparttestelement"},{level:2,title:"CorrelationExtractor",slug:"correlationextractor"},{level:2,title:"CorrelationReplacement",slug:"correlationreplacement"},{level:2,title:"A Valid Rule",slug:"a-valid-rule"},{level:2,title:"JComponents allowed for each rule",slug:"jcomponents-allowed-for-each-rule"},{level:2,title:"Unique class names",slug:"unique-class-names"},{level:2,title:"Basic Relationship on each rule part",slug:"basic-relationship-on-each-rule-part"}]},{title:"The Flow",frontmatter:{sidebar:"auto"},regularPath:"/guide/custom-extensions/the_flow_explanation.html",relativePath:"guide/custom-extensions/the_flow_explanation.md",key:"v-9971bfd8",path:"/guide/custom-extensions/the_flow_explanation.html",headers:[{level:2,title:"The Steps",slug:"the-steps"},{level:2,title:"The Explanation",slug:"the-explanation"},{level:3,title:"Proxy",slug:"proxy"},{level:3,title:"Engine",slug:"engine"}]},{title:"Installation and Configuration Guide",frontmatter:{sidebar:"auto",next:"/guide/correlation-process.md",prev:"/guide/"},regularPath:"/guide/installation-configuration.html",relativePath:"guide/installation-configuration.md",key:"v-06e34cf8",path:"/guide/installation-configuration.html",headers:[{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Configuration",slug:"configuration"},{level:3,title:"Local configurations",slug:"local-configurations"},{level:3,title:"Proxy configurations",slug:"proxy-configurations"}]},{title:"Installing the Plugin",frontmatter:{next:"/guide/using-the-plugin.md",prev:"/guide/"},regularPath:"/guide/installation-guide.html",relativePath:"guide/installation-guide.md",key:"v-bbc75128",path:"/guide/installation-guide.html",headers:[{level:2,title:"Prerequisites",slug:"prerequisites"},{level:3,title:"Plugin",slug:"plugin"},{level:3,title:"Integration with BlazeMeter",slug:"integration-with-blazemeter"},{level:2,title:"Installation",slug:"installation"},{level:3,title:"With Plugin Manager",slug:"with-plugin-manager"},{level:3,title:"Manually",slug:"manually"},{level:2,title:"Verifying",slug:"verifying"},{level:2,title:"Updating",slug:"updating"},{level:2,title:"Uninstall",slug:"uninstall"},{level:2,title:"Configuration",slug:"configuration"},{level:3,title:"Properties",slug:"properties"},{level:3,title:"BlazeMeter Api Key",slug:"blazemeter-api-key"},{level:3,title:"Proxy configurations",slug:"proxy-configurations"}]},{title:"Known issues",frontmatter:{},regularPath:"/guide/knonw-issues.html",relativePath:"guide/knonw-issues.md",key:"v-42a12e9a",path:"/guide/knonw-issues.html",headers:[{level:2,title:"1. Correlation History is isolated",slug:"_1-correlation-history-is-isolated"},{level:3,title:"Workaround: Manually feeding the files to the Correlation Process",slug:"workaround-manually-feeding-the-files-to-the-correlation-process"},{level:2,title:"2. Manual Replay Correlation Analysis Issue After Choosing 'No' to Wizard Prompt",slug:"_2-manual-replay-correlation-analysis-issue-after-choosing-no-to-wizard-prompt"},{level:2,title:"3. GUI crash and console error logging null pointer.",slug:"_3-gui-crash-and-console-error-logging-null-pointer"}]},{title:"Create Template",frontmatter:{prev:"/guide/templates/",next:"/guide/custom-extensions/"},regularPath:"/guide/templates/create.html",relativePath:"guide/templates/create.md",key:"v-a25ba4cc",path:"/guide/templates/create.html",headers:[{level:2,title:"Manual Template Creation",slug:"manual-template-creation"},{level:2,title:"Export Suggestions as Rules",slug:"export-suggestions-as-rules"},{level:2,title:"Load Template",slug:"load-template"}]},{frontmatter:{},regularPath:"/guide/templates/",relativePath:"guide/templates/readme.md",key:"v-72c8df95",path:"/guide/templates/",headers:[{level:2,title:"@@ -1,140 +0,0 @@",slug:"_1-140-0-0"},{level:2,title:"next: /guide/templates/create.md",slug:"next-guide-templates-create-md"},{level:2,title:"Definitions",slug:"definitions"},{level:2,title:"Types",slug:"types"},{level:3,title:"Local Templates",slug:"local-templates"},{level:3,title:"Central Templates",slug:"central-templates"},{level:3,title:"BlazeMeter Templates",slug:"blazemeter-templates"},{level:3,title:"Manually Imported Templates",slug:"manually-imported-templates"},{level:2,title:"Management",slug:"management"},{level:3,title:"Create Template",slug:"create-template"},{level:3,title:"Load Template",slug:"load-template"},{level:3,title:"Sync Templates",slug:"sync-templates"},{level:3,title:"Manually importing Templates",slug:"manually-importing-templates"},{level:3,title:"Delete Templates",slug:"delete-templates"},{level:2,title:"Usages",slug:"usages"},{level:2,title:"Limitations",slug:"limitations"}]},{title:"Troubleshooting",frontmatter:{next:"/guide/templates/",prev:"/guide/best-practices.md"},regularPath:"/guide/troubleshooting.html",relativePath:"guide/troubleshooting.md",key:"v-d15a5850",path:"/guide/troubleshooting.html",headers:[{level:2,title:"Common issues and solutions",slug:"common-issues-and-solutions"},{level:3,title:"My correlation rules are not being applied",slug:"my-correlation-rules-are-not-being-applied"},{level:2,title:"Debugging tips",slug:"debugging-tips"},{level:2,title:"How to properly report an issue",slug:"how-to-properly-report-an-issue"},{level:3,title:"How to prepare the information",slug:"how-to-prepare-the-information"},{level:2,title:"Guides",slug:"guides"},{level:3,title:"Checking your JMeter configuration",slug:"checking-your-jmeter-configuration"},{level:3,title:"Checking your Test Plan for consistency",slug:"checking-your-test-plan-for-consistency"},{level:3,title:"Checking the server responses",slug:"checking-the-server-responses"},{level:2,title:"FAQ",slug:"faq"},{level:3,title:"The value that I need to Correlate does not appear in the Tree View",slug:"the-value-that-i-need-to-correlate-does-not-appear-in-the-tree-view"},{level:2,title:"Your regular expression is not matching the value you are trying to correlate",slug:"your-regular-expression-is-not-matching-the-value-you-are-trying-to-correlate"},{level:3,title:"For Extraction",slug:"for-extraction"},{level:3,title:"For Replacement",slug:"for-replacement"},{level:2,title:"How to confirm the value is being extracted correctly",slug:"how-to-confirm-the-value-is-being-extracted-correctly"}]},{title:"Home",frontmatter:{home:!0,actionText:"User Guide →",actionLink:"/guide/",features:[{title:"⚡Super fast correlation",details:"No more tedious manual correlation for each request and response."},{title:"💪 JMeter ecosystem & community",details:"Tap into the power of community-driven correlations and simplify dynamic value handling in JMeter recordings."},{title:"📏Customizable",details:"Not enough? Take charge and empower your platform's performance with custom Correlation Rules."}],footer:"Made by Blazemeter with ❤️"},regularPath:"/",relativePath:"index.md",key:"v-6c05b11e",path:"/"},{title:"Usage",frontmatter:{next:"/guide/correlation-process.md",prev:"/guide/installation-guide.md"},regularPath:"/guide/using-the-plugin.html",relativePath:"guide/using-the-plugin.md",key:"v-d294a064",path:"/guide/using-the-plugin.html",headers:[{level:2,title:"Identifying dynamic parameters",slug:"identifying-dynamic-parameters"},{level:2,title:"Correlation Rules",slug:"correlation-rules"},{level:2,title:"Validating and testing the correlation rules",slug:"validating-and-testing-the-correlation-rules"},{level:2,title:"Applying correlation rules to test scripts",slug:"applying-correlation-rules-to-test-scripts"},{level:3,title:"Applying correlation rules after the recording is done",slug:"applying-correlation-rules-after-the-recording-is-done"},{level:3,title:"During the recording (legacy)",slug:"during-the-recording-legacy"},{level:2,title:"Using the History Manager",slug:"using-the-history-manager"},{level:3,title:"View the History",slug:"view-the-history"},{level:3,title:"Restore an Iteration",slug:"restore-an-iteration"},{level:3,title:"Delete iteration.",slug:"delete-iteration"},{level:3,title:"Export all History",slug:"export-all-history"}]}],themeConfig:{repo:"https://github.com/Blazemeter/CorrelationRecorder",editLinks:!1,docsDir:"",editLinkText:"",lastUpdated:!1,logo:"/images/blazemeter-labs-logo.png",nav:[{text:"Guide",link:"/guide/"},{text:"Templates",link:"/guide/templates/"},{text:"Custom Extensions",link:"/guide/custom-extensions/"},{text:"Contributing",link:"/contributing/"},{text:"FAQ",link:"/guide/troubleshooting.md"}],sidebar:{"/guide/":[{title:"Guide",collapsable:!0,children:["/guide/","/guide/installation-guide.md","/guide/using-the-plugin.md","/guide/correlation-process.md","/guide/after-recording.md","/guide/analysis-configuration.md","/guide/before-recording.md","/guide/concepts.md","/guide/best-practices.md","/guide/troubleshooting.md"]},{title:"Templates",collapsable:!0,children:["/guide/templates/","/guide/templates/create.md"]},{title:"Custom Extensions",collapsable:!0,children:["/guide/custom-extensions/"]}]}}};n(234);Wn.component("Badge",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,338))),Wn.component("CodeBlock",()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,334))),Wn.component("CodeGroup",()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,335)));n(235);var Ts=[({Vue:t,options:e,router:n,siteData:r})=>{},{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{}],As=[];class Rs extends class{constructor(){this.store=new Wn({data:{state:{}}})}$get(t){return this.store.state[t]}$set(t,e){Wn.set(this.store.state,t,e)}$emit(...t){this.store.$emit(...t)}$on(...t){this.store.$on(...t)}}{}Object.assign(Rs.prototype,{getPageAsyncComponent:as,getLayoutAsyncComponent:ss,getAsyncComponent:us,getVueComponent:cs});var Ls={install(t){const e=new Rs;t.$vuepress=e,t.prototype.$vuepress=e}};function Ms(t,e){const n=e.toLowerCase();return t.options.routes.some(t=>t.path.toLowerCase()===n)}var Is={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return fs("pageKey",e),Wn.component(e)||Wn.component(e,as(e)),Wn.component(e)?t(e):t("")}},Ds={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:["content__"+e.slotKey]},n()[e.slotKey])},Ns={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},Us=(n(236),n(237),Object(js.a)(Ns,(function(){var t=this._self._c;return t("span",[t("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[t("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),t("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),t("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),Fs={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};Wn.config.productionTip=!1,Wn.use(Va),Wn.use(Ls),Wn.mixin(function(t,e,n=Wn){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e});Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const r=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),i={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),i),{computed:i}}(t=>class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const r in t)"/"===r?n=t[r]:0===this.$page.path.indexOf(r)&&(e=t[r]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:t}=this.$page.frontmatter;return"string"==typeof t&&t}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!Wn.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(t.hash)}:{x:0,y:0})});!function(t){t.beforeEach((e,n,r)=>{if(Ms(t,e.path))r();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";Ms(t,n)?r(n):r()}else r();else{const n=e.path+"/",o=e.path+".html";Ms(t,o)?r(o):Ms(t,n)?r(n):r()}})}(n);const r={};try{await Promise.all(Ts.filter(t=>"function"==typeof t).map(e=>e({Vue:Wn,options:r,router:n,siteData:Ps,isServer:t})))}catch(t){console.error(t)}return{app:new Wn(Object.assign(r,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("RouterView",{ref:"layout"}),t("div",{class:"global-ui"},As.map(e=>t(e)))])})),router:n}}(!1).then(({app:t,router:e})=>{e.onReady(()=>{t.$mount("#app")})})}]); \ No newline at end of file diff --git a/assets/js/vendors~docsearch.9a75d9c6.js b/assets/js/vendors~docsearch.9a75d9c6.js new file mode 100644 index 0000000..ca442fe --- /dev/null +++ b/assets/js/vendors~docsearch.9a75d9c6.js @@ -0,0 +1,3 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{331:function(t,e,n){ +/*! docsearch 2.6.3 | © Algolia | github.com/algolia/docsearch */ +var r;"undefined"!=typeof self&&self,r=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=22)}([function(t,e,n){"use strict";var r,i=n(1);function s(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(t){if(void 0===t&&(t=navigator.userAgent),/(msie|trident)/i.test(t)){var e=t.match(/(msie |rv:)(\d+(.\d+)?)/i);if(e)return e[2]}return!1},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return null==t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,(function(t,r){t&&(n.isArray(t)?e[r]=[].concat(t):n.isObject(t)&&(e[r]=n.cloneDeep(t)))})),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,(function(r,i){n&&(n=e.call(null,r,i,t)&&n)})),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,(function(r,i){if(e.call(null,r,i,t))return n=!0,!1})),n):n},getUniqueId:(r=0,function(){return r++}),templatify:function(t){if(this.isFunction(t))return t;var e=i.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return(n?"":".")+t+e},escapeHighlightedString:function(t,e,n){e=e||"";var r=document.createElement("div");r.appendChild(document.createTextNode(e)),n=n||"";var i=document.createElement("div");i.appendChild(document.createTextNode(n));var o=document.createElement("div");return o.appendChild(document.createTextNode(t)),o.innerHTML.replace(RegExp(s(r.innerHTML),"g"),e).replace(RegExp(s(i.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var s=t.length;if(s===+s)for(var o=0;o was loaded but did not call our provided callback"),JSONPScriptError:s("JSONPScriptError"," + + diff --git a/examples/CustomContext.java b/examples/CustomContext.java new file mode 100644 index 0000000..699b30f --- /dev/null +++ b/examples/CustomContext.java @@ -0,0 +1,58 @@ +import com.blazemeter.jmeter.correlation.core.CorrelationContext; +import org.apache.jmeter.samplers.SampleResult; + + +/** + * This is the structure for a basic Correlation Context Implementation. + * All the values that want to be shared between a Correlation + * Extensions will be stored using this class. + * The update method is the one that gets the information + * */ +public class CustomContext implements CorrelationContext { + + /** + * Define the variables that are going to be shared between the CorrelationExtractors and + * CorrelationReplacements + */ + private final Map sharedFieldOne = new HashMap<>(); + private int sharedFieldTwo = 0; + private Integer counter; + + /** + * Resets the shared variables to their default values. + * + * This method is always called when the JMeter starts recording and the Proxy is started. + */ + @Override + public void reset() { + sharedFieldOne = new HashMap<>(); + sharedFieldTwo = 0; + counter = 0; + } + + /** + * Define the logic for updating the shared values. + * + * This method is always called when the {@link CorrelationEngine} is processing the responses + * from the server. + * + */ + @Override + public void update(SampleResult sampleResult) { + /* + * Here goes to logic used to update values comming from the sampleResult. + * For Example: Lets count if the is any + + diff --git a/guide/after-recording.html b/guide/after-recording.html new file mode 100644 index 0000000..464f8cd --- /dev/null +++ b/guide/after-recording.html @@ -0,0 +1,72 @@ + + + + + + Automatic Correlation methods | Auto Correlation Recorder + + + + + + + + + + + +

# Automatic Correlation methods

This section covers the Automatic Correlation methods available in the plugin. These methods allow you to +automatically correlate dynamic values in your recordings. Unlike the Correlation Rules method, which must be +configured before recording, these methods are performed after the recording is complete. This provides greater +flexibility, as the correlations can be reviewed and rolled back if necessary.

We'll discuss the pros and cons of each method to help you determine which one is best suited for your needs.

Supported methods

At this stage, the supported methods can correlate by:

Let's see what each one of these methods has to offer.

# By using Correlation Templates

This method involves analyzing a recording using different Correlation Templates to automatically detect dynamic +values. It generates a list of Correlation Suggestions based on those values, and lets you choose which ones +to apply in the Test Plan.

Pros:

  • This is the most reliable method as it only correlates the dynamic values found with the rules in the Correlation Template.
  • It lets you test any set of Correlation Rules before applying them to the Test Plan.
  • You can easily roll-back changes made to the Test Plan as it stores it in a separate file.
  • It integrates with the Correlation Repository feature, allowing you to use the Correlation Templates from BlazeMeter, +GitHub or any other sources, aside from your local ones.

Cons:

  • It still requires Rules to properly correlate the dynamic values.
  • It does not detect dynamic values that are not present in the Correlation Templates.

# Usage

Quick step guide
  1. Open the Correlation Wizard
  2. Select the Automatic comparison and variable detection method.
  3. Add the JTL file of the recording (if it isn't already loaded).
  4. Press "Continue"
  5. Review the Correlation Suggestions
  6. Press "Auto Correlate" to apply the suggestions to the Test Plan.

Detailed steps

  1. Open the Correlation Wizard

To open the Correlation Wizard, you can either:

  • Accept the replay report Dialog, after the recording.
  • Click on the Correlation Wizard button in the Correlation tab.

Replay Report Dialog

  1. Select the Existing Correlation Templates method

Select Correlation Method

  1. Select the Templates to use for the analysis

The next step is to select the Correlation Templates to use for the analysis. You can select one or more templates. +If you select more than one, the plugin will use the union of the dynamic values found in all of them.

By default, the latest version of a Template is selected, but you can change that by clicking on the field in the Version column.

Select Correlation Templates

TIP

Since version v2.5.1 (opens new window) you can quickly test your pre-existing rules in the Correlation rules tab by selecting the Draft template. +As long as you have rules underdevelopment, the Draft template will be accessible.

WARNING

If you have the BlazeMeter integration on, depending on your account type (Free or Enterprise), you might see some +Correlation Templates that are not available for you (they will have a lock icon next to them).

If you want to know more about Enterprise Correlation Templates, please contact your BlazeMeter representative.

  1. Add the JTL file of the recording (if it isn't already loaded)

By default, the plugin loads the JTL file that is found in the View Result Tree of the "bzm - Auto Correlation Recorder" element. +If you want to use a different JTL file, you can click on the "Browse" button and select the file you want to use.

WARNING

It is highly recommended that you use the JTL file that that comes from the recording, since it contains the +raw data of the recording. If you use a different JTL file, the analyzed data might not be accurate, hence +the results might not be as realistic as expected.

  1. Press "Continue"
  2. Review the Correlation Suggestions +Once the analysis is done, the plugin will display the Correlation Suggestions.

Correlation Suggestions +Review the name of the arguments, the values, where they were found and used. If you want to apply a suggestion, +select the checkbox next to it. If you want to ignore a suggestion, uncheck the checkbox.

  1. Press "Apply" to apply the suggestions to the Test Plan.

The plugin will automatically correlate the dynamic values in the Test Plan, and will display a dialog informing you +that the process was successful.

Auto Correlate Successful

# Forcing the correlation of a dynamic value

As mentioned earlier, the plugin will only try to correlate the parameters in the requests that failed during the replay. If a request does not fail (for example, it returns a 200 status code), but you still want the plugin to include it in the automatic correlation process, you can force it by adding an assertion to the request.

To add an assertion to an HTTP request in JMeter, follow these steps:

  1. Open your JMeter test plan and navigate to the Thread Group where the HTTP request is located.
  2. Select the HTTP request and right-click on it.
  3. Click on "Add" and then select "Assertions".
  4. Choose the type of assertion you want to add (for example, "Response Assertion").
  5. Configure the assertion by specifying the criteria that must be met for the assertion to pass.
  6. Save your changes and run the test again.

Official documentation: https://jmeter.apache.org/usermanual/test_plan.html#assertions

# Automatic Comparison and Variable Detection

This method involves analyzing the results of a recording replay by comparing them with the original recording. It +only focuses on the arguments of the requests that failed in the replay. By doing so, it generates a list of +Correlation Suggestions based on the differences found, allowing you to select which ones to apply in the Test Plan.

Pros and Cons

Pros:

  • It is pretty flexible, since it detects dynamic values that you might not be aware of.
  • It is customizable, since you can configure how the analysis is done.

Cons:

  • It is not 100% bullet-proof, since it might correlate dynamic values that are not necessarily dynamic

# Usage

Quick step guide
  1. Open the Correlation Wizard. +
    • If you have done a recording you can confirm the generation of correlation suggestions which redirects you to Correlation Wizard
  2. Select the Automatic comparison and variable detection method.
  3. Review the Correlation Suggestions
  4. Press "Apply" to apply the suggestions to the Test Plan.

Detailed guide

  1. Open the Correlation Wizard

To open the Correlation Wizard, you can either:

  • Accept the replay report Dialog, after the recording.
  • Click on the Correlation Wizard button in the Correlation tab.

Replay Report Dialog

  1. Select the Automatic comparison and variable detection method

Select Correlation Method

After pressing continue the generation of suggestions has began, depending on the complexity of the scenario this step might take while.

  1. Review Correlation Suggestions

Correlation Suggestions

Review the name of the arguments, the values, where they were found and used. If you want to apply a suggestion, select the checkbox next to it. If you want to ignore a suggestion, uncheck the checkbox.

  1. Press "Apply" to apply the suggestions to the Test Plan.

The plugin will automatically correlate the dynamic values in the Test Plan, and will display a dialog informing you that the process was successful.

Auto Correlate Successful

+ + + diff --git a/guide/analysis-configuration.html b/guide/analysis-configuration.html new file mode 100644 index 0000000..646ebe2 --- /dev/null +++ b/guide/analysis-configuration.html @@ -0,0 +1,83 @@ + + + + + + Configuring the Auto Correlation Recorder Plugin | Auto Correlation Recorder + + + + + + + + + + + +

# Configuring the Auto Correlation Recorder Plugin

The Auto Correlation Recorder plugin in JMeter allows you to automatically correlate dynamic values in your +HTTP requests. The plugin provides several configurations that can be customized to meet your specific needs.

# Available Configurations

The following configurations can be set via JMeter properties:

# Min Value Length

The minimum length of a value to be considered for correlation. Values with less characters will be ignored.

correlation.configuration.min_value_length=3
+

# Context Length

The total of characters extracted for the context of a value. This is the total of characters that will be extracted from the left and right of the value when creating the Regex for the extraction.

correlation.configuration.context_length=10
+

# Max Number of Appearances

The maximum number of appearances of a value to be considered for correlation. Values that appear more than this number of times will be ignored. The value -1 disables the maximum control.

correlation.configuration.max_number_of_appearances=50
+

# Ignore Boolean Values

If set to true, boolean values will be ignored for correlation.

correlation.configuration.ignore_boolean_values=true
+

# Ignored Domains

Requests that have any of the following domains will be ignored for correlation.

correlation.configuration.ignored_domains=mozilla.org, mozilla.net, mozilla.com
+

# Ignored Headers

Headers that have any of the following names will be ignored for correlation.

correlation.configuration.ignored_headers=Referer, Origin, Host, User-Agent, If-Modified-Since, Content-Length, Accept-Encoding, Connection, Accept, Accept-Language, Cache-Control, Pragma, Upgrade-Insecure-Requests, vary
+

# Ignored Files

Requests that have any of the following file extensions will be ignored for correlation.

correlation.configuration.ignored_files=jpg, jpeg, png, css, js, woff, txt, svg, ico, pdf, zip, gzip, tar, gz, rar, 7z, exe, msi, woff2
+

# Ignored Keys

Keys (arguments, JSON keys, etc.) that have any of the following names will be ignored for correlation.

correlation.configuration.ignored_keys=log, pwd, password, pass, passwd, action, testcookie, ver, widget, d, r, s, ipv6, ipv4, remind_me_later, content-type, content-length, redirect_to, pagenow, if-modified-since, url, redirect, redirect_uri, set-cookie, cache-control, host, expires, date, location, as, rel, link, returl, dur, vary, connection
+

# Examples

Here are some examples of how you could use these configurations in real-world scenarios:

# Exclude certain domains

Lets say that alongside your recorded elements, some requests from example.com were stored. Probably you would want +to avoid the parameters sent there to be analysed and, potentially correlated. To do so, you need to go to your +user.properties file, find the correlation.configuration.ignored_domains property and add the example.com +there. Like this:

correlation.configuration.ignored_domains=example.com
+

With this, the plugin will ignore any request that has example.com in its domain.

# Exclude small values

Don't want the Auto Correlation Recorder Plugin to pick up certain small values? We get it! Sometimes those tiny arguments, +like "amount" with a value of "100", just aren't worth correlating.

If you're using Automatic Correlation analysis by Correlation Templates, this particular element probably won't be +affected, since the rules only apply to values matched by their regular expressions, regardless of length. However, +if you've selected "by Replay and Compare", the plugin may locate all appearances of the string "100" in your +recording, causing unnecessary correlation.

To save yourself the hassle of correlating more than you need to, you can configure the analysis to not consider +values below a certain length. That's where this configuration comes in handy! Simply set the +correlation.configuration.min_value_length property to 10 in your user.properties file, and any value smaller than +that won't be considered for "potential" dynamic values. For example:

correlation.configuration.min_value_length=10
+

# Exclude certain file types from correlation

Let's say that you have a web application that serves different types of files such as images, PDFs, or CSS files. +When recording your test scenario, you notice that the Auto Correlation Recorder plugin is also capturing some of these +files as dynamic values. Since these files are not part of the application's business logic, you may want to exclude +them from the correlation analysis.

To exclude certain file types, you can use the correlation.configuration.ignored_files property. This property allows +you to specify a comma-separated list of file extensions that should be ignored by the correlation analysis. +For example, if you want to exclude all image and CSS files, you can set the property like this:

correlation.configuration.ignored_files=jpg,jpeg,png,css
+

This will ensure that any requests that have a file extension of .jpg, .jpeg, .png, or .css will be ignored by the +correlation analysis. To configure this property, you can simply add it to your user.properties file and set it +to the desired list of file extensions.

By excluding certain file types from the correlation analysis, you can improve the accuracy of the correlation +results and avoid unnecessary correlations of non-dynamic values.

+ + + diff --git a/guide/before-recording.html b/guide/before-recording.html new file mode 100644 index 0000000..db18206 --- /dev/null +++ b/guide/before-recording.html @@ -0,0 +1,117 @@ + + + + + + Before the Recording | Auto Correlation Recorder + + + + + + + + + + + +

# Before the Recording

When we say 'Before the Recording,' it is meant to refer to the process between when the Correlation Template is +loaded into JMeter and when the recording is completed. We use this terminology instead of saying 'while it is +being recorded' because this method requires you to properly configure the plugin before performing the +recording using what is known as a Correlation Rule (or Rule for short).

Once you have finished configuring the rules, you can start the recording, and the plugin will automatically +compare each request and response with the configured rules

Pros:

  • It is the most flexible method, since you can configure it to your needs.
  • It is the most efficient method, since it is the only one that does not require you to replay the recording.
  • It supports extensibility, allowing you to develop your own rules according to your needs.

Cons:

  • It requires you to configure the rules before the recording is done.
  • It required prior knowledge of potencial dynamic values, and how to configure the rules to extract them.
  • It requires a re-recording in order to test the changes made to the rules.
  • It doesn't support rolling back changes made to the recording, since the elements are modified in the recording itself.

Now, lets talk about the Correlation Rules and their parts.

# Correlation Rules

Now that you know how the process works, lets talk about the players involved and how those interact between each other.

# Correlation Extractor

When a Response comes from the server, there are ways to get the information, depending on where the value its changing:

  • It could change on the URL, for example, using an ID or a Token
  • It could be en the Body, set in a field (visible or hidden)
  • It could be stored on a Cookie, that has an expiration date

The Correlation Extractor has, as its main responsibility, locate if in any of these cases, there are embedded +dynamic variables. In the case where there are, its second responsibility is to extract and save the value so +that, in future requests that the app made, other players take those values and replace it, allowing the full +cycle to be completed.

# Correlation Replacement

Now that its known who it's the one responsible to extract the values from the responses, it's the responsibility +to the Correlation Replacement to take those values and replacement them in the following requests, made to the server.

# Reference Variable

Even if it's not part of the process of correlating dynamic values, when one its extracted, the name of the place +where its stored, and from where its going to be taken, in order to replace it, in the subsequent requests, +it's called Reference Variable.

Everything that it's been explained, so far, will be used in one final tool: a Correlation Rule.

# Correlation Rule

Once all those concepts are explained, the tool that allows to merge them together, it's the Correlation Rule.

Each Correlation Rule contains, a Correlation Extractor, as you now know, to extracts the dynamic value, +a Reference Variable, to store the value from the Extractor for the Replacement, and one Correlation Replacement.

Each one of these rules, will help to make this whole process of capturing and replacing values between responses and +requests, not only possible, but also easier than if you manage to do it, alone, using JMeter.

# Configuration

Assuming you know how Correlations works, lets jump into adding and configuring your rules.

Go to bzm - Auto Correlation Recorder > click the Rules Tab.

You will be presented with multiple options to add, move and delete your Correlation Rules Groups, any rule that you want to add must be inside a group

Rules Container

# Adding Groups

When clicking the Add button, a Correlation Group will be added at the bottom of your list of groups.

Each group will contain the header with the buttons to enable/disable, editing group name, and add, remove and move the rules inside the group. Below the header, it is placed the table which will contain all the rules associated to that group

Correlation Group

# Adding Rules

When clicking the + button, a Correlation Rule will be added at the bottom of your list of rules.

Each rule will contain a field in each one of the columns: Reference Variable, Correlation Extractor, and Correlation Replacement

Correlation Rule

Each Correlation Extractor and Correlation Replacement Combo will have a helper icon, right next to it that, when clicked, will display information regarding it (What it does? and How to customize it?)

Correlation Rule Hover

# Selecting a Correlation Extractor

By default, when a Correlation Rule is added, it will have automatically selected the Regex Correlation Extractor. You can change it by clicking on the combo box on the Correlation Extractor column of that Rule.

Selecting one Correlation Extractor

Each type of Extractor has its own set of parameters, some of them are visible when the extractor is selected, but the advanced ones are hidden by default, those are shown when the parameters section is expanded.

Expand_Advance_Section Extractor

By default, only Regex extractor will be able to be selected, to select other of the extractors available or a custom extractor there is an option More in the combo box which will display all the available extractors, here the desired extractor should be selected and added to actives extractors.

Add_Custom_Extractor

If another Extractor is selected, the previous values will be deleted. Filling all the fields, with the desired parameters, will allow the plugin to Extract the dynamic values from the responses.

More about how to configure each Correlation Extractor (this and the ones that comes with the Siebel Extension), please refer to our List of Correlation Extractors section.

# Selecting a Correlation Replacement

Just like the Correlation Extractors, the Regex Correlation Replacement will be selected, by default, when adding a Correlation Rule.

Selecting Replacement Correlation

Also, Correlation Replacements have their own Advance section, like Correlation Extractors

Expand_Advance_Section Replacement

As in Correlation Extractor, here to add any Correlation Replacement the option more should be used.

Add_Custom_Replacement

And their behavior goes sames as its predecessor. Once one option its selected, the fields to configure it, will be displayed right next to it.

More about how to configure each Correlation Replacements (this and the ones that comes with the Siebel Extension), please refer to our List of Correlation Replacements section.

Note that, each time you select a different Extractor or Replacement, inside your correlation rule, the values that you had set to the respective fields, will be lost. For Saving your Rule configurations, before getting creative, please refer to the Saving and Loading Rules section.

# Reference Variable

Once a value its extracted for the Correlation Extractor, it's stored in a variable, this field will determine the name of it. In future request, the Correlation Replacement will be applied and, if it successfully finds the place to apply it, will bring the value from here and replacement it there, for a smooth transition.

# List of Correlation Extractors

All the Correlation Extractors mentioned below comes either installed by default in the plugin, or as a part of the preloaded Siebel Template. To know more about how to load and save Correlation Rules Templates, please refer to the Saving and Loading Rules section, for further details about it.

In case none of the following ones fits the desired behavior your application requires, to correlate the dynamic variables that it might have, feel free to read the Customizing your one extensions section that we have prepared for you.

Regex

RegEx stands for Regular Expression, and relies on the use of Regular Expressions to find where the dynamic variable might found.

When the regular expression its matched, a Regex Extractor will be added to the sample when:

  1. The Regular Expression is matched, based on the configured properties
  2. The matched value is not repeated

This extractor comes installed, by default, in the plugin, and it receives 4 fields to be able to work properly:

Regex Correlation Extractor

  1. RegEx: which corresponds to the Regular Expression that will be used to perform the extraction.
  2. Match Number: In the case that the Regex matches more than once in the response, this number will indicate which one of all of them it's going to be extracted. Use the value -1 when you need to retrieve all matched values from the expressions.
  3. Match Group: In the case that the Regex contains, more than one group, this field indicates which one of those is going to be considered to do the extraction, once the Regex its matched. Only use positive numbers.
  4. Target: Which field to check the regular expression against. +
    • The following fields can be checked: (from JMeter documentation):
    • Body - the body of the response, e.g. the content of a web-page (excluding headers)
    • Body (unescaped) - the body of the response, with all Html escape codes replaced. Note that Html escapes are processed wi thought regard of context, so some incorrect substitutions may be made. Note that this option highly impacts performances, so use it only when absolutely necessary and be aware of its impacts.
    • Body as a Document - extract text from various type of documents via Apache Tika. Note that Body as a Document option can impact performance, so ensure it is OK for your test.
    • Request Headers - the request header of the HTTP sampler.
    • Response Headers - the response header of the HTTP sampler.
    • URL
    • Response Code - e.g. 200
    • Response Message - e.g. OK
  5. Multivalued: Multiple valuation is useful when we want to separate each unique value as a particular variant name from different responses. Variables extracted with multivalued are non-overwritable and additionally they have a specific format. See Variable Generation for case usages and variable formats. +In case the Regex Extractor is not matched, during a Replay of a Recorded flow, the replaced value will be <Reference Variable Name> + "_NOT_FOUND".

JSON

JSON stands for JavaScript Object Notation, and relies on the use of JSONPath Expressions to find where the dynamic variable might found.

When the JSONPath its matched, a JSONPath Extractor will be added to the sample when:

  1. The JSONPath is matched, based on the configured properties
  2. The matched value is not repeated

This extractor comes installed, by default, in the plugin, and it receives 4 fields to be able to work properly:

JSON Correlation Extractor

  1. JSON: which corresponds to the JSONPath Expression that will be used to perform the extraction.
  2. Match Number: In the case that the JSONPath matches more than once in the response, this number will indicate which one of all of them it's going to be extracted. Use the value -1 when you need to retrieve all matched values from the expressions.
  3. Target: Which field to check the regular expression against. +
    • The following fields can be checked: (from JMeter documentation):
    • Body - the body of the response, e.g. the content of a web-page (excluding headers)
  4. Multivalued: Multiple valuation is useful when we want to separate each unique value as a particular variant name from different responses. Variables extracted with multivalued are non-overwritable and additionally they have a specific format. See Variable Generation for case usages and variable formats. +In case the JSONPath Extractor is not matched, during a Replay of a Recorded flow, the replaced value will be <Reference Variable Name> + "_NOT_FOUND".

JMeter use JSONPath syntax from Jayway JsonPath (opens new window) Use the Jayway JsonPath syntax documentation as a reference.

Jayway JsonPath is a java port based on Stefan Goessner's original JSONPath implementation (opens new window).

It is possible to find multiple examples of JSONPath expressions on the websites mentioned above or on the Internet.

JMeter allows you to evaluate JSONPaths in the Sample results of the ViewResult using the view "JSON Path Tester". However, it is possible to use some other tools on the Internet that facilitate the evaluation and testing of JSONPath, such as the site jsonpath.com (opens new window)

JSONPath Example

An example will be provided below that will allow you to visually understand some general concepts of the JSONPath syntax.

{
+  "store": {
+    "book": [
+      {
+        "category": "reference",
+        "author": "Nigel Rees",
+        "title": "Sayings of the Century",
+        "price": 8.95
+      },
+      {
+        "category": "fiction",
+        "author": "Evelyn Waugh",
+        "title": "Sword of Honour",
+        "price": 12.99
+      },
+      {
+        "category": "fiction",
+        "author": "Herman Melville",
+        "title": "Moby Dick",
+        "isbn": "0-553-21311-3",
+        "price": 8.99
+      },
+      {
+        "category": "fiction",
+        "author": "J. R. R. Tolkien",
+        "title": "The Lord of the Rings",
+        "isbn": "0-395-19395-8",
+        "price": 22.99
+      }
+    ],
+    "bicycle": {
+      "color": "red",
+      "price": 399
+    }
+  }
+}
+

Some JSONPath query expressions and their expected result.

JSONPath Intended result
$.store.book[*].author the authors of all books in the store
$..author all authors
$.store.* all things in store, which are some books and a red bicycle
$.store..price the prices of everything in the store
$..book[2] the third book
$..book[2].author the third book's author
$..book[2].publisher empty result: the third book does not have a "publisher" member
$..book[-1] the last book in order
$..book[0,1] or $..book[:2] the first two books
$..book[?@.isbn] all books with an ISBN number
$..book[?@.price<10] all books cheaper than 10
$..* all member values and array elements contained in the input value

The IETF group in charge of creating Internet standards in February 2024 completed its work on the creation of RFC 9535 associated with JSONPath. +You can consult the RFC documentation in case you require more details about JSONPath +https://datatracker.ietf.org/doc/rfc9535/

# Variable Generation

The creation of JMeter variables for later usage is one of the pillars of this plugin. Therefore, this section is specially dedicated to understand and review all the possible scenarios.

The generation and assignment of variables are tied to the Extractors which are the ones in charge of extracting the matches and store them. Therefore, a detailed explanation of extractor configuration will be covered during this section.

The most used and complex extractor is the Regex Extractor. +This section will be divided into cases, from simple and common cases to unusual ones.

# Extract specific match from the response (overwritable)

Description
Objective extract the second appearance of a character chain included on the response that matches the given regex
Configuration need to specify a variable name (the variable stored will use it), regex, desired match number and no need to check for multi-valued
Visualization extractor_configuration_visualization
Overall value will be stored in a JMeter variable, with the exact name as the value introduced on the reference variable name field. If a variable exists (from previous extractions) the variable will be overwritten with new match value

# Extract specific match from a response (not overwritable)

Description
Objective extract a certain value from a specific match number on the response. The value will be saved in a non-overwritable variable.
Configuration variable name, regex, desired match number and multivalue must be selected
Visualization extractor_configuration_visualization
Overall value will be extracted and stored in a variable with the following convention: E.g: var#34
  • var: reference variable name
  • #34: represents the variable count number
Note: this variable will endure the whole execution

# Extract multiple variables that can be overwritten

Description
Objective extract all values that match the regex on the response
Configuration variable name, regex, match number needs to be lower than 0 (E.g: -1). No need for multi-valued.
Visualization extractor_configuration_visualization
Overall a new variable will be created to store every match found on the response. If the variable already exists, it will be overwritten. The format of this type of variable consists of a prefix (reference variable name) with an underscore followed by the integer which represents the match number of the extracted value. E.g: ID_1
Important: If variables are been extracted in previous responses, for instance, 5 matches (ID_1, ID_2,..., ID_5), when another response arrives with new matches, these variables will not just be overwritten, will be deleted. If the new response matches thrice, then the resultant variables will be ID_1, ID_2, ID_3. Previous variables ID_4 and ID_5 will no longer exist.

# Extract multiple variables that can NOT be overwritten

Description
Objective extract all values that match the regex on the response and store them immutably
Configuration variable name, regex, match number needs to be lower than 0 (E.g: -1). Multi-valued needs to be checked
Visualization extractor_configuration_visualization
Overall a new variable will be created to store every match found on the response. This type of extractions have a particular format name. E.g: myVar#2_1 Where:
  • myVar: reference variable name
  • #2: hash followed by the variable count number
  • _1: number of match in that response

New JMeter variables are created (with the format showed above) every time a response arrives, and the regex matches more than twice.
Note: if the response contains one match, and optimization is done. Therefore, the generated variable will be like in section Extract specific match from a response (not overwritable)

# Variable Replacement

The replacement of dynamic or static data in a request for JMeter Variables is one of the main objectives of the Auto Correlation Recorder.

Mainly, the idea is to replace data for variables, therefore, we get a proper correlated script. +The data we want to replace needs to match a certain regex, condition or even a criteria. +The variable replacement system does support the scenario when the match needs to be replaced for a literal instead of a JMeter Variable (not common case).

Let's give an example in order to set the idea of a replacement. +Suppose we have a website were is possible to buy products. Those products are identified by a unique id. +Our objective will be to replace the id number for a JMeter Variable, to later on, buy any product of the store just by modifying the JMeter Variable value. +Considering an url like www.my-market-place.com/cart.html?product_id=2 +The regex we have to build in order to match the data we want to replace, it should be something like: product_id=(\d). +The result we are looking for should be a request with a parametrized value, in that case, the id number. +The desired result will look something like: +www.my-market-place.com/cart.html?product_id=${id_product}

Now that we have a basic idea of a replacement, lets explain the most complex and used replacement. The Regex Correlation Replacement which accepts three parameters:

  1. regex: the regex needed to match the data to be replaced on a request.
  2. replacementString: this field is used to set JMeter Functions, or even literals to be used on the comparison of the replacement match value (if value is not ignored).
  3. ignore value: this check will determine if the match will be compared against all the JMeter Variables or even the execution of a function that can be declared on the replacementString field. When is checked, it will replace without comparing.

Below is shown all the possible scenarios. Each scenario contains an Objective which will explain the problem we want to achieve. Pre-loaded variables will set us in a current variable context, in consideration of generating those variables is mandatory to read the section variable-generation. Context will provide all necessary information for the scenario, as a global configuration will work under the domain www.my-market-place.com. The Visualization will show the configuration made on the replacement in order to achieve the desired result.

# Replace single parameter for a variable in request

Description
Objective replace a parameter of a request for a JMeter Variable.
Pre-loaded variables ID = 2
Context Request is /cart.html?product_id=2
Visualization single_parameter_replacement
Overall Once the regex matches on the request, the matched value will be 2. Then it will compare the matched value against all the variables stored. When the matched value equals any variable stored, the replacement will be triggered
Replacement result www.my-market-place.com/cart.html?product_id=${ID}

# Replace multiple parameters for variables in request

Description
Objective replace multiple parameters of a request for JMeter Variables.
Pre-loaded variables ID_1 = 2, ID_2 = 3, ID_3 = 4, ID_SESSION = rP/tHk<tsR!v>
Context Request is /cart.html?product_id=2&product_id=4
Visualization multiple_parameter_replacement
Overall For this multi replacement, the regex will match twice (two appearances of product_id), therefore, each matched value will be replaced for the variables containing same value.
Replacement result www.my-market-place.com/cart.html?product_id=${ID_1}&product_id=${ID_3}

# Replace a parameter for the result of a variable transformation in request

Description
Objective replace a parameter in request that uses a pre-loaded variable but transformed.
Pre-loaded variables ID = 2, ID_SESSION = rP/tHk<tsR!v>
Context Request is /index.html?session=rP%2FtHk%3CtsR%21v%3E. In this particular case, the session id is extracted decoded (ID_SESSION value) , but on the request it is encoded. Therefore, the stored variable will be different to the matched value on the request. Because of that, we need to use the field replacementString in order to make that transformation. For this example we are using a JMeter Function called urlencode (opens new window)
Visualization single-transformed-replacement
Overall Since the replacement string is not empty, the plugin will execute (if executable, could also be a literal) the content. The result of the execution will be used to compare against the regex replacement matched value. When those values match, the replacement is made by placing the content of replacementString on the request.
Replacement result www.my-market-place.com/index.html?session=${__urlencode(${ID_SESSION})}

# Replace multiple parameters for the result of a variable transformation in request

Description
Objective replace a parameter in request that uses pre-loaded variables but transformed.
Pre-loaded variables prod_1=red car, prod_2=blue car
Context Request is delete.html?identifier=red+car&indetifier=blue+car. In this case, we have to replace two parameters of the request. The value that will be placed on the request, needs to be encoded. Since the pre-loaded variables are not encoded, we need to make a transformation
Visualization multiple-transformed-replacement
Overall Similar to the previous scenario, in order to proper replace for variables, we have to make a transformation, that will be done by calling the __urlencode (opens new window) function provided by JMeter. Since the pre-loaded variables are result of a multiple extraction. The replacement string will have the variable name without the suffix. The plugin automatically will detect that and it will access to all the stored values for that reference variable name.
Replacement result www.my-market-place.com/index.html?identifier=${__urlencode(${prod_1})}&identifier=${__urlencode(${prod_2})}

# Replace single parameter ignoring matched value

Description
Objective replace a parameter in request that uses pre-loaded variables but transformed.
Pre-loaded variables No variables used for this case
Context Request is /main.html?time=1516540541624. This request contains a parameter which is the current time in milliseconds, therefore, if we had that value stored in a variable it will not work, since we need to set a request with the current time. Therefore we will use the function __time() (opens new window) provided by JMeter
Visualization ignore_value_replacement
Overall It is not possible to compare values in order to achieve our objective, therefore we need to set the current time neglecting the previous value. For that reason the ignore value is checked, it will not execute and compare the replacement string content.
Replacement result www.my-market-place.com/main.html?time=${__time()}

# List of Correlation Replacements

All the Correlation Replacements mentioned below are installed by default in the plugin. To know more about how to load and save Correlation Rules Templates, please refer to the Saving and Loading Rules section, for further details about it.

In case none of the following Replacements fits the desired behavior your application requires, to correlate the dynamic variables that it might have, feel free to read the Customizing your one extensions section that we have prepared for you.

Regex

Similarly to the Correlation Extractor Regex, this one also receives a Regular Expression in order to find where the stored value is going to be replaced. Additionally, if a regex extractor with multivalued was added, the replacement will be applied automatically. It will look for a variable with same value as the request match in order to make the replacement. In short, no need to configure replacement to work with a multi-value or single-value.

Regex Correlation Replacement

JSON

Similarly to the JSON Correlation Extractor, this one also receives a JSONPath Expression in order to find where the stored value is going to be replaced. Additionally, if a JSONPath extractor with multivalued was added, the replacement will be applied automatically. It will look for a variable with same value as the request match in order to make the replacement. In short, no need to configure replacement to work with a multi-value or single-value.

JSON Correlation Replacement

For examples of using JSONPath expressions, refer to the JSON Correlation Extractor documentation.

The logic behind Replacement string and Ignore value is the same as Regex Correlation Replacement. Go to the documentation related to Variable Replacement for usage examples.

+ + + diff --git a/guide/best-practices.html b/guide/best-practices.html new file mode 100644 index 0000000..96f0d45 --- /dev/null +++ b/guide/best-practices.html @@ -0,0 +1,60 @@ + + + + + + Best Practices | Auto Correlation Recorder + + + + + + + + + + + +

# Best Practices

In this section you will find best practices for the creation of correlation rules, along with tips for optimizing +your current and past scripts.

# Tips for optimizing performance

# Review your correlation rules

Even though the plugin is designed to be as efficient as possible, it is still a good idea to review your correlation +rules and make sure that they are not affecting the performance of your test scripts. The addition of unnecesary +correlation rules can have a negative impact on the performance of your test scripts, making either the recording +or the analysis of the script slower.

Likewise, it is also a good practice to review your correlated elements after the rules or suggestions being applied: +if they added correlations that are not needed, you can remove them to improve the performance of your test scripts.

# Collaboration and sharing correlation rules

When sharing your correlation rules (as Correlation Templates or simply sharing them individually), always remember to +check for sensitive data. This is not as usual scenario, but often users forget to remove examples and testing information +from their descriptions, regexes and Test Plans, exposing sensitive data to other users.

# Other Best Practices

The following are a list of best practices, in general, that should be considered when doing any sort of Recordings in JMeter:

# Always update the security certificate

Once is never enough when it comes to security. Remember to update periodically the Security Certificate used during the recordings. It expires after 7 days of been created.

# Use the latest version of JMeter

The newer, the better, try to use the latest version of the JMeter, allowing you to avoid dealing with unnecessary issues and use a more performant app.

# Use Protocol Templates

Not only they have been tested by the development team but, they also come with configured components, allowing the recording to be more efficient and faster to configure.

# Record using Incognito mode

Multiple times the browser stores information from previous visits, in order to ease the following usage of the pages, contaminating the recording with data that isn’t new and related to the flow at hand. To avoid this, always start a new “Incognito session” when making a recording. This ensures that the data that is being recorded is always complete and new, no matter when and where the recording is replayed.

# Clean cached files, cookies, and historical data

Even if you are recording in incognito mode, it is not uncommon to perform another recording after the one you just made. If you did it in an Incognito window, either close that window and start with a brand new one or clean all the information that might affect your recording, such as cookies, cache, sessions, etc.

# Close other tabs and apps connected to the internet

Avoid having other web pages or applications opened when recording. This will reduce the probability of having non-related requests in your recording.

# Identify each step of the workflow while recording

It’s suggested to use Transaction Controllers in order to group the requests for each step of the workflow, writing comments or a label to help understand and identify the requests sent in each step. The best way to do this is step by step while recording, for example: record the access to the main page, add a Transaction Controller and put all the requests recorded in it, record the next step of the workflow, add another transaction controller and put all the new recorded requests in it and so on.

# Use Request filter

Avoid recording unnecessary requests when testing a flow, unless that’s exactly what you want to do. Is better to test a specific scenario rather than stressing the server with styles and fonts that won’t do any good in the functionality itself.

+ + + diff --git a/guide/concepts.html b/guide/concepts.html new file mode 100644 index 0000000..714b60c --- /dev/null +++ b/guide/concepts.html @@ -0,0 +1,109 @@ + + + + + + Concepts | Auto Correlation Recorder + + + + + + + + + + + +

# Concepts

# Dynamic Value

Dynamic values are variables that change each time a user interacts with a web application. Examples of dynamic +values include session IDs, CSRF tokens, and timestamps. These values are used by the application to maintain +state and security.

When recording a test scenario using JMeter, dynamic values need to be captured and included in subsequent requests. +Failure to do so can lead to errors and incorrect test results. However, capturing and handling dynamic values can +be challenging and requires careful configuration of the test script.

There are several potential issues that can arise when dealing with dynamic values in JMeter recordings. +One common issue is that the recorded values may be specific to a particular user session or request, and +therefore cannot be reused in subsequent requests without modification. Additionally, dynamic values may expire +or become invalid after a certain period of time, requiring the test script to be updated to use new values.

Another issue is that dynamic values may need to be correlated or parameterized to ensure that each virtual user +in the test uses a unique value. This can be complex and time-consuming, particularly for large or complex test +scenarios.

# Correlation

As I mentioned earlier, dynamic values such as session IDs and tokens can change with each user interaction, +and must be included in subsequent requests to properly simulate user behavior. Correlation allows JMeter to +automatically capture these values and replace them with unique values for each virtual user in the test.

The correlation process, or Correlation for shorts, typically involves identifying the dynamic value in the +response using a regular expression or other pattern-matching mechanism, and then storing it in a JMeter +variable. This variable can then be used in subsequent requests by enclosing it in curly braces, +like this: ${myVariable}.

JMeter provides several built-in correlation functions, such as Regular Expression Extractor and CSS/JQuery Extractor, +to simplify the process of capturing and storing dynamic values. However, more complex scenarios may require custom +scripting to properly correlate values.

# Manual Correlation

Manually correlating dynamic values in JMeter involves several steps. Here is an overview of the process:

Identify the request that needs correlation: Begin by identifying the request that contains the dynamic value that +needs to be captured and used in subsequent requests.

Detect the argument that needs to be correlated: Once you have identified the request, you need to determine which +argument within the request contains the dynamic value. This may involve examining the request payload or headers to +locate the relevant argument.

Locate the appearance of the dynamic value in responses: Once you have identified the argument, you need to locate the +corresponding dynamic value in the responses to the request. This may involve using a regular expression or other +pattern-matching mechanism to identify the value.

Add an extractor to obtain the value: Once you have located the dynamic value in the response, you need to add an +extractor to capture it and store it in a JMeter variable. JMeter provides several built-in extractors, such as +Regular Expression Extractor and CSS/JQuery Extractor, to simplify this process.

Store the value in a variable: Once you have extracted the dynamic value, you need to store it in a JMeter variable. +The variable name should be chosen carefully to ensure it is unique and descriptive.

Replace the variable in subsequent requests: Finally, you need to replace the original dynamic value in subsequent +requests with the JMeter variable containing the captured value. This ensures that each virtual user in the test uses +a unique value.

Manual correlation can be a time-consuming process, particularly when dealing with large or complex test scenarios +that involve multiple dynamic values. This is where Auto Correlation Recorder comes in handy. +The Auto Correlation Recorder provides several methods for automatically detecting and correlating dynamic +values, including the use of regular expressions and JSON Path expressions.

Here are some of the Automatic Correlation methods supported by Auto Correlation Recorder:

  1. RegEx (Regular Expression) Extractor
  2. JSON Extractor

By using the Auto Correlation Recorder, however, you can simplify the process of correlating dynamic values and save time when creating test scripts.

Please take a look at previous sections in the guide, where you can learn about the different mechanisms for +automatically correlating dynamic values, either after the recording is being done or after the whole recording +is done.

# Correlation Rule

The Auto Correlation Recorder plugin provides a powerful feature called "Correlation Rules" that simplifies the process of +making correlations in JMeter scripts. A Correlation Rule consists of three key components:

Reference Variable: This variable is used to store the dynamic value that will be extracted from a response and +subsequently used for replacements in subsequent requests.

Extractor: The Extractor component of a Correlation Rule allows you to configure how and where the dynamic value will +be extracted from the response. JMeter provides several built-in Extractors such as Regular Expression Extractor, +CSS/JQuery Extractor, XPath Extractor, JSON Extractor and Boundary Extractor, to facilitate the process of +capturing dynamic values.

Replacement: The Replacement component of a Correlation Rule allows you to configure how and where the dynamic value +will be replaced in subsequent requests. You can specify which request parameter to replace, and how to format the +replacement string.

By defining Correlation Rules, you can easily extract and replace dynamic values in JMeter scripts without the need +for manual correlation. To learn more about how to create Correlation Rules and leverage this powerful feature, +refer to the "Correlation Rules" section of the JMeter User Manual.

# Correlation Template

The Auto Correlation Recorder Plugin in JMeter utilizes Correlation Templates to maintain a simplified versioning of +Correlation Rules and to store and organize them together. A Correlation Template includes essential information +such as version number, name, description, and changes log.

The Correlation Template serves as the foundation for the Automatic Correlation Analysis in the Auto Correlation Recorder +Plugin. It allows the user to keep track of the version of the Correlation Rules being used for the analysis. +This feature ensures that the user is always working with the latest version of the Correlation Rules and helps +to maintain the accuracy of the results.

Additionally, BlazeMeter provides several Correlation Templates that are designed for different technologies and +protocols. These templates can be used to facilitate the correlation process for specific types of applications +and make it easier for users to get started with the Auto Correlation Recorder Plugin. To learn more about how to use +Correlation Templates and benefit from this powerful feature, refer to the JMeter User Manual.

# Correlation Repository

The Correlation Repository is a powerful mechanism used by the Auto Correlation Recorder Plugin in JMeter to keep your set +of Correlation Templates up-to-date. This feature allows for continuous updates of Correlation Templates from external +sources.

The Correlation Repository is similar to a GitHub repository, where you can upload new versions of your templates to be +stored and shared with others, while also being able to download templates uploaded by others. In Blazemeter, +you have access to both your company's private Repository and the public repository, where Blazemeter's refined +Correlation Templates are stored and updated regularly.

By utilizing the Correlation Repository, you can streamline the Correlation process and reduce the amount of time +required to create and maintain Correlation Templates. This feature allows for collaboration between team members and +simplifies the process of sharing Correlation Templates across different projects. To learn more about how to use the +Correlation Repository and take advantage of this powerful feature, refer to the JMeter User Manual.

+ + + diff --git a/guide/configuring-correlation-rules.html b/guide/configuring-correlation-rules.html new file mode 100644 index 0000000..0a24bc1 --- /dev/null +++ b/guide/configuring-correlation-rules.html @@ -0,0 +1,45 @@ + + + + + + Correlation Rules | Auto Correlation Recorder + + + + + + + + + + + +

# Correlation Rules

Correlation rules are the mechanism that allows you to define how to the Auto Correlation Recorder will detect dynamic values, extract and replacement them in your recorded flow.

# Concepts

A Correlation Rule consists of three elements: a Reference variable name, an Extractor, and a Replacement.

It's important to note that while the Reference variable name must be defined, it doesn't have to be unique. You can create multiple correlation rules with the same name.

You can create a Correlation Rule with only an Extractor or only a Replacement, but at least one of them must be defined. If you create multiple rules with the same reference variable name, but different extractors or replacements, you'll be able to extract or replace the same dynamic value in different ways.

+ + + diff --git a/guide/correlation-process.html b/guide/correlation-process.html new file mode 100644 index 0000000..6bf9897 --- /dev/null +++ b/guide/correlation-process.html @@ -0,0 +1,59 @@ + + + + + + Correlation Process | Auto Correlation Recorder + + + + + + + + + + + +

# Correlation Process

Let's review the whole process of correlation, from the beginning, when we start recording and configuring +the JMeter plugin, until the end, when we have a fully functional test plan.

# Recording

If you are new to making recordings in JMeter, we recommend you read the following articles from their +official documentation:

With this, you will be able to understand the basics of how to make a recording in JMeter and how to get the most out of it.

# Correlation Process

The "Correlation Process" is the technique of locating within the recording requests the values (arguments) +that vary in each iteration (replays), calling them "dynamic". Whenever a dynamic value is found in a request, usually one that failed, we need to locate the response upon which it depends, extract it using extractors in +the Test Plan, store it in a variable, and replace it in the corresponding request.

This process is repeated on each failed request until all the dynamic values are found and replaced. Sometimes, +the dynamic values are not easy to locate, and sometimes, they might even have different values for the same argument +within the same recording.

When performing this process manually, it can be very time-consuming and frustrating. That's why we created the Auto Correlation Recorder plugin, to automate this process and make it easier for you.

# Methods of Correlation

The Auto Correlation Recorder plugin offers different methods of correlation, each one with its own advantages and disadvantages. In this section, we will cover all of them divided into two categories: Before the Recording and After the Recording.

# Before the Recording

When we say 'Before the Recording,' it refers to the process between loading the Correlation Template into JMeter and completing the recording. We use this terminology instead of saying 'while it is being recorded' because this method requires you to properly configure the plugin before performing the recording using what is known as a Correlation Rule (or Rule for short).

Once you have finished configuring the rules, you can start the recording, and the plugin will automatically compare each request and response with the configured rules.

Pros:

  • It is the most flexible method since you can configure it to your needs.
  • It is the most efficient method since it is the only one that does not require you to replay the recording.
  • It supports extensibility, allowing you to develop your own rules according to your needs.

Cons:

  • It requires you to configure the rules before the recording is done.
  • It requires prior knowledge of potential dynamic values and how to configure the rules to extract them.
  • It requires a re-recording to test the changes made to the rules.
  • It doesn't support rolling back changes made to the recording, since the elements are modified in the recording itself.

To know more about this method, how to configure it, and how to use it, read Correlation Rules.

# After the Recording

Unlike the previous point, these methods are performed after the recording is done, and they are used to analyze the recording and the recording results to find the dynamic values. It is important to note that these methods work in the form of an analysis of the recording, and they do not modify the recording itself, and they are done automatically by the plugin.

At this stage, the supported methods can correlate by:

Let's see what each one of these methods has to offer.

# Correlation by Using Correlation Templates

This method involves analyzing a recording using different Correlation Templates to automatically detect dynamic values. It generates a list of Correlation Suggestions based on those values and lets you choose which ones to apply in the Test Plan.

Pros:

  • This is the most reliable method as it only correlates the dynamic values found with the rules in the Correlation Template.
  • It lets you test any set of Correlation Rules before applying them to the Test Plan.
  • You can easily roll-back changes made to the Test Plan as it stores it in a separate file.
  • It integrates with the Correlation Repository feature, allowing you to use the Correlation Templates from BlazeMeter, GitHub, or any other sources, aside from your local ones.

Cons:

  • It still requires Rules to properly correlate the dynamic values.
  • It does not detect dynamic values that are not present in the Correlation Templates.

# Correlation by Replay and Compare

This method involves analyzing the results of a recording replay by comparing them with the original recording. It only focuses on the arguments of the requests that failed in the replay. By doing so, it generates a list of Correlation Suggestions based on the differences found, allowing you to select which ones to apply in the Test Plan.

Pros:

  • It is pretty flexible since it detects dynamic values that you might not be aware of.
  • It is customizable since you can configure how the analysis is done.

Cons:

  • It is not 100% bullet-proof since it might correlate dynamic values that are not dynamic.
  • It requires your input of which of the detected dynamic values you are interested in correlating. Otherwise, it will end up correlating values that you might not be interested in.

While they both have their own advantages and disadvantages, we recommend you use the Correlation by Using Correlation Templates method as it is the most reliable one. With that being said, the Correlation by Replay and Compare method can be pretty useful when you are not sure where the dynamic values are present in the recording.

In conclusion, the Correlation Process is a crucial step in JMeter testing, and the Auto Correlation Recorder plugin provides several methods to make it easier and more efficient. By following the recommended methods, you can save time and effort and ensure a more accurate and reliable test plan.

If you are new to JMeter, we recommend you start with the basics of recording and gradually move on to the more advanced topics of correlation. Take your time to learn and practice the different methods, and find the one that works best for your specific scenario.

Also, keep in mind that correlation is not a one-time process. Dynamic values can change over time, and you may need to update your correlation rules or templates accordingly. So, make sure to regularly review and update your test plan to ensure its accuracy and reliability.

In summary, the correlation process is a crucial part of JMeter testing, and the Auto Correlation Recorder plugin provides valuable tools to make it easier and more efficient. By mastering the different methods and techniques, you can create accurate and reliable test plans that can help you identify performance issues and optimize your applications.

+ + + diff --git a/guide/correlation-rules.html b/guide/correlation-rules.html new file mode 100644 index 0000000..fdd7f35 --- /dev/null +++ b/guide/correlation-rules.html @@ -0,0 +1,106 @@ + + + + + + Correlation | Auto Correlation Recorder + + + + + + + + + + + +

# Correlation

Now that you know how the process works, lets talk about the players involved and how those interact between each other.

# Correlation Extractor

When a Response comes from the server, there are ways to get the information, depending on where the value its changing:

  • It could change on the URL, for example, using an ID or a Token
  • It could be en the Body, set in a field (visible or hidden)
  • It could be stored on a Cookie, that has an expiration date

The Correlation Extractor has, as its main responsibility, locate if in any of these cases, there are embedded +dynamic variables. In the case where there are, its second responsibility is to extract and save the value so +that, in future requests that the app made, other players take those values and replace it, allowing the full +cycle to be completed.

# Correlation Replacement

Now that its known who it's the one responsible to extract the values from the responses, it's the responsibility +to the Correlation Replacement to take those values and replacement them in the following requests, made to the server.

# Reference Variable

Even if it's not part of the process of correlating dynamic values, when one its extracted, the name of the place +where its stored, and from where its going to be taken, in order to replace it, in the subsequent requests, +it's called Reference Variable.

Everything that it's been explained, so far, will be used in one final tool: a Correlation Rule.

# Correlation Rule

Once all those concepts are explained, the tool that allows to merge them together, it's the Correlation Rule.

Each Correlation Rule contains, a Correlation Extractor, as you now know, to extracts the dynamic value, +a Reference Variable, to store the value from the Extractor for the Replacement, and one Correlation Replacement.

Each one of these rules, will help to make this whole process of capturing and replacing values between responses and +requests, not only possible, but also easier than if you manage to do it, alone, using JMeter.

# Configuration

Assuming you know what a correlation is and which parts of the process +the Correlation Rules are part of lets jump into adding and configuring your rules.

Go to bzm - Auto Correlation Recorder > click the Rules Tab.

You will be presented with multiple options to add, move and delete your Correlation Rules Groups, any rule that you want to add must be inside a group

Rules Container

# Adding Groups

When clicking the Add button, a Correlation Group will be added at the bottom of your list of groups.

Each group will contain the header with the buttons to enable/disable, editing group name, and add, remove and move the rules inside the group. Below the header, it is placed the table which will contain all the rules associated to that group

Correlation Group

# Adding Rules

When clicking the + button, a Correlation Rule will be added at the bottom of your list of rules.

Each rule will contain a field in each one of the columns: Reference Variable, Correlation Extractor, and Correlation Replacement

Correlation Rule

Each Correlation Extractor and Correlation Replacement Combo will have a helper icon, right next to it that, when clicked, will display information regarding it (What it does? and How to customize it?)

Correlation Rule Hover

# Selecting a Correlation Extractor

By default, when a Correlation Rule is added, it will have automatically selected the Regex Correlation Extractor. You can change it by clicking on the combo box on the Correlation Extractor column of that Rule.

Selecting one Correlation Extractor

Each type of Extractor has its own set of parameters, some of them are visible when the extractor is selected, but the advanced ones are hidden by default, those are shown when the parameters section is expanded.

Expand_Advance_Section Extractor

By default, only Regex extractor will be able to be selected, to select other of the extractors available or a custom extractor there is an option More in the combo box which will display all the available extractors, here the desired extractor should be selected and added to actives extractors.

Add_Custom_Extractor

If another Extractor is selected, the previous values will be deleted. Filling all the fields, with the desired parameters, will allow the plugin to Extract the dynamic values from the responses.

More about how to configure each Correlation Extractor (this and the ones that comes with the Siebel Extension), please refer to our List of Correlation Extractors section.

# Selecting a Correlation Replacement

Just like the Correlation Extractors, the Regex Correlation Replacement will be selected, by default, when adding a Correlation Rule.

Selecting Replacement Correlation

Also, Correlation Replacements have their own Advance section, like Correlation Extractors

Expand_Advance_Section Replacement

As in Correlation Extractor, here to add any Correlation Replacement the option more should be used.

Add_Custom_Replacement

And their behavior goes sames as its predecessor. Once one option its selected, the fields to configure it, will be displayed right next to it.

More about how to configure each Correlation Replacements (this and the ones that comes with the Siebel Extension), please refer to our List of Correlation Replacements section.

Note that, each time you select a different Extractor or Replacement, inside your correlation rule, the values that you had set to the respective fields, will be lost. For Saving your Rule configurations, before getting creative, please refer to the Saving and Loading Rules section.

# Reference Variable

Once a value its extracted for the Correlation Extractor, it's stored in a variable, this field will determine the name of it. In future request, the Correlation Replacement will be applied and, if it successfully finds the place to apply it, will bring the value from here and replacement it there, for a smooth transition.

# List of Correlation Extractors

All the Correlation Extractors mentioned below comes either installed by default in the plugin, or as a part of the preloaded Siebel Template. To know more about how to load and save Correlation Rules Templates, please refer to the Saving and Loading Rules section, for further details about it.

In case none of the following ones fits the desired behavior your application requires, to correlate the dynamic variables that it might have, feel free to read the Customizing your one extensions section that we have prepared for you.

Regex

RegEx stands for Regular Expression, and relies on the use of Regular Expressions to find where the dynamic variable might found.

When the regular expression its matched, a Regex Extractor will be added to the sample when:

  1. The Regular Expression is matched, based on the configured properties
  2. The matched value is not repeated

This extractor comes installed, by default, in the plugin, and it receives 4 fields to be able to work properly:

Regex Correlation Extractor

  1. RegEx: which corresponds to the Regular Expression that will be used to perform the extraction.
  2. Match Number: In the case that the Regex matches more than once in the response, this number will indicate which one of all of them it's going to be extracted. Use the value -1 when you need to retrieve all matched values from the expressions.
  3. Match Group: In the case that the Regex contains, more than one group, this field indicates which one of those is going to be considered to do the extraction, once the Regex its matched. Only use positive numbers.
  4. Target: Which field to check the regular expression against. +
    • The following fields can be checked: (from JMeter documentation):
    • Body - the body of the response, e.g. the content of a web-page (excluding headers)
    • Body (unescaped) - the body of the response, with all Html escape codes replaced. Note that Html escapes are processed wi thought regard of context, so some incorrect substitutions may be made. Note that this option highly impacts performances, so use it only when absolutely necessary and be aware of its impacts.
    • Body as a Document - extract text from various type of documents via Apache Tika. Note that Body as a Document option can impact performance, so ensure it is OK for your test.
    • Request Headers - the request header of the HTTP sampler.
    • Response Headers - the response header of the HTTP sampler.
    • URL
    • Response Code - e.g. 200
    • Response Message - e.g. OK
  5. Multivalued: Multiple valuation is useful when we want to separate each unique value as a particular variant name from different responses. Variables extracted with multivalued are non-overwritable and additionally they have a specific format. See Variable Generation for case usages and variable formats. +In case the Regex Extractor is not matched, during a Replay of a Recorded flow, the replaced value will be <Reference Variable Name> + "_NOT_FOUND".

JSON

JSON stands for JavaScript Object Notation, and relies on the use of JSONPath Expressions to find where the dynamic variable might found.

When the JSONPath its matched, a JSONPath Extractor will be added to the sample when:

  1. The JSONPath is matched, based on the configured properties
  2. The matched value is not repeated

This extractor comes installed, by default, in the plugin, and it receives 4 fields to be able to work properly:

JSON Correlation Extractor

  1. JSON: which corresponds to the JSONPath Expression that will be used to perform the extraction.
  2. Match Number: In the case that the JSONPath matches more than once in the response, this number will indicate which one of all of them it's going to be extracted. Use the value -1 when you need to retrieve all matched values from the expressions.
  3. Target: Which field to check the regular expression against. +
    • The following fields can be checked: (from JMeter documentation):
    • Body - the body of the response, e.g. the content of a web-page (excluding headers)
  4. Multivalued: Multiple valuation is useful when we want to separate each unique value as a particular variant name from different responses. Variables extracted with multivalued are non-overwritable and additionally they have a specific format. See Variable Generation for case usages and variable formats. +In case the JSONPath Extractor is not matched, during a Replay of a Recorded flow, the replaced value will be <Reference Variable Name> + "_NOT_FOUND".

JMeter use JSONPath syntax from Jayway JsonPath (opens new window) Use the Jayway JsonPath syntax documentation as a reference.

Jayway JsonPath is a java port based on Stefan Goessner's original JSONPath implementation (opens new window).

It is possible to find multiple examples of JSONPath expressions on the websites mentioned above or on the Internet.

JMeter allows you to evaluate JSONPaths in the Sample results of the ViewResult using the view "JSON Path Tester". However, it is possible to use some other tools on the Internet that facilitate the evaluation and testing of JSONPath, such as the site jsonpath.com (opens new window)

JSONPath Example

An example will be provided below that will allow you to visually understand some general concepts of the JSONPath syntax.

{
+  "store": {
+    "book": [
+      {
+        "category": "reference",
+        "author": "Nigel Rees",
+        "title": "Sayings of the Century",
+        "price": 8.95
+      },
+      {
+        "category": "fiction",
+        "author": "Evelyn Waugh",
+        "title": "Sword of Honour",
+        "price": 12.99
+      },
+      {
+        "category": "fiction",
+        "author": "Herman Melville",
+        "title": "Moby Dick",
+        "isbn": "0-553-21311-3",
+        "price": 8.99
+      },
+      {
+        "category": "fiction",
+        "author": "J. R. R. Tolkien",
+        "title": "The Lord of the Rings",
+        "isbn": "0-395-19395-8",
+        "price": 22.99
+      }
+    ],
+    "bicycle": {
+      "color": "red",
+      "price": 399
+    }
+  }
+}
+

Some JSONPath query expressions and their expected result.

JSONPath Intended result
$.store.book[*].author the authors of all books in the store
$..author all authors
$.store.* all things in store, which are some books and a red bicycle
$.store..price the prices of everything in the store
$..book[2] the third book
$..book[2].author the third book's author
$..book[2].publisher empty result: the third book does not have a "publisher" member
$..book[-1] the last book in order
$..book[0,1] or $..book[:2] the first two books
$..book[?@.isbn] all books with an ISBN number
$..book[?@.price<10] all books cheaper than 10
$..* all member values and array elements contained in the input value

The IETF group in charge of creating Internet standards in February 2024 completed its work on the creation of RFC 9535 associated with JSONPath. +You can consult the RFC documentation in case you require more details about JSONPath +https://datatracker.ietf.org/doc/rfc9535/

# Variable Generation

The creation of JMeter variables for later usage is one of the pillars of this plugin. Therefore, this section is specially dedicated to understand and review all the possible scenarios.

The generation and assignment of variables are tied to the Extractors which are the ones in charge of extracting the matches and store them. Therefore, a detailed explanation of extractor configuration will be covered during this section.

The most used and complex extractor is the Regex Extractor. +This section will be divided into cases, from simple and common cases to unusual ones.

# Extract specific match from the response (overridable)

Description
Objective extract the second appearance of a character chain included on the response that matches the given regex
Configuration need to specify a variable name (the variable stored will use it), regex, desired match number and no need to check for multi-valued
Visualization extractor_configuration_visualization
Overall value will be stored in a JMeter variable, with the exact name as the value introduced on the reference variable name field. If a variable exists (from previous extractions) the variable will be overwritten with new match value

# Extract specific match from a response (not overridable)

Description
Objective extract a certain value from a specific match number on the response. The value will be saved in a non-overwritable variable.
Configuration variable name, regex, desired match number and multivalue must be selected
Visualization extractor_configuration_visualization
Overall value will be extracted and stored in a variable with the following convention: E.g: var#34
  • var: reference variable name
  • #34: represents the variable count number
Note: this variable will endure the whole execution

# Extract multiple variables that can be overwritten

Description
Objective extract all values that match the regex on the response
Configuration variable name, regex, match number needs to be lower than 0 (E.g: -1). No need for multi-valued.
Visualization extractor_configuration_visualization
Overall a new variable will be created to store every match found on the response. If the variable already exists, it will be overwritten. The format of this type of variable consists of a prefix (reference variable name) with an underscore followed by the integer which represents the match number of the extracted value. E.g: ID_1
Important: If variables are been extracted in previous responses, for instance, 5 matches (ID_1, ID_2,..., ID_5), when another response arrives with new matches, these variables will not just be overwritten, will be deleted. If the new response matches thrice, then the resultant variables will be ID_1, ID_2, ID_3. Previous variables ID_4 and ID_5 will no longer exist.

# Extract multiple variables that can NOT be overwritten

Description
Objective extract all values that match the regex on the response and store them immutably
Configuration variable name, regex, match number needs to be lower than 0 (E.g: -1). Multi-valued needs to be checked
Visualization extractor_configuration_visualization
Overall a new variable will be created to store every match found on the response. This type of extractions have a particular format name. E.g: myVar#2_1 Where:
  • myVar: reference variable name
  • #2: hash followed by the variable count number
  • _1: number of match in that response

New JMeter variables are created (with the format showed above) every time a response arrives, and the regex matches more than twice.
Note: if the response contains one match, and optimization is done. Therefore, the generated variable will be like in section Extract specific match from a response (not overwritable)

# Variable Replacement

The replacement of dynamic or static data in a request for JMeter Variables is one of the main objectives of the Auto Correlation Recorder.

Mainly, the idea is to replace data for variables, therefore, we get a proper correlated script. +The data we want to replace needs to match a certain regex, condition or even a criteria. +The variable replacement system does support the scenario when the match needs to be replaced for a literal instead of a JMeter Variable (not common case).

Let's give an example in order to set the idea of a replacement. +Suppose we have a website were is possible to buy products. Those products are identified by a unique id. +Our objective will be to replace the id number for a JMeter Variable, to later on, buy any product of the store just by modifying the JMeter Variable value. +Considering an url like www.my-market-place.com/cart.html?product_id=2 +The regex we have to build in order to match the data we want to replace, it should be something like: product_id=(\d). +The result we are looking for should be a request with a parametrized value, in that case, the id number. +The desired result will look something like: +www.my-market-place.com/cart.html?product_id=${id_product}

Now that we have a basic idea of a replacement, lets explain the most complex and used replacement. The Regex Correlation Replacement which accepts three parameters:

  1. regex: the regex needed to match the data to be replaced on a request.
  2. replacementString: this field is used to set JMeter Functions, or even literals to be used on the comparison of the replacement match value (if value is not ignored).
  3. ignore value: this check will determine if the match will be compared against all the JMeter Variables or even the execution of a function that can be declared on the replacementString field. When is checked, it will replace without comparing.

Below is shown all the possible scenarios. Each scenario contains an Objective which will explain the problem we want to achieve. Pre-loaded variables will set us in a current variable context, in consideration of generating those variables is mandatory to read the section variable-generation. Context will provide all necessary information for the scenario, as a global configuration will work under the domain www.my-market-place.com. The Visualization will show the configuration made on the replacement in order to achieve the desired result.

# Replace single parameter for a variable in request

Description
Objective replace a parameter of a request for a JMeter Variable.
Pre-loaded variables ID = 2
Context Request is /cart.html?product_id=2
Visualization single_parameter_replacement
Overall Once the regex matches on the request, the matched value will be 2. Then it will compare the matched value against all the variables stored. When the matched value equals any variable stored, the replacement will be triggered
Replacement result www.my-market-place.com/cart.html?product_id=${ID}

# Replace multiple parameters for variables in request

Description
Objective replace multiple parameters of a request for JMeter Variables.
Pre-loaded variables ID_1 = 2, ID_2 = 3, ID_3 = 4, ID_SESSION = rP/tHk<tsR!v>
Context Request is /cart.html?product_id=2&product_id=4
Visualization multiple_parameter_replacement
Overall For this multi replacement, the regex will match twice (two appearances of product_id), therefore, each matched value will be replaced for the variables containing same value.
Replacement result www.my-market-place.com/cart.html?product_id=${ID_1}&product_id=${ID_3}

# Replace a parameter for the result of a variable transformation in request

Description
Objective replace a parameter in request that uses a pre-loaded variable but transformed.
Pre-loaded variables ID = 2, ID_SESSION = rP/tHk<tsR!v>
Context Request is /index.html?session=rP%2FtHk%3CtsR%21v%3E. In this particular case, the session id is extracted decoded (ID_SESSION value) , but on the request it is encoded. Therefore, the stored variable will be different to the matched value on the request. Because of that, we need to use the field replacementString in order to make that transformation. For this example we are using a JMeter Function called urlencode (opens new window)
Visualization single-transformed-replacement
Overall Since the replacement string is not empty, the plugin will execute (if executable, could also be a literal) the content. The result of the execution will be used to compare against the regex replacement matched value. When those values match, the replacement is made by placing the content of replacementString on the request.
Replacement result www.my-market-place.com/index.html?session=${__urlencode(${ID_SESSION})}

# Replace multiple parameters for the result of a variable transformation in request

Description
Objective replace a parameter in request that uses pre-loaded variables but transformed.
Pre-loaded variables prod_1=red car, prod_2=blue car
Context Request is delete.html?identifier=red+car&indetifier=blue+car. In this case, we have to replace two parameters of the request. The value that will be placed on the request, needs to be encoded. Since the pre-loaded variables are not encoded, we need to make a transformation
Visualization multiple-transformed-replacement
Overall Similar to the previous scenario, in order to proper replace for variables, we have to make a transformation, that will be done by calling the __urlencode (opens new window) function provided by JMeter. Since the pre-loaded variables are result of a multiple extraction. The replacement string will have the variable name without the suffix. The plugin automatically will detect that and it will access to all the stored values for that reference variable name.
Replacement result www.my-market-place.com/index.html?identifier=${__urlencode(${prod_1})}&identifier=${__urlencode(${prod_2})}

# Replace single parameter ignoring matched value

Description
Objective replace a parameter in request that uses pre-loaded variables but transformed.
Pre-loaded variables No variables used for this case
Context Request is /main.html?time=1516540541624. This request contains a parameter which is the current time in milliseconds, therefore, if we had that value stored in a variable it will not work, since we need to set a request with the current time. Therefore we will use the function __time() (opens new window) provided by JMeter
Visualization ignore_value_replacement
Overall It is not possible to compare values in order to achieve our objective, therefore we need to set the current time neglecting the previous value. For that reason the ignore value is checked, it will not execute and compare the replacement string content.
Replacement result www.my-market-place.com/main.html?time=${__time()}

# List of Correlation Replacements

All the Correlation Replacements mentioned below are installed by default in the plugin. To know more about how to load and save Correlation Rules Templates, please refer to the Saving and Loading Rules section, for further details about it.

In case none of the following Replacements fits the desired behavior your application requires, to correlate the dynamic variables that it might have, feel free to read the Customizing your one extensions section that we have prepared for you.

Regex

Similarly to the Regex Correlation Extractor, this one also receives a Regular Expression in order to find where the stored value is going to be replaced. Additionally, if a regex extractor with multivalued was added, the replacement will be applied automatically. It will look for a variable with same value as the request match in order to make the replacement. In short, no need to configure replacement to work with a multi-value or single-value.

Regex Correlation Replacement

JSON

Similarly to the JSON Correlation Extractor, this one also receives a JSONPath Expression in order to find where the stored value is going to be replaced. Additionally, if a JSONPath extractor with multivalued was added, the replacement will be applied automatically. It will look for a variable with same value as the request match in order to make the replacement. In short, no need to configure replacement to work with a multi-value or single-value.

JSON Correlation Replacement

For examples of using JSONPath expressions, refer to the JSON Correlation Extractor documentation.

The logic behind Replacement string and Ignore value is the same as Regex Correlation Replacement. Go to the documentation related to Variable Replacement for usage examples.

+ + + diff --git a/guide/custom-extensions/custom-extensions.html b/guide/custom-extensions/custom-extensions.html new file mode 100644 index 0000000..c232b6d --- /dev/null +++ b/guide/custom-extensions/custom-extensions.html @@ -0,0 +1,81 @@ + + + + + + Custom Extensions | Auto Correlation Recorder + + + + + + + + + + + +

# Custom Extensions

When the current Correlation Extensions are not enough, you can create your own Correlation Extension. +In this guide we will explain how to create them and how you can extend the current ones.

# Requisites

These are the minimum requisites that you will need to start:

  • Use java 1.8
  • Maven 1.3+
  • JMeter 5.2.1

# Correlation Rule Structure

Before we begin with the elements that are required to create a Correlation Extension, we need to +add the Auto Correlation Recorder as dependency. To do that, you need to add the following to your pom.xml:

  1. The Auto Correlation Recorder dependency
  2. The JMeter dependency

An example of a basic pom.xml file would be:

<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+   <modelVersion>4.0.0</modelVersion>
+   <properties>
+      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+      <jmeter.version>3.3</jmeter.version>
+   </properties>
+   <dependencies>
+      <dependency>
+         <groupId>org.apache.jmeter</groupId>
+         <artifactId>ApacheJMeter_core</artifactId>
+         <version>${jmeter.version}</version>
+         <scope>provided</scope>
+         <exclusions>
+            <exclusion>
+               <artifactId>commons-logging</artifactId>
+               <groupId>commons-logging</groupId>
+            </exclusion>
+         </exclusions>
+      </dependency>
+      <dependency>
+         <groupId>org.apache.jmeter</groupId>
+         <artifactId>ApacheJMeter_http</artifactId>
+         <version>${jmeter.version}</version>
+      </dependency>
+   </dependencies>
+</project>
+

Include the latest release (opens new window) of the plugin into your project.

One of the easiest ways to do so it's adding JitPack to your dependency file and then point to the plugin repository and version. For further information on how to add it to your project, refer to their Official Documentation (opens new window).

# Correlation Rule Structure

As mentioned in the Readme file, one Correlation Rule has 3 parts:

  • A Reference Variable
  • A Correlation Extractor
  • A Correlation Replacement

# Reference Variable

Generally, a Reference Variable is a bridge between a value extracted from Correlation Extractor and a Correlation Replacement.

Is the name of the variable where the information extracted from a Correlation Extractor, will be stored and, from where the Correlation Replacements will obtain the information to replace it in the configured Responses.

# Correlation Extractor

A Correlation Extractor it's a part of the Rule that contains certain functions (like Regex, for example), that extracts from each request, the dynamic information and, stores it into the predefined Reference Variable.

# Correlation Replacement

Later on, in every subsequent response, the Correlation Replacement will figure out where it needs to replace the extracted information, that it’s stored in the Reference Variable corresponding to the Rule it belongs to.

# Order

It's important to take into consideration the order of the Correlation Rules, as they represent the priority in which they are applied. For example:

When a request is made, all C. Replacements will be applied first, in the order they appear in the list of rules. +When a response is received, only the ones that pass the Content-Type filter will be considered for Extraction. If left blank, all responses will be considered. +When a response is allowed, for the previous validation, all C. Extractors will be applied, in the order they appear in the list of rules.

When making your own Custom Extension, consider the order of the extracted values if you are going to depend on stored variables and, each replacement will use variables that were stored before they are applied.

# Relationships

The following diagram will contain all the relationships between the Rule and the previously mentioned parts.

diagram

To resume the UML Diagram:

Every Rule Will contain:

  • One Reference Variable, which is a String
  • One Correlation Extractor, which extends from CorrelationRulePartTestElement
  • One Correlation Replacement, which also extends from CorrelationRulePartTestElement

During the process of making your Custom Correlation Extensions, you must extend one or another of the CorrelationRulePartTests elements, so the plugin can get the basic methods from it and place it with their respective set.

Its highly recommended that you check all those classes before continuing.

# CorrelationRulePartTestElement

This class, located at: com.blazemeter.jmeter.correlation.core.CorrelationRulePartTestElement, contains all the methods that allow the plugin, not only to build the interface which will be able to configure the Extension but also manages the Contexts.

# CorrelationExtractor

This class, located at: com.blazemeter.jmeter.correlation.core.extractors.CorrelationExtractor, contains the basic structure to be able to target the Responses, save the values once configured, and load the values from the files.

# CorrelationReplacement

This class, located at: com.blazemeter.jmeter.correlation.core.replacements.CorrelationReplacement, contains the basic structure to be able to target the Request, save the values once, and load the values from the files.

Process of making your Extension +In order to develop your Custom Extensions, you can either:

  • Create from scratch a brand-new Extension, extending CorrelationExtractor/CorrelationReplacement, and implementing the desired customizations.
  • Extend from an already created, tested, and exposed CorrelationExtractor/CorrelationReplacement, and fix the logic so it behaves the way you want it to do.

We recommend that you do the latter one since it's going to be easier to understand the flow of the plugin that way. You could take the whole, default installed, Siebel Extension package, for example, located at com.blazemeter.jmeter.correlation.siebel. Each one of those Custom Extensions, extend from one of the core classes and rewrite the logic to work on a Siebel Environment application.

Take the time to look at those files before going into the rest of the sections?

# Considerations

When developing and configuring a Correlation Rule, don't forget that there are certain parameters that need to be covered. Take them into account when implementing your extensions.

# A Valid Rule

A valid rule is one that has all the necessary components to be able to be saved, loaded, and applied when recording. For that, you need to consider:

  • The Reference Variable must always be Non-Empty.
  • Rules with only Reference Variables are not valid rules, and won’t allow either start recording or save the Correlation Template.

# JComponents allowed for each rule

At this very moment, when defining the fields for an Extension, the only allowed Components to be rendered are:

  • JComboBox (for list of static values)
  • JTextFields (for variable values)

The values obtained by those Fields it’s received as a string and will be set into the rule with the setParams(String ...) method. +From that point on forward, you must validate the non-empty state of those values, and the required conversions (casting) of those values.

Read more about it in the CustomCorrelationExtractor (opens new window) example.

# Unique class names

Better safe than sorry

Try always to use names that are not repeated or that might collapse with the ones that are already developed. You don't want to load a class into the plugin and end up using another one by mistake.

# Make your own extensions

Its highly recommended that you check the Class diagram displayed in Relationships before jumping into this section

# Basic Relationship on each rule part

The following set of rules should be followed in order to have the correct access to all the capabilities that we program in the plugin. That been said, please follow these instructions:

  1. Each CorrelationExtractor or CorrelationReplacement extends CorrelationRulePartTestElement

  2. Therefore, each Custom Extension that you develop should either extend CorrelationExtractor or CorrelationReplacement class, accordingly its type and the moment it will be applied.

    Note: The only exception to this rule it's when you want to enhance some functionalities of an already developed Extension, in that case, you could extend that class instead.

  3. Each CorrelationExtractor or CorrelationReplacement has the possibility to use a CorrelationContext, that will allow covering a more inclusive and extensive set of variables. The CorrelationContexts are shared between each Extension that has it is assigned to. Depending on your personal needs and the complexity of your project, you might want to make your very own.

  4. By default, none of the CorrelationExtractor or CorrelationReplacement has implemented the method getSupportedContext() from CorrelationRulePartTestElement unless it has its very set of complex variables that need to share between rules and Correlations. Like you could check in the Siebel's Extensions.

  5. Each Correlation must be named using this standard:

{Name of the Functionality of the Correlation} + "Correlation" + The Type
+

This is important, in most of the cases, to properly show the name of the Extension in the respective combo box.

# Final Words

Review these links for a further understanding of correlating concepts and examples:

+ + + diff --git a/guide/custom-extensions/index.html b/guide/custom-extensions/index.html new file mode 100644 index 0000000..291db87 --- /dev/null +++ b/guide/custom-extensions/index.html @@ -0,0 +1,85 @@ + + + + + + Custom Extensions | Auto Correlation Recorder + + + + + + + + + + + +

# Custom Extensions

When the current Correlation Extensions are not enough, you can create your own Correlation Extension. +In this guide we will explain how to create them and how you can extend the current ones.

# Requisites

These are the minimum requisites that you will need to start:

  • Use java 1.8
  • Maven 1.3+
  • JMeter 5.2.1

# Dependencies

Before we begin with the elements that are required to create a Correlation Extension, we need to +add the Auto Correlation Recorder as dependency. To do that, you need to add the following to your pom.xml:

  1. The Auto Correlation Recorder dependency
  2. The JMeter dependency

An example of a basic pom.xml file would be:

<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+   <modelVersion>4.0.0</modelVersion>
+   <properties>
+      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+      <jmeter.version>3.3</jmeter.version>
+   </properties>
+   <dependencies>
+      <dependency>
+         <groupId>org.apache.jmeter</groupId>
+         <artifactId>ApacheJMeter_core</artifactId>
+         <version>${jmeter.version}</version>
+         <scope>provided</scope>
+         <exclusions>
+            <exclusion>
+               <artifactId>commons-logging</artifactId>
+               <groupId>commons-logging</groupId>
+            </exclusion>
+         </exclusions>
+      </dependency>
+      <dependency>
+         <groupId>org.apache.jmeter</groupId>
+         <artifactId>ApacheJMeter_http</artifactId>
+         <version>${jmeter.version}</version>
+      </dependency>
+   </dependencies>
+</project>
+

Include the latest release (opens new window) of the plugin into your project.

One of the easiest ways to do so it's adding JitPack to your dependency file and then point to the plugin repository and version. For further information on how to add it to your project, refer to their Official Documentation (opens new window).

# Correlation Rule Structure

As mentioned in the Readme file, one Correlation Rule has 3 parts:

  • A Reference Variable
  • A Correlation Extractor
  • A Correlation Replacement

# Reference Variable

Generally, a Reference Variable is a bridge between a value extracted from Correlation Extractor and a Correlation Replacement.

Is the name of the variable where the information extracted from a Correlation Extractor, will be stored and, from where the Correlation Replacements will obtain the information to replace it in the configured Responses.

# Correlation Extractor

A Correlation Extractor it's a part of the Rule that contains certain functions (like Regex, for example), that extracts from each request, the dynamic information and, stores it into the predefined Reference Variable.

# Correlation Replacement

Later on, in every subsequent response, the Correlation Replacement will figure out where it needs to replace the extracted information, that it’s stored in the Reference Variable corresponding to the Rule it belongs to.

# Order

It's important to take into consideration the order of the Correlation Rules, as they represent the priority in which they are applied. For example:

When a request is made, all C. Replacements will be applied first, in the order they appear in the list of rules. +When a response is received, only the ones that pass the Content-Type filter will be considered for Extraction. If left blank, all responses will be considered. +When a response is allowed, for the previous validation, all C. Extractors will be applied, in the order they appear in the list of rules.

When making your own Custom Extension, consider the order of the extracted values if you are going to depend on stored variables and, each replacement will use variables that were stored before they are applied.

# Relationships

The following diagram will contain all the relationships between the Rule and the previously mentioned parts.

diagram

To resume the UML Diagram:

Every Rule Will contain:

  • One Reference Variable, which is a String
  • One Correlation Extractor, which extends from CorrelationRulePartTestElement
  • One Correlation Replacement, which also extends from CorrelationRulePartTestElement

During the process of making your Custom Correlation Extensions, you must extend one or another of the CorrelationRulePartTests elements, so the plugin can get the basic methods from it and place it with their respective set.

Its highly recommended that you check all those classes before continuing.

# CorrelationRulePartTestElement

This class, located at: com.blazemeter.jmeter.correlation.core.CorrelationRulePartTestElement, contains all the methods that allow the plugin, not only to build the interface which will be able to configure the Extension but also manages the Contexts.

# CorrelationExtractor

This class, located at: com.blazemeter.jmeter.correlation.core.extractors.CorrelationExtractor, contains the basic structure to be able to target the Responses, save the values once configured, and load the values from the files.

# CorrelationReplacement

This class, located at: com.blazemeter.jmeter.correlation.core.replacements.CorrelationReplacement, contains the basic structure to be able to target the Request, save the values once, and load the values from the files.

Process of making your Extension +In order to develop your Custom Extensions, you can either:

  • Create from scratch a brand-new Extension, extending CorrelationExtractor/CorrelationReplacement, and implementing the desired customizations.
  • Extend from an already created, tested, and exposed CorrelationExtractor/CorrelationReplacement, and fix the logic so it behaves the way you want it to do.

We recommend that you do the latter one since it's going to be easier to understand the flow of the plugin that way. You could take the whole, default installed, Siebel Extension package, for example, located at com.blazemeter.jmeter.correlation.siebel. Each one of those Custom Extensions, extend from one of the core classes and rewrite the logic to work on a Siebel Environment application.

Take the time to look at those files before going into the rest of the sections?

# Considerations

When developing and configuring a Correlation Rule, don't forget that there are certain parameters that need to be covered. Take them into account when implementing your extensions.

# A Valid Rule

A valid rule is one that has all the necessary components to be able to be saved, loaded, and applied when recording. For that, you need to consider:

  • The Reference Variable must always be Non-Empty.
  • Rules with only Reference Variables are not valid rules, and won’t allow either start recording or save the Correlation Template.

# JComponents allowed for each rule

At this very moment, when defining the fields for an Extension, the only allowed Components to be rendered are:

  • JComboBox (for list of static values)
  • JTextFields (for variable values)

The values obtained by those Fields it’s received as a string and will be set into the rule with the setParams(String ...) method. +From that point on forward, you must validate the non-empty state of those values, and the required conversions (casting) of those values.

Read more about it in the CustomCorrelationExtractor (opens new window) example.

# Unique class names

Better safe than sorry

Try always to use names that are not repeated or that might collapse with the ones that are already developed. You don't want to load a class into the plugin and end up using another one by mistake.

# Make your own extensions

Its highly recommended that you check the Class diagram displayed in Relationships before jumping into this section

# Basic Relationship on each rule part

The following set of rules should be followed in order to have the correct access to all the capabilities that we program in the plugin. That been said, please follow these instructions:

  1. Each CorrelationExtractor or CorrelationReplacement extends CorrelationRulePartTestElement

  2. Therefore, each Custom Extension that you develop should either extend CorrelationExtractor or CorrelationReplacement class, accordingly its type and the moment it will be applied.

    Note: The only exception to this rule it's when you want to enhance some functionalities of an already developed Extension, in that case, you could extend that class instead.

  3. Each CorrelationExtractor or CorrelationReplacement has the possibility to use a CorrelationContext, that will allow covering a more inclusive and extensive set of variables. The CorrelationContexts are shared between each Extension that has it is assigned to. Depending on your personal needs and the complexity of your project, you might want to make your very own.

  4. By default, none of the CorrelationExtractor or CorrelationReplacement has implemented the method getSupportedContext() from CorrelationRulePartTestElement unless it has its very set of complex variables that need to share between rules and Correlations. Like you could check in the Siebel's Extensions.

  5. Each Correlation must be named using this standard:

{Name of the Functionality of the Correlation} + "Correlation" + The Type
+

This is important, in most of the cases, to properly show the name of the Extension in the respective combo box.

# Final Words

Review these links for a further understanding of correlating concepts and examples:

+ + + diff --git a/guide/custom-extensions/the_flow_explanation.html b/guide/custom-extensions/the_flow_explanation.html new file mode 100644 index 0000000..af67c15 --- /dev/null +++ b/guide/custom-extensions/the_flow_explanation.html @@ -0,0 +1,46 @@ + + + + + + The Flow | Auto Correlation Recorder + + + + + + + + + + + +

# The Flow

In the following sections, we will cover topics regarding how JMeter process and sends the Requests and Responses to the plugin, when and where this will be affected by the configured Correlation Rules, and how the order of the methods affects the results the user will see during the recording.

# The Steps

In General Terms, the recording follows this order, for the case that involves processing with the plugin:

  1. One Request goes to the server
  2. The server gives a Response
  3. JMeter takes both and sends them to the plugin
  4. The Proxy verifies and sends them to the CorrelationEngine (deliverSampler() method)
  5. The Engine applies all the Rules to the Response, Request and Recorded Sampler (process() method)
  6. The Proxy takes the processed values back to JMeter (super.deliverSampler() method)
  7. JMeter sends the Recorded Sampler to the configured Recording Controller

# The Explanation

Now, on a detailed point of view, let's talk about each one of the steps of processing the recorded Samplers

# Proxy

# Deliver Recorded Sampler

For the Auto Correlation Recorder Plugin, the Proxy is handled by CorrelationProxyControl.java, who receives an HTTPSamplerBase (the recorded Sampler), and the SampleResult (the request and the response), process and sends it to the CorrelationEngine to be processed.

All that occurs in the deliverSampler method.

  public void deliverSampler(HTTPSamplerBase sampler, TestElement[] testElements, SampleResult result)
+

# Context Reset

The CorrelationProxyControl.java also holds the responsibility of triggering the Contexts reset when a new recording starts, so each recorder flow starts from a clean base.

# Engine

The Engine contains, not only the configured Correlation Rules setup before starting the recording, but also each one of the Contexts (CorrelationContexts and any Custom Context) associated with then, in their updated form. This role is been handled by the CorrelationEngine.java

# Responsibilities

At this point, the only responsibilities of the Engine are:

  1. Apply all the configured CorrelationReplacements to the HTTPSamplerBase (the record)
  2. Update all the Contexts with the info that comes from the SampleResult (the result)
  3. Filter the Recorder HTTPSamplerBase by the Response Filter (opens new window)'s type
  4. Apply all the configured CorrelationExtractors to the HTTPSamplerBase (in case this one matches the Filter MIME Type (opens new window) from Step 3)

Anything that happens in the steps 1 and 4, will be handled by the CorrelationRule (applyReplacements for the former, and addExtractors for the later), for each configured Rule.

# Special Considerations

  1. Is important to mention that, because of the order of how the Correlation Components are applied and updated, the values that they extract or replace, only will be used after a future request. Because of this:
  • Each value that is extracted from a Correlation Extractor, during the recording, will only be available for a Correlation Replacements in the next Request made
  • All the updated context values only will be considered, in the actual Sampler, by the Correlation Extractor but, the Correlation Replacements will need to wait for the next Sampler to be able to see it. The execution of the Correlation’s Flow is, as mentioned before:

Receives a Request → Receives a Response → Applies Correlation Replacements → Update Correlation Contexts → Applies Correlation Replacements

+ + + diff --git a/guide/index.html b/guide/index.html new file mode 100644 index 0000000..1e5ec74 --- /dev/null +++ b/guide/index.html @@ -0,0 +1,54 @@ + + + + + + User Guide | Auto Correlation Recorder + + + + + + + + + + + +

# User Guide

Auto Correlation Recorder it's a JMeter's (opens new window) plugin that simplifies +the process of recording for applications with Dynamic Variables by providing automatic correlations of variables.

You can perform exploratory detections of dynamic variables and create correlation rules to correlate them +in future recordings, or you can use the automatic correlations and let the plugin do the work for you.

Regardless of the method you choose, the plugin will help you create a test script that is more reliable and +easier to maintain.

# Key Features

  • Automated correlation detection and suggestions for faster and more accurate test script creation
  • Access to SIEBEL templates for convenience and faster test script creation
  • Auto install, download and update repositories for a convenient and hassle-free team collaboration
  • Easy customization options for efficient test script creation and increased productivity
  • Customizable correlations to match your specific testing needs and requirements
  • Shareable templates to streamline team collaboration and accelerate project development
  • Customizable extensions to enhance functionality and add new capabilities
  • Comprehensive examples and documentation for easy learning and fast onboarding

Additional Features:

  • Automatic proposal of changes to correlate detected dynamic values for faster script development
  • Automatic generation of correlation rules for use in following recordings for even faster script creation
  • Automatic testing of proposed changes for a faster and more reliable test script

# Benefits

Here are 10 key benefits of using the JMeter's Auto Correlation Recorder Plugin:

  1. Fast script creation
  2. Preloaded templates
  3. Hassle-free collaboration
  4. Customizable correlations
  5. Easy customization
  6. Streamlined collaboration
  7. Customizable extensions
  8. Dynamic value correlation
  9. Fast rule generation
  10. Reliable testing.

# System requirements

The system requirements to use the plugin are pretty much the sames as a regular JMeter environment, vary depending on +the operating system. In general terms, the requirements for each operating system are:

  • Windows: Windows 7 or later, 1 GB of RAM (2 GB recommended), 250 MB of free disk space
  • macOS: macOS 10.10 or later, 1 GB of RAM (2 GB recommended), 250 MB of free disk space
  • Linux: kernel 2.6.26 or later, 1 GB of RAM (2 GB recommended), 250 MB of free disk space

Please note that these are the minimum requirements, and higher specifications may be necessary for larger or more +complex load testing scenarios.

TIP

For a better experience, we recommend the usage of JMeter 5.6.3 or later.

+ + + diff --git a/guide/installation-configuration.html b/guide/installation-configuration.html new file mode 100644 index 0000000..5637c66 --- /dev/null +++ b/guide/installation-configuration.html @@ -0,0 +1,64 @@ + + + + + + Installation and Configuration Guide | Auto Correlation Recorder + + + + + + + + + + + +

# Installation and Configuration Guide

This guide will walk you through the process of installing the Auto Correlation Recorder plugin for JMeter. +It's quick and easy, but you will need to make sure you have a few prerequisites before you start.

# Prerequisites

  1. JMeter: If you haven't done so already, download and install JMeter. You can find the latest version of +JMeter here (opens new window).
  2. JMeter Plugins Manager: Ensure that you have installed the JMeter Plugins Manager before installing +the Auto Correlation Recorder plugin. Learn how to install it in this article. (opens new window)

# Installation

Follow these steps for an automatic installation of the latest version:

  1. Launch JMeter and open the JMeter Plugins Manager.
  2. In the Available Plugins tab, search and select "BlazeMeter - Auto Correlation Recorder Plugin".
  3. Click the "Apply Changes and Restart JMeter" button and wait for the installation process to complete.

Once JMeter restarts, the Auto Correlation Recorder plugin will be installed. You can verify this by opening the +Plugins Manager and checking the Installed Plugins tab.

# Configuration

Before we jump right into recording, let's take a look at the basic configuration options available for the +Auto Correlation Recorder plugin.

# Local configurations

  1. Disable redirect disabling: Set the proxy.redirect.disabling property to false in your user.properties file. +This is required for a proper and automatic correlation experience.
  2. Set deflate mode: If you plan to record in Siebel CRM environments, set the httpclient4.deflate_relax_mode +property to true in your user.properties file. This will help you avoid Unexpected end of input stream errors.

# Proxy configurations

If you have already configured the local proxy, you can skip this section.

We need to configure the local proxy, otherwise, you will not be able to record +any requests. To do so, take a look at the "Configure your browser to use the JMeter Proxy" section in the +JMeter documentation (opens new window).

WARNING

If the server you are recording is running in your local machine, you will need to configure your browser to +allow recording of local requests.

In such case, you will need to search for "How to configure the JMeter proxy to record local requests" and follow +the instructions for your browser.

In Firefox, for instance, go to about:config and set network.proxy.allow_hijacking_localhost to true.

After this, you should be able to start recording.

+ + + diff --git a/guide/installation-guide.html b/guide/installation-guide.html new file mode 100644 index 0000000..6458e11 --- /dev/null +++ b/guide/installation-guide.html @@ -0,0 +1,77 @@ + + + + + + Installing the Plugin | Auto Correlation Recorder + + + + + + + + + + + +

# Installing the Plugin

In this section, you will find instructions on how to install the plugin on your system.

The installation is usually the same regardless of your operating system. However, the configuration steps may vary +since it depends on how your proxy is configured.

# Prerequisites

# Plugin

Before attempting to install the plugin, make sure you have the following prerequisites:

  1. JMeter: If you haven't done so already, download and install JMeter. You can find the latest version of +JMeter here (opens new window).
  2. JMeter Plugins Manager: Ensure that you have installed the JMeter Plugins Manager before installing +the Auto Correlation Recorder plugin. Learn how to install it in this article. (opens new window)

These two downloads are all you need to get started.

# Integration with BlazeMeter

If you want to use the plugin with BlazeMeter, you will also need to have the following:

  1. A BlazeMeter account. If you don't have one, you can sign up for free (opens new window).
  2. A BlazeMeter api-key. If you don't have one, you can learn how to generate it from this article BlazeMeter Api Key (opens new window).

# Installation

The installation of the plugin is usually done using the Plugin Manager, which is the recommended way of installing, however, +you can also do it manually. This section will cover both methods.

# With Plugin Manager

  1. Launch JMeter and open the JMeter Plugins Manager.
  2. In the Available Plugins tab, search and select "BlazeMeter - Auto Correlation Recorder Plugin".
  3. Click the "Apply Changes and Restart JMeter" button and wait for the installation process to complete.

Once JMeter restarts, the Auto Correlation Recorder plugin will be installed.

# Manually

  1. Go to the Auto Correlation Recorder plugin page (opens new window) and download the +latest version of the plugin, with the dependencies.
  2. Place the Plugin jar in the ext folder of your JMeter installation. The ext folder is usually located in +<JMeter_Home>/lib/ext.
  3. Place the dependencies jars in the lib folder of your JMeter installation. The lib folder is usually located in +<JMeter_Home>/lib.
  4. Restart JMeter.

# Verifying

You can verify the plugin being installed by opening the Plugins Manager and checking the Installed Plugins tab. Search for +the Auto Correlation Recorder plugin and make sure it is listed there.

Another way to ensure the plugin is properly installed, is by attempting to load the Auto Correlation Recorder template. To do so, +follow these steps:

  1. Launch JMeter and open the File menu.
  2. Select the Templates option and then click on Load.
  3. Search for the Auto Correlation Recorder template and click on Open.
  4. If the template loads successfully, the plugin is properly installed.

# Updating

If you already had the plugin installed and want to update it, you can do so by following the same steps as the installation, +but instead of searching the plugin in the Available Plugins tab, search for it in the Installed Plugins tab.

In case there is a new version of the plugin, the name of the extension will be bold and list of updated artifacts will be listed. Press Install and Restart JMeter

# Uninstall

If you want to uninstall the plugin, you can do so by following these steps:

  1. Launch JMeter and open the JMeter Plugins Manager.
  2. In the Installed Plugins tab, search and select "BlazeMeter - Auto Correlation Recorder Plugin".
  3. Uncheck the plugin and click the "Apply Changes and Restart JMeter" button.
  4. Wait for the uninstallation process to complete.
  5. Restart JMeter.

# Configuration

Before we jump right into recording, let's take a look at the basic configuration options available for the Auto Correlation Recorder plugin.

# Properties

Here is a list of properties that you need to configure in order to use the Auto Correlation Recorder plugin:

  1. Disable redirect disabling: Set the proxy.redirect.disabling property to false in your user.properties file. +This is required for a proper and automatic correlation experience.
  2. Set deflate mode: If you plan to record in Siebel CRM environments, set the httpclient4.deflate_relax_mode +property to true in your user.properties file. This will help you avoid Unexpected end of input stream errors.
  3. (Optional) Set the scope of post-processors to all: Set the Sample.scope property to all in your +user.properties file. This will help you to avoid the post-processors to only limit to the main sampler.

# BlazeMeter Api Key

If you are planning on using the integration with Blazemeter, you need to provide your BlazeMeter api-key. +You can do that by doing one of the following options:

1. Drop the file in your bin directory

It is as simple as it sounds. You just need to drop the api-key.json file in your <JMeter_Home>/bin directory, +making sure you don't have any other api-key.json file in that directory.

Restart JMeter

2. Configure the properties file

If you don't want to drop the api-key.json file in your bin directory, you can provide the path to your api-key.json file in the configuration. +To do that, you need to open the blazemeter.properties file in your <JMeter_Home>/bin directory and add the following line:

blazemeter.api.key.file=<path_to_your_api_key.json>
+

Restart JMeter

Note: make sure the path you provide is correct, it points to a file, rather than a folder, and the file exists. +It should look something like this:

blazemeter.api.key.file=/Users/username/.blazemeter/api-key.json
+

# Proxy configurations

WARNING

If you have already configured the local proxy, you can skip this section.

You might also follow the steps in JMeter's Official documentation as can be seen in +this article. (opens new window).

To configure JMeter to record HTTP/HTTPS traffic in Chrome, Firefox, or Opera, you need to set up a proxy server in +JMeter and configure your web browser to use that proxy.

# Windows

# 1. Configure JMeter Proxy

  1. Open JMeter and create a new Test Plan.
  2. Right-click on the Test Plan and select "Add" > "Threads (Users)" > "Thread Group".
  3. Right-click on the Thread Group and select "Add" > "Logic Controller" > "Recording Controller".
  4. Right-click on the Recording Controller and select "Add" > "Sampler" > "HTTP(S) Test Script Recorder".
  5. In the HTTP(S) Test Script Recorder, click on the "Start" button to start the proxy server.
  6. Click on the "HTTP(S) Test Script Recorder" element in the tree view and configure the following settings:
  7. Set the "Target Controller" to the Recording Controller you created in step 3.
  8. Set the "Port" to an available port (e.g. 8888).
  9. Set the "Grouping" to "Put each group in a new transaction controller".
  10. Click on the "SSL Manager" button and create a new SSL certificate.

# 2. Configure Web Browser

  1. Open Chrome/Firefox/Opera and go to the settings menu.
  2. Search for "proxy" or "network settings".
  3. Under the "Proxy" section, select "Manual proxy configuration".
  4. In the "HTTP Proxy" field, enter "localhost" and the port number you set in step 6 of the JMeter configuration (e.g. 8888).
  5. Click on the "OK" button to save the settings.

# 3. Record Traffic

  1. In JMeter, click on the "Start" button in the HTTP(S) Test Script Recorder to start recording.
  2. In your web browser, navigate to the website you want to record.
  3. Perform the actions you want to record (e.g. filling out forms, clicking links).
  4. In JMeter, click on the "Stop" button to stop recording.

# macOS

# 1. Configure JMeter Proxy
  1. Open JMeter and create a new Test Plan.
  2. Right-click on the Test Plan and select "Add" > "Threads (Users)" > "Thread Group".
  3. Right-click on the Thread Group and select "Add" > "Logic Controller" > "Recording Controller".
  4. Right-click on the Recording Controller and select "Add" > "Sampler" > "HTTP(S) Test Script Recorder".
  5. In the HTTP(S) Test Script Recorder, click on the "Start" button to start the proxy server.
  6. Click on the "HTTP(S) Test Script Recorder" element in the tree view and configure the following settings:
  • Set the "Target Controller" to the Recording Controller you created in step 3.
  • Set the "Port" to an available port (e.g. 8888).
  • Set the "Grouping" to "Put each group in a new transaction controller".
  1. Click on the "SSL Manager" button and create a new SSL certificate.
# 2. Configure Web Browser
  1. Open Chrome/Firefox/Opera and go to the settings menu.
  2. Search for "proxy" or "network settings".
  3. Under the "Proxy" section, select "Manual proxy configuration".
  4. In the "HTTP Proxy" field, enter "localhost" and the port number you set in step 6 of the JMeter configuration (e.g. 8888).
  5. Click on the "OK" button to save the settings.
# 3. Record Traffic
  1. In JMeter, click on the "Start" button in the HTTP(S) Test Script Recorder to start recording.
  2. In your web browser, navigate to the website you want to record.
  3. Perform the actions you want to record (e.g. filling out forms, clicking links).
  4. In JMeter, click on the "Stop" button to stop recording.

# Recording on Localhost configurations

We need to configure the local proxy, otherwise, you will not be able to record +any requests. To do so, take a look at the "Configure your browser to use the JMeter Proxy" section in the

WARNING

If the server you are recording is running in your local machine, you will need to configure your browser to +allow recording of local requests.

In such case, you will need to search for "How to configure the JMeter proxy to record local requests" and follow +the instructions for your browser.

In Firefox, for instance, go to about:config and set network.proxy.allow_hijacking_localhost to true.

After this, you should be able to start recording.

+ + + diff --git a/guide/knonw-issues.html b/guide/knonw-issues.html new file mode 100644 index 0000000..9156100 --- /dev/null +++ b/guide/knonw-issues.html @@ -0,0 +1,57 @@ + + + + + + Known issues | Auto Correlation Recorder + + + + + + + + + + + +

# Known issues

This section contains a list of known issues and workarounds.

# 1. Correlation History is isolated

After a recording or a correlation process is done and, the Test Plan is saved, if you open it again, +the Correlation History of that "session" is not associated to the Test Plan anymore. This impacts the correlation +process, as there is no Original Recording JMX or JTL associated to the Correlation History for the "current" session.

# Workaround: Manually feeding the files to the Correlation Process

# Correlating by Correlation Template

  1. You need to open the correlation history JSON file stored at jmeter/bin/History/
  2. Take the path of the recordingTraceFilepath in the Original Recording step.
  3. Use that path in the JTL file selector in the "Select Correlation Template" window.

This will enforce the use of the JTL file you want to use for the correlation process for that "session".

# Correlating by Replay and Comparison

Take the steps from the previous section, but instead of feeding the JTL file to the JTL file selector, +set it as the JTL file in the View result tree for the "bzm - Auto Correlation Recorder" sampler.

This will use the back method of the Correlating by Replay and Comparison method of using that auxiliary JTL file to +perform the correlation process.

# 2. Manual Replay Correlation Analysis Issue After Choosing 'No' to Wizard Prompt

We are aware that there is an issue where, if you click "No" when the Automatic Correlation Wizard offers +to generate suggestions after recording, manually opening the wizard, replaying, and selecting the Correlation +method may not trigger the analysis.

We recommend selecting "Yes" when the wizard prompts you to generate suggestions to avoid this issue.

# 3. GUI crash and console error logging null pointer.

We have identified an issue with java 1.8 primarily happening on macOS when using this plugin. +We have fixed the issue in the table renderer, but there can still be some cases where this might happen. +In case you are getting a GUI crash and null pointer references in jmeter console, you might want to consider +upgrading java version.

If you are getting this error or a similar one:

 java.lang.NullPointerException: null
+ at com.blazemeter.jmeter.correlation.gui.RulesTableGui$CustomCellRenderer.getTableCellRendererComponent(RulesTableGui.java:178) ~[jmeter-bzm-correlation-recorder-2.2.1.jar:?]
+  at javax.swing.JTable$AccessibleJTable.getAccessibleChild(JTable.java:7037) ~[?:1.8.0_345]
+

We recommend using java 11 or higher.

+ + + diff --git a/guide/templates/create.html b/guide/templates/create.html new file mode 100644 index 0000000..943a846 --- /dev/null +++ b/guide/templates/create.html @@ -0,0 +1,56 @@ + + + + + + Create Template | Auto Correlation Recorder + + + + + + + + + + + +

# Create Template

The only requisite for creating a Template is having Correlation Rules on it. These can be added to the Plugin by:

  • Manually inserting a new Rule
  • Exporting the Correlation Suggestions as Rules
  • Loading one or multiple templates

Once you are satisfied with the final set of Correlation Rules, you can click on "Save Template", proceed to fill in all the required fields, and click on "Save".

# Manual Template Creation

By default, you can create local Templates, which are stored in your local Repository, but you can also create Templates in your BlazeMeter account and upload them to a Repository for you and your team to use (since they are stored in the cloud, you can access them from any machine with the Plugin installed and they are shared with your team).

To create a Template, regardless to where you want to store it, you need to provide the following information:

  1. A Name or Id (*): representing the application or type of application it handles (e.g. "SAP", "Salesforce", "SAP Fiori", etc.)
  2. A Version number (*): to identify the version of the Template (we recommend to use semantic versioning (opens new window) for this, e.g. "1.0.0", "1.0.1", "1.1.0", etc.)
  3. A list of Changes (*): to inform the others what has changed in the Template (e.g. "Added a new Correlation Rule to handle the CSRF token", "Added a new Correlation Rule to handle the session ID", etc.)
  4. A Description (*) text: to inform the others what the Template is for (e.g. "Template to handle SAP applications", "Template to handle Salesforce applications", etc.)
  5. The Author's Name (*): to identify who created the Template (e.g. "John Doe", "Your Company", etc.)
  6. The Author's Email (*): to contact the author (e.g. "email@example.com", "example.com", etc.)
  7. Dependencies list: to inform the others what other libraries are required to use this one (e.g. "our-logic.jar", "logging.jar", etc.)

Note: The fields marked with an asterisk (*) are mandatory. The rest are optional.

When you are creating a new Template, you can either create it from scratch or use an existing one as a base. If you choose to use an existing one, you will be able to select it from a list of Templates that are stored in your configured Repository. +Even if they are a combination of other Templates, you are not limited to store them in the same Repository, on any of the selected Templates, you can store it in a different repository with a different name and version; it's up to you and how you want to organize your Templates. +It is advisable to make mention of the Templates you used as a base in the Description field, specially if you are combining support for different applications and technologies or if they have dependencies associated.

# Export Suggestions as Rules

If you have Correlation Suggestions generated from your Test Plan, you can export them as Rules to your plugin, modify them and, after, to create a Template.

To do so, you need to:

  1. Make a Recording and generate Correlation Suggestions (by any method)
  2. Click on the "Export Suggestions" button in the Auto Correlation Recorder Plugin
  3. Select the Rules you want to save as a Template (eliminate the rest)
  4. Click on "Save Template" and fill in the required fields
  5. Click on "Save"

Note: If you are generating Suggestions from a Template that you have access to manage (e.g. a local Template), you can make use of the Export Suggestions as Rules as a way to ensure which Rules are effectively applying, since the Suggestions are generated from the Rules that actually applied in your Recordings. This is a goo way to refine your Rules before saving or sharing them.

# Load Template

Another way to create a Template is by loading different Templates into the Plugin and manually editing them to fit your use case. This is useful when you want to combine different Templates into a single one or when you want to create a Template from scratch. +When you are done editing the Template, you can save it as a new one.

The Auto Correlation Recorder Plugin do not keep track of the Templates you load, except from the last one, so you need to make sure you save them in the proper Repository.

+ + + diff --git a/guide/templates/index.html b/guide/templates/index.html new file mode 100644 index 0000000..e33a1d2 --- /dev/null +++ b/guide/templates/index.html @@ -0,0 +1,53 @@ + + + + + + Auto Correlation Recorder + + + + + + + + + + + +

# @@ -1,140 +0,0 @@

# next: /guide/templates/create.md

# Correlation Templates

The Templates are part of the core functionalities of the Auto Correlation Recorder Plugin. They are the structure that groups a set of Correlation Rules inside the Plugin for various uses.

In this section, you will learn about:

  1. Definitions
  2. Types
  3. Management
  4. Limitations

# Definitions

A Correlation Template, or a Template for shorts, is the structure used to group a set of Correlation Rules inside the Auto Correlation Recorder Plugin for different purposes, such as:

  • Sharing with coworkers
  • Analyzing the recordings
  • Versioning your changes
  • Organizing your Correlation Rules

We will talk about each other in their respective sections. For now, let's jump into the types of Templates you can access.

# Types

What differentiates one Template from another is the source or Repository it comes from, and it highly impacts your capabilities over them.

Initially, you can lose control over their content and configuration while you gain a range of Correlation possibilities. It is a matter of the policies of your Template providers.

Based on their sources, you might have:

  • Local Templates
  • Central Templates
  • BlazeMeter Templates (built-in, Workspace and Enterprise)
  • Custom Templates

Most of these Templates have the same capabilities. However, they might restrict you based on your user access level. Let's talk about it.

# Local Templates

These Templates are the ones created by yourself. They are located in your local machine and maintained by you. Because of this, you have full access to them, allowing you to:

  • Load them
  • Configure them
  • Save new versions
  • Use them for Analysis
  • Export the suggestions as Rules

# Central Templates

These Templates come from GitHub Central, and since they come from the community, you can treat them as a Local Template, with the difference that the Saving of a new version (directly to GitHub) still needs to be supported.

  • For the sake of consistency, these Template allows you to:
  • Load them
  • Configure them
  • Use them for Analysis
  • Export the suggestions as Rules

# BlazeMeter Templates

These are the Templates that come from BlazeMeter's Repository. You get access to them after configuring your BlazeMeter's API and forcing a sync of your Templates if needed.

Depending on your account level, you might need special access to some of their capabilities; however, in general terms, you are allowed to:

  • Use them for Analysis (Built-in, Workspace, Enterprise(*))
  • Load them (Workspace)
  • Configure them (Workspace)
  • Save new versions (Workspace)
  • Export the suggestions as Rules (Workspace)

In general terms, everything you or your coworkers created is available as if they were Local Templates: you own and use them. These are marked as "Workspace Templates".

The rest of the Templates from BlazeMeter are proprietary; you can access them "as it is" exclusively for Analysis.

# Manually Imported Templates

These are Templates that come from manually importing them. Since there is no way to keep track of them, we consider them just like a Local Template, meaning that you are allowed to:

  • Load them
  • Configure them
  • Save new versions
  • Use them for Analysis
  • Export the suggestions as Rules

# Management

Let's talk about how you get access to your Templates and how to store them properly.

You can either create your Templates or import them from external sources or Repositories, as we call them.

# Create Template

The only requisite for creating a Template is having Correlation Rules on it. These can be added to the Plugin by:

  • Manually inserting a new Rule
  • Exporting the Correlation Suggestions as Rules
  • Loading one or multiple templates

Once you are satisfied with the final set of Correlation Rules, you can click on "Save Template", proceed to fill in all the required fields, and click on "Save".

# Load Template

When you load a Template to the Plugin, you manually edit the configurations the Correlation Rules have to fit your use case properly. Bear in mind that only some of the Templates can be loaded to be manually edited (this might depend on your access level over these Templates, depending on the sources they come from).

To load a Template to the Plugin, you must:

  1. Load the Auto Correlation Recorder Plugin
  2. Click on the "Load Template" button
  3. Select the Template from the list of Installed and Available (*)
  4. Click on the "Load" button

Depending on your access level over the selected Template, you can load it into the Plugin. If you don't have access, you will be prompted with a warning pop-up informing you that you don't have access.

(*): If you select a Template from the Available list, you should install that Template first before. Sometimes, this installation might require resetting your JMeter; in such scenarios, you will be prompted to ask if you want to restart, giving you time to store unsaved changes in your Test Plan.

# Sync Templates

We have spoken about sources or Repositories, which are the ones that supply you with Templates when they are not created locally in your machine. Some of these Repositories come from external sources (such as BlazeMeter, GitHub, or other HTTP-related locations) and might require you to manually sync them to obtain the most recent versions of their Templates.

To keep your local Repository up to date, please remember to click the "Refresh" button. It can be found right next to the "Config" button and looks like two arrows following each other.

# Manually importing Templates

If anyone gave you the JSON file related to a Template, you could import it into your local Repository by adding the file to your correlation-template folder, located in <JMeter>/bin/. after that, you force a manual sync so the Plugin to index it as local.

# Delete Templates

Currently, the Auto Correlation Recorder Plugin does not support Deleting Templates, neither from your local Repository nor any other external repository.

You can delete your local repository Templates by manually deleting the correlation-templates folder in the bin folder inside your JMeter installation folder; however, this is not advisable, and you must do it at your own risk.

# Usages

Templates are used in two different ways:

  1. To store Correlation Rules for a specific application or type of application
  2. To do an Analysis of your recordings and suggest changes

TIP

Always sync your repositories before analyzing your recordings to have the latest version of the Templates.

# Limitations

There are some limitations when using Templates:

  1. You can't edit BlazeMeter built-in Enterprise Templates
  2. You can't overwrite versions of any Template (regardless of the type)
+ + + diff --git a/guide/troubleshooting.html b/guide/troubleshooting.html new file mode 100644 index 0000000..94a369d --- /dev/null +++ b/guide/troubleshooting.html @@ -0,0 +1,79 @@ + + + + + + Troubleshooting | Auto Correlation Recorder + + + + + + + + + + + +

# Troubleshooting

In this section you will find information about:

Most of these issues, if not all, can be solved by:

Make sure you check aforementioned point and the following sections before opening a new issue (opens new window) in the repository.

# Common issues and solutions

We will assume that you have already reviewed the previously mentioned guides and that you have a basic understanding of how the plugin works.

# My correlation rules are not being applied

If your correlation rules aren't being applied, it's likely that they aren't matching. This mismatch can occur due to various reasons, but the most prevalent ones include:

  • The Regex for the Extractor doesn't match the value you aim to correlate.
  • The Regex for the Replacement doesn't match the request.
  • The Regex for the Replacement matches the value, but the extracted value isn't what you anticipated.
  • Interference from other third-party plugins affecting the behavior of your plugin.

If, after reviewing the previous reasons, you still can't find the root cause of the issue, we recommend you:

# Debugging tips

In general, we recommend always using the JMeter Template (not to be confused with Correlation Templates) for the Plugin to do all your recordings since we have added all the necessary elements, preconfigured, to make the recording process as easy as possible. This template also has all the required elements in the correct order and in the right places so that the information is not only shown correctly but can also be used in the debugging process.

The most common debugging tips are:

  • Enable the Debug Post processor element when doing the replay as it will show the variables in JMeter by the moment the replay reaches that particular step.
  • Always review the state of the value in both the recording and the replay. It is pretty common that the value is not being displayed correctly in the rendered view in JMeter (due to the encoding of the value).
  • Use the Raw Display of the values in the view result tree. It is pretty common that, when using other rendering of the results in JMeter, the value is shown in a different manner than its real state, making it difficult to debug.
  • Keep the Test Plan as clean as possible. Always try to filter the requests that are not needed (such as fonts, styles, telemetry, google ads, etc.) as they only add noise to the debugging process.
  • Alternatively, the opposite is also possible: add all the elements to the Test Plan, in cases where you might end up filtering requests that could contain important information for the correlation. This does not occur that often with the default filters added to the template, but if you find yourself simply unable to locate a value (neither in the recording nor the replay), it could be possible that it was filtered.

# How to properly report an issue

If by the end of the debugging process you are still not able to find the root cause of the issue, you can always +request help. We encourage you ask for help in the following ways:

  1. Prepare the information following the steps in the next section
  2. Contact the BlazeMeter team for proper support and guidance.
  3. Alternatively, you can create an issue in the GitHub repository (opens new window) of the plugin, and get assistance by the Open source community.

# How to prepare the information

In order to properly report an issue, we need to have as much information as possible. This is why we encourage you to +follow the next steps:

# Gather system information

Make sure to include relevant information about your system and environment, such as:

Operating system (e.g. Windows, macOS, Linux) +Browser and version (if applicable) +Java version (if applicable) +Other relevant software versions

# Describe the issue

Provide a clear and concise description of the issue you are experiencing. Include any error messages or unexpected behavior that you have observed.

# Steps to reproduce

Provide a step-by-step guide to reproduce the issue. Include any relevant information, such as the test scenario you were running, the specific action you were performing, or the data you were using.

# Expected behavior

Describe what you expected to happen when performing the steps outlined in the previous section.

# Actual behavior

Describe what actually happened when performing the steps outlined in the previous section.

# Additional information

Include any additional information that you think might be relevant or helpful in diagnosing the issue. This could include screenshots, log files, or any other relevant details.

By following these steps and providing as much detail as possible, you can help ensure that your issue is properly diagnosed and resolved.

# Guides

# Checking your JMeter configuration

One of the many reason as why the Templates or Rules do not work is because the plugin is not properly configured. This means that the plugin might be missing critical configuration in order to work properly.

Make sure you have followed the instructions in the Installation Guide and the Configuration Guide in order to properly configure the plugin.

# Checking your Test Plan for consistency

One of the many reason as why the Templates or Rules do not work is because the Test Plan is not consistent. This means that the Test Plan is not being executed in the same way as it was recorded.

This can happen for a variety of reasons, but the most common ones are:

  • The Test Plan's elements is not being executed in the same order as it was recorded.
  • The Test Plan is missing elements that were present in the recording.
  • The Test Plan has elements that are disabled and are relevant in the recording.

# Checking the server responses

Another common reason as why the Templates or Rules do not work is because the responses from the server are totally different from the recording. This means that the server is not responding with the same values as it was recorded.

This can happen for a variety of reasons, but the most common ones are:

  • The server returns a different response due to: +
    • previous requests not being properly correlated.
    • the Test Plan not being consistent.
    • Additional configuration's required to run the Test Plan.
  • The server needs Javascript to be executed in order to return the correct response.

# FAQ

# The value that I need to Correlate does not appear in the Tree View

This is a pretty common issue that can affect the capabilities of you or the plugin to correlate a value.

The most common reasons are:

  1. Cookies and cached values are not being cleared before recording.
  2. Requests are being filtered on recording.

Can these be fixed? Yes, they can. Here is how:

# Cookies and cached values are not being cleared before recording

The short recommendation for this problem is: Always clear your cookies and cached values before recording

Explanation:

If your browser has cached values or cookies from previous sessions, it is possible that the value you are trying +to correlate is not being sent to JMeter from the server (because your browser already has the value stored and +use it directly).

This is why we always recommend to clear your cookies and cached values before recording or make a new Incognito +session in your browser each time you record.

# Requests are being filtered on recording

If the Request are being filtered on recording, it is possible that the server is sending the request to JMeter, +but it is not being stored since it matches the filtering configurations.

By default, these filtered request won't appear in the Recording's View Result tree. However, you can disable this +behavior and retry the recording to ensure this is the problem.

WARNING

Note: Only use this for debugging purposes since the plugin can misbehave if there are inconsistencies between the recorded elements and the requests that are stored in the View Result Tree.

Along the possible issues this can cause, the most common ones are:

  • The plugin will identify values in requests that is not part of the Test Plan and will make incorrect suggestions. This will give the impression of a value being correlated when it is not.
  • The plugin will identify the appearance of a value more times than it should. This will give the impression of a value being more important than it actually is.
  • The analysis (either by Templates or by Automatic detection) will take longer than usual since it will have to go through all the requests in the View Result Tree, even the ones that are not part of the Test Plan.

Before jumping into conclusions, let's test the hypothesis that the request is being filtered.

Check if the request appears in the Recording JTL:

  1. Go to your Test Plan
  2. Click in the "bzm - Auto Correlation Recorder" element
  3. Click the "View Results Tree" element

Either manually review the list of elements or use the search field to find the request you are looking for.

If the request does not appear in the recording JTL, it might have been filtered. +If the request is present in the recording JTL, it was not filtered.

TIP

If the request is present in the Recording JTL but the name appears between brackets ([]), it means that the request was filtered, and you have the notify children option enabled.

Disable the filtering of requests in the Recording JTL: +If you validated that the request is being filtered, you can disable the filtering of requests in the Recording JTL by following these steps:

  1. Go to the Request filtering tab (Test Plan > bzm - Auto Correlation Recorder > Requests Filtering +tab).
  2. Check the "Notify Child Listeners of filtered samplers" option at the bottom of the +element in the "Notify Child Listeners of filtered samplers" section.
  3. Clear the recording (Test Plan > Recording Controller > Clear all the recorded samples).
  4. Clear the Recording JTL (Test Plan > bzm - Auto Correlation Recorder > View Results Tree > +Right Click > Clear).
  5. Record again.

Now, when you check the Recording's View Result Tree, you should see all the requests that are being sent to JMeter. +The ones that are being filtered will appear between brackets ([]), while the ones that are not being filtered will +appear normally (without the wrapping brackets).

Just like the previous step, you can either manually review the list of elements or use the search field to find the +request you are looking for.

If you confirmed that the request is being filtered, you might need to review the filtering configuration to ensure +that the request is not being filtered.

WARNING

Note: You will feel tempted to leave the "Notify Child Listeners of filtered samplers" option enabled. However, this is not recommended since it can cause the plugin to misbehave. +Likewise, we highly encourage you to fine tune the filtering configuration to ensure that the request is not being filtered rather than removing the filtering altogether. Having extra requests in the Recording will only make the analysis slower and suggest values that are not relevant or should not be correlated.

# Your regular expression is not matching the value you are trying to correlate

More often than not, the regular expression that you are using to correlate a value is not matching the value you are +trying to correlate.

Depending on which part of the Correlation Rule you are configuring or testing, you might need to use a different +mechanism to validate that the regular expression is matching the value you are trying to correlate.

# For Extraction

You can test your Regex inside JMeter by going into your Recording's View Result Tree do one of the following:

  1. Search by Regular exp.
  2. Use the "RegExp Tester" view.

# For Replacement

By default, the Plugin will concatenate both the name of the argument and value with :, when evaluating the replacement.

For instance: +If the value you want to correlate appears in the HTTP Sampler as wpnonce (in name's column) and 123ABC (in value's column), when the plugin tries to match the Regex, it will do it against wpnonce: 123ABC.

TIP

Even if your Regex matches the value you are trying to correlate, in the request body or headers, you still need to make sure that the Extractor effectively extracted the value you are trying to correlate.

# How to confirm the value is being extracted correctly

If you are not sure if the value is being extracted correctly, you can use the "Debug Post-Processor" to confirm it.

To do this, you need to:

  1. Add a "Debug Post-Processor" to your Test Plan.
  2. Add a "View Results Tree" element to your Test Plan.
  3. Replay the Test Plan

You will see that now every request will have a child element inside them in the View Result Tree. Inside this child element, in the Response Body tab, you will see all the JMeter variables and their respective values during the replay in that request.

If your Regex Extractor is located inside the Request #1, the value will appear (or will be available) from the Request #2 onwards.

If the variable is not present in the Debug Sampler, it means that the regex is not matching any value in the recording until that point and that you don't have a default value assigned to it. +If the variable is present but the value is "NOT_FOUND", it means that the regex is not matching any value. +If the variable is present but the value is not the one that you want, it means you need to improve either the Regex or the configuration of the Extractor.

+ + + diff --git a/guide/using-the-plugin.html b/guide/using-the-plugin.html new file mode 100644 index 0000000..9e1fc9b --- /dev/null +++ b/guide/using-the-plugin.html @@ -0,0 +1,86 @@ + + + + + + Usage | Auto Correlation Recorder + + + + + + + + + + + +

# Usage

In this page, we will explain the most common scenario when using the Auto Correlation Recorder plugin, here you will:

You might also be interested in other usages such as:

# Identifying dynamic parameters

Either if you are new to the usage of JMeter or not, you will find that the Auto Correlation Recorder plugin will help you +to identify dynamic parameters in your test scripts, as they can be hard to find. The plugin will help you to +identify them and create correlation rules for them.

There are three ways to properly identify dynamic parameters in your test scripts:

  1. Using the replay and compare feature: This will replay your current test plan and obtain the parameters from +the requests that fail (those are very likely changing in each iteration), and display those for you. Correlations +will be created automatically for you.
  2. Using the correlation templates: This will use a set of pre-defined correlation templates that have been +specifically designed for different applications. You can use them to identify dynamic parameters in your test +scripts and automatically create correlations for them. Local Correlation Templates are also supported.
  3. Manually: You can manually identify dynamic parameters in your test scripts, and manually correlating them.

In this guide, we will focus on the first two methods, as they are the most effective ones.

# Correlation Rules

Correlation Rules are the core of the Auto Correlation Recorder plugin. They are the ones that will help you to identify +dynamic parameters in your test scripts and correlate them.

You can create your own Rules or use the ones created by BlazeMeter or your team.

You create them by yourself, there are two ways:

  1. By using the Replay and Compare feature
  2. By creating the Correlation Rules manually

The Replay and Compare is a more exploratory approach, where the plugin attempts to automatically detect the dynamic values from request that failed, while Correlation Rules manually is more effective, as you should know exactly what you are trying to correlate.

We recommend using Replay and Compare to identify potential dynamic values, their appearances in both responses and requests, and general rules to correlate then, and then fine tune those rules to properly correlate them.

If you are interested in using the Rules created by others, you can use the Correlation Templates feature.

# Validating and testing the correlation rules

Once a correlation rule has been created, you can validate it to make sure it works as expected. To do so, you +the comparison by "Correlation Rules" and "Correlation Templates" in the "Correlation Wizard" window.

To do so, first, save your Correlation Rules as a Correlation Template, then, click the "Correlation Wizard" button +and select the "Correlation Templates" option. Select the template you just saved and click "Next". The plugin will +apply the Correlation Template to your recording and, by the end of the analysis, the Correlation Suggestion window will be displayed, showing you the dynamic values detected from the Correlation Template you just used.

warning

If you are using the "Correlation Templates" option, remember that the plugin will apply every Correlation Template +you select in the "Correlation Wizard" window; hence, if you select more than one Correlation Template, the plugin +will apply all of them to your recording. This means that the Correlation Suggestion window will show you the dynamic +values detected from all the Correlation Templates you selected (not just the last one you created).

# Applying correlation rules to test scripts

Regardless of the method that was used for the creation of the Rules, the plugin will allow the appliance of +those rules in two different ways:

  1. After the recording is done (recommended)
  2. During the recording (legacy)

# Applying correlation rules after the recording is done

Since the release of the Auto Correlation Recorder v2, we encourage the usage of this method to apply Correlation Rules, +as it is the faster and more reliable way to do so. To apply Correlation Rules after the recording is done, you +need to follow these steps:

# TL;DR

  1. Open the Correlation Wizard
  2. Select the By Replay and Compare method.
  3. Select the Templates to use for the analysis.
  4. Add the JTL file of the recording (if it isn't already loaded).
  5. Press "Continue"
  6. Review the Correlation Suggestions
  7. Press "Auto Correlate" to apply the suggestions to the Test Plan.

With this, you should have a Test Plan with the dynamic values already correlated. Replay the Test Plan to make sure +that it works as expected.

# Detailed steps

  1. Open the Correlation Wizard

To open the Correlation Wizard, you can either:

  • Accept the replay report Dialog, after the recording.
  • Click on the Correlation Wizard button in the Correlation tab.

Replay Report Dialog

  1. Select the By Replay and Compare method

Regardless of the method used, the "Select Correlation Method" dialog will be displayed. +Select the Existing correlation rules (recommended method and press "Continue".

Select Correlation Method

  1. Select the Templates to use for the analysis

The next step is to select the Correlation Templates to use for the analysis. You can select one or more templates. +If you select more than one, the plugin will use the union of the dynamic values found in all of them.

You can select which version of each Correlation Template to use. By default, the latest version is selected.

Select Correlation Templates

TIP

Depending on your account type, you might see some Correlation Templates that are not available for you +(they will have a lock icon next to them).

If you want to know more about Enterprise Correlation Templates, please contact your BlazeMeter representative.

  1. Add the JTL file of the recording (if it isn't already loaded)

By default, the plugin loads the JTL file that is found in the View Result Tree of the "bzm - Auto Correlation Recorder" element. +If you want to use a different JTL file, you can click on the "Browse" button and select the file you want to use.

WARNING

It is highly recommended that you use the JTL file that that comes from the recording, since it contains the +raw data of the recording. If you use a different JTL file, the analyzed data might not be accurate, hence +the results might not be as realistic as expected.

  1. Press "Continue"
  2. Review the Correlation Suggestions +Once the analysis is done, the plugin will display the Correlation Suggestions in the "Correlation Suggestions dialog".

Correlation Suggestions +Review the name of the arguments, the values, where they were found and used. If you want to apply a suggestion, +select the checkbox next to it. If you want to ignore a suggestion, uncheck the checkbox.

  1. Press "Auto Correlate" to apply the suggestions to the Test Plan.

Once you are done reviewing the suggestions, press the "Auto Correlate" button to apply the suggestions to the Test Plan. +The plugin will automatically correlate the dynamic values in the Test Plan, and will display a dialog informing you +that the process was successful.

Auto Correlate Successful

We recommend the usage of the first method, as it is faster and allows rolling back changes if needed. +The second method is still supported, but it is not recommended, as it is slower, making you to do the wh and does not allow rolling back changes.

# During the recording (legacy)

As mentioned before, this method is not recommended when testing your Correlation Rules, as it takes more time to test +them, however, if you are sure your Correlation Rules are properly configured, the steps are pretty simple:

  1. Select the "Enable Correlation (Legacy)" checkbox in the "bzm - Auto Correlation Recorder" element.
  2. Start the recording.
  3. Once the recording is done, your correlations should be applied to your Test Plan.

You dont need to do anything else, as the rules should be applied directly in your Test Plan. You can replay and see +the final result of your Test Plan.

warning

If you enable this check box, do the recording and then attempt to apply any of the Post Recording methods, we can't +assure those will work properly, since the recording will contain elements that are already correlated or modified, +which might cause issues when identifying the dynamic values.

# Using the History Manager

During the workflow with the Auto Correlation Recorder, we usually record flows and then correlate messages, do tests, and investigate if we did our correlations correctly.

To make this job easier, the history manager arises.

This tool automatically saves checkpoints after relevant situations such as applying correlations, making a reply of our saved flow or after saving our original recording. After these saves are done, we can easily restore a version of our test plan with a few clicks and analyze the steps we did.

# View the History

This feature allow us to see all the iterations we did since our original recording. The date we did them and a few details.

To see the history we need to go to the Correlation Tab in the bzm-Auto Correlation Recorder sampler and then click the Hisotry Button.

History Manager Presentation

Once we click the history button, we will see this window

History Manager Table

# Restore an Iteration

With this feature you are going to be able to select one iteration and restore your test plan at the point the iteration was saved.

You just need to select one iteration and click the Restore button. After that you will see this message:

Restore Iteration

when you click “ok” you are going to be redirected to your loaded testplan.

# Delete iteration.

You are able to delete the iterations you consider useless in your history. You just need to select every iteration you want to delete and click the delete button.

# Export all History

With this feature you are able to save and share the whole history. When you click the esport button, a zip file will be generated into the History folder of the bin folder where you have installed Jmeter. This zip file share the bin folder structure.

To see a history shared with you, you can do it from two ways:

  1. You can extract its content in another bin folder and complement folders instead of substitute them.

  2. Open the zip file and copy every fil into its corresponding folder inside the bin folder.

Then open the Test Plan associated with that history (usually it is shared outside the zip file) and go to the history.

History Zip File

+ + + diff --git a/images/blazemeter-labs-logo.png b/images/blazemeter-labs-logo.png new file mode 100644 index 0000000..beb7b9b Binary files /dev/null and b/images/blazemeter-labs-logo.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..84b7714 --- /dev/null +++ b/index.html @@ -0,0 +1,50 @@ + + + + + + Auto Correlation Recorder + + + + + + + + + + + +

+ Effortlessly handle dynamic values in JMeter with the Correlation recorder plugin. +

+ User Guide → +

⚡Super fast correlation

No more tedious manual correlation for each request and response.

💪 JMeter ecosystem & community

Tap into the power of community-driven correlations and simplify dynamic value handling in JMeter recordings.

📏Customizable

Not enough? Take charge and empower your platform's performance with custom Correlation Rules.

+ + +