{
    "componentChunkName": "component---src-templates-blog-post-tsx",
    "path": "/blog/2021-08-04-interactors-design-systems/",
    "result": {"data":{"blogPost":{"title":"Interactors: the design systems testing ally","slug":"/blog/2021-08-04-interactors-design-systems/","authorNodes":[{"name":"Charles Lowell","slug":"/people/charles-lowell/"},{"name":"Jeffrey Cherewaty","slug":"/people/jeffrey-cherewaty/"}],"markdown":{"html":"<p>The reusable component libraries shipped with design systems enable developers to use on-brand and battle-tested components. Developers don't have to re-invent the wheel every time they need a common element like an input, modal dialog, or date picker.</p>\n<p><figure class=\"figure\"><img src=\"/img/2021-08-04-interactors-design-system/date-picker-click-map.png\"><figcaption class=\"figure-caption\">Screenshots of date picker components highlighting clickable areas</figcaption></figure></p>\n<p>If you're building an application with some of these components, you'll want to write some tests. With the date picker component pictured above, a user needs at least four clicks to select a date. That means a UI test will also need to step through those four clicks. Testing this interaction with React Testing Library and Cypress could look like:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">cy<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">'#date .MuiCalendarPicker-root'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">within</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  cy<span class=\"token punctuation\">.</span><span class=\"token function\">getByLabelText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'calendar view is open, switch to year view'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">click</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  cy<span class=\"token punctuation\">.</span><span class=\"token function\">getByText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'1992'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">click</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  cy<span class=\"token punctuation\">.</span><span class=\"token function\">getByLabelText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Next month'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">click</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  cy<span class=\"token punctuation\">.</span><span class=\"token function\">getByText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'16'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">click</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>To effectively write a test using this date picker, we had to include specifics about its implementation, like IDs and classes. If the underlying component changes its DOM structure, our tests are suddenly brittle.</p>\n<p>There's a well-trod design pattern for fixing this problem: <a href=\"https://www.martinfowler.com/bliki/PageObject.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">page objects</a>. They're object-oriented classes that serve as an interface. As an application matures alongside its accompanying tests, page objects act as a buffer and a more explicit API for the tests to interact with the application.</p>\n<h2 id=\"introducing-interactors\" style=\"position:relative;\"><a href=\"#introducing-interactors\" aria-label=\"introducing interactors permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introducing Interactors</h2>\n<p>At Frontside, we've built <a href=\"https://frontside.com/interactors\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Interactors</a> (<code class=\"language-text\">@interactors/html</code>), a library inspired by page objects that helps teams structure, share, and reuse their UI testing practices.</p>\n<p>Interactors evolve the idea of a page object. Modern applications are usually arranged into composable components, and the \"page\" is no longer the dominant unit of organization. An Interactor is similarly composable, and can abstract any level of object in the DOM hierarchy.</p>\n<p>Design systems maintainers can build interactors alongside components to reduce the mental distance between the user interface and its testing-friendly abstraction. In the same way strong typing can make components easier to build with, interactors make components easier to test.</p>\n<p>Interactors...</p>\n<ol>\n<li>... are composable, so they make tests easier to write, read, and run.</li>\n<li>... act as an abstraction layer on top of the component's implementation, improving design systems' maintainability.</li>\n<li>... have TypeScript support and provide helpful errors, resulting in an improved developer experience.</li>\n</ol>\n<p>Let's take a closer look at each of these advantages.</p>\n<h3 id=\"interactors-make-tests-easier-to-write\" style=\"position:relative;\"><a href=\"#interactors-make-tests-easier-to-write\" aria-label=\"interactors make tests easier to write permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Interactors make tests easier to write</h3>\n<p>We provide basic <a href=\"https://frontside.com/bigtest/docs/interactors/built-in-dom\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">built-in Interactors</a> that correspond to HTML elements, like <code class=\"language-text\">button</code>, <code class=\"language-text\">link</code>, and <code class=\"language-text\">checkbox</code>. Using these alone, you could interact with and assert the majority of cases of a web UI. Take the following example of a collapsable navigation menu test:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Button<span class=\"token punctuation\">,</span> Link<span class=\"token punctuation\">,</span> Heading <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">@interactors/html</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'goes to international news page with mobile menu'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  cy<span class=\"token punctuation\">.</span><span class=\"token function\">do</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n\t\t<span class=\"token function\">Button</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token string-property property\">'aria-label'</span><span class=\"token operator\">:</span> <span class=\"token string\">'Show Navigation Menu'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">click</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\t\t<span class=\"token function\">Link</span><span class=\"token punctuation\">(</span><span class=\"token string\">'International'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">'class'</span> <span class=\"token operator\">:</span> <span class=\"token function\">contains</span><span class=\"token punctuation\">(</span><span class=\"token string\">'nav-link'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">click</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\tcy<span class=\"token punctuation\">.</span><span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n\t\t<span class=\"token function\">Heading</span><span class=\"token punctuation\">(</span><span class=\"token string\">'News'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">exists</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>You'll often want to avoid repeating yourself and pack together interactions and assertions that correspond to your design system's components.</p>\n<p>It's likely that <code class=\"language-text\">Nav</code> is indeed a component in our design system. Thus, we can create a <code class=\"language-text\">Nav</code> Interactor that queries the nav and has actions that a user can perform with it.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'goes to international news page with mobile menu'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  cy<span class=\"token punctuation\">.</span><span class=\"token function\">do</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token function\">Nav</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">goTo</span><span class=\"token punctuation\">(</span><span class=\"token string\">'News'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'goes to entertainment news page with mobile menu'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  cy<span class=\"token punctuation\">.</span><span class=\"token function\">do</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token function\">Nav</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">goTo</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Entertainment'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Note that we can target the <code class=\"language-text\">Nav</code> directly and perform the action we care about in a single line. If the component changes its internal classes or markup, these tests won't break. Its Interactor received updates to account for those changes.</p>\n<p>Retaking the example from the introduction, you could provide a <code class=\"language-text\">DatePicker</code> Interactor such that everyone using the pick date component have standard methods to test their features using an interface like:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">cy<span class=\"token punctuation\">.</span><span class=\"token function\">do</span><span class=\"token punctuation\">(</span>DatePicker<span class=\"token punctuation\">.</span><span class=\"token function\">setDate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">day</span><span class=\"token operator\">:</span> <span class=\"token number\">16</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">month</span><span class=\"token operator\">:</span> <span class=\"token string\">'August'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">year</span><span class=\"token operator\">:</span> <span class=\"token number\">1992</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Composable Interactors also respect their lifecycle in the browser. That means that they don't waste time waiting on dead components or looking for new ones when there's no rendering happening.</p>\n<h3 id=\"interactors-improve-maintainability-in-a-design-system\" style=\"position:relative;\"><a href=\"#interactors-improve-maintainability-in-a-design-system\" aria-label=\"interactors improve maintainability in a design system permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Interactors improve maintainability in a design system</h3>\n<p>Interactors rapidly become design system's maintainers' best friend because they provide freedom by abstracting the testing practice away from the component's implementation. Instead of relying on fragile internal component classes, developers and maintainers can use Interactors as an API contract for the UI.</p>\n<p>Typically, developers would target elements in the UI in their tests by reaching into the internals of the components they use. It's common to see tests that target chains of selectors like this one:</p>\n<p><code class=\"language-text\">#notes-modal-notes-list [class*=\"mclRowFormatterContainer--\"]</code></p>\n<p>However, referencing internal selectors couples the test implementation to the HTML structure of the component; a slight change to the markup may cause tests to fail. Thus, tests are fragile and introduce fear in the design system's maintainers because they have no way of knowing what might cause tests to fail. Worst of all, this fragility makes tests unreliable when updating the design system, which is precisely the kind of system-wide change that you write your tests for.</p>\n<p>Interactors are the missing contract between the design system's maintainer and its users. The maintainers can control the API that test authors use to interact with the component. The maintainers can freely change the markup of components without worrying about inadvertently breaking tests. And test authors have a more convenient way to write their tests. In the end, the tests are more reliable and provide more confidence to everyone.</p>\n<h3 id=\"interactors-improve-developers-experience-while-testing\" style=\"position:relative;\"><a href=\"#interactors-improve-developers-experience-while-testing\" aria-label=\"interactors improve developers experience while testing permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Interactors improve developers' experience while testing</h3>\n<p>Interactors know more about the components under test than mere selectors, which allows them to provide helpful information while you develop or debug tests. Having an explicit API to test your app provides static checking safety, and understanding that API enables Interactors to provide suggestions when things go wrong in a test.</p>\n<p>When you write your test assertions and actions using selectors, you're on your own. There are no checks available while you write the test, or while it compiles. You'll only find out about a typo after running the tests, and inspecting closely why your test is failing although it seems that it should pass.</p>\n<p>Interactors bring in static checks for your tests, which means your IDE and compiler can provide more support as you develop:</p>\n<p><figure class=\"figure\"><img src=\"/img/2021-08-04-interactors-design-system/interactors-ide-suggestions.png\"><figcaption class=\"figure-caption\">Screenshot of IDE showing in-line suggestions and documentation about Interactors</figcaption></figure></p>\n<p>Not everything can be found by static analysis in a test, but Interactors are ready to provide helpful suggestions for common small mistakes that are usually hard to debug. For example, if you were looking for a login button in your test case, but forgot for a moment that the button actually reads \"Log In\", Interactors will hint that to you:</p>\n<p><figure class=\"figure\"><img src=\"/img/2021-08-04-interactors-design-system/interactors-error-suggest-not-found.png\"><figcaption class=\"figure-caption\">Screenshot of interactors suggestion similar elements to the one that was not found</figcaption></figure></p>\n<p>Interactors not only check for presence before committing an action in the UI, they also check if the <a href=\"https://github.com/thefrontside/element-is-visible\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">element is visible</a>—through various heuristics—and that it is enabled. For example, if Interactors did find the button and it is visible but not enabled, it will throw an error like this:</p>\n<p><figure class=\"figure\"><img src=\"/img/2021-08-04-interactors-design-system/interactors-error-disabled-element.png\"><figcaption class=\"figure-caption\">Screenshot of interactors failing a test because the target element was visible but not enabled</figcaption></figure></p>\n<h2 id=\"try-out-interactors\" style=\"position:relative;\"><a href=\"#try-out-interactors\" aria-label=\"try out interactors permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Try out Interactors!</h2>\n<p>If you're still not sure about trying out Interactors, take a look at this <a href=\"https://github.com/folio-org/stripes-testing/pull/112\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">pull request in FOLIO</a>, an open-source project, adopting Interactors in their component library:</p>\n<p><figure class=\"figure\"><img src=\"/img/2021-08-04-interactors-design-system/diff-react-testing-library-vs-interactors.png\"><figcaption class=\"figure-caption\">Screenshot of code diff resulting in refactoring a test using React Testing Library to use Interactors</figcaption></figure></p>\n<p>The selectors are difficult to follow and are quite fragile, while the Interactors are easier to read and focus on testing the app as a user would use it.</p>\n<p>You can start using Interactors as part of your current test setup, they're compatible out of the box with Cypress and Jest, so it's easy to <a href=\"https://frontside.com/bigtest/docs/interactors\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">get started!</a>.</p>\n<aside class=\"posts-list-list\">\n  <h2>Related articles:</h2>\n  <div class=\"posts-list-entry\">\n    <h3 class=\"posts-list-title\">\n      <a href=\"/blog/2021-18-02-there-and-back-again-testing-and-upgrades/\">\n        There and Back Again: Testing and Stack Upgrades\n      </a>\n    </h3>\n    <p>\n      Upgrading your application stack to new major versions can be terrifying, especially when you have a massive application with 75 developers working on features non-stop. However, a good testing strategy gives you confidence to make bold moves that take your organization to heretofore unexplored lands.\n    </p>\n    <a href=\"/blog/2021-18-02-there-and-back-again-testing-and-upgrades/\" class=\"post-link\">\n      Continue reading\n      <span class=\"post-link--arrow\">→</span>\n    </a>\n  </div>\n  <div class=\"posts-list-entry\">\n    <h3 class=\"posts-list-title\">\n      <a href=\"/blog/2021-04-07-helping-designers-and-developers-storybook/\">\n        Unleashing the Genie: Helping both designers and developers with Storybook\n      </a>\n    </h3>\n    <p>\n      Good documentation is key to design systems. However, what \"good\" means varies according to the reader. This article will go through tips to generate documentations for designers and developers from a single Storybook—keep everyone happy with minimum effort!\n    </p>\n    <a href=\"/blog/2021-04-07-helping-designers-and-developers-storybook/\" class=\"post-link\">\n      Continue reading\n      <span class=\"post-link--arrow\">→</span>\n    </a>\n  </div>\n</aside>","frontmatter":{"date":"August 04, 2021","description":"Components from a design system make building UIs easy. It should be just as easy to test them. Interactors enable more robust tests for component-based UIs, and improve component libraries' maintainability.","tags":["testing","design-systems"],"img":{"childImageSharp":{"fixed":{"src":"/static/bb88c83f430d07176b473a11176c7d15/31987/2021-interactors-design.png"}}}}}}},"pageContext":{"id":"48bf79e6-a3cc-5beb-91bb-a9f005ae6998"}},
    "staticQueryHashes": ["1241260443"]}