<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Locator on Grafana Labs</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/</link><description>Recent content in Locator on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/index.xml" rel="self" type="application/rss+xml"/><item><title>all()</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/all/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/all/</guid><content><![CDATA[&lt;h1 id=&#34;all&#34;&gt;all()&lt;/h1&gt;
&lt;p&gt;When multiple elements match the selector, returns an array of 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;, each pointing to their respective element.&lt;/p&gt;
&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;Array&amp;lt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&amp;gt;&lt;/td&gt;
              &lt;td&gt;An array of &lt;code&gt;Locator&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://quickpizza.grafana.com/browser.php&amp;#39;);

  const options = await page.locator(&amp;#39;#numbers-options &amp;gt; option&amp;#39;).all();
  console.log(`Found ${options.length} options.`);
  
  for (const option of options) {
    console.log(&amp;#39;Inner text: &amp;#39;, await option.innerText());
    await option.click();
  }

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="all">all()&lt;/h1>
&lt;p>When multiple elements match the selector, returns an array of
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a>, each pointing to their respective element.&lt;/p>
&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Array&amp;lt;
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a>&amp;gt;&lt;/td>
&lt;td>An array of &lt;code>Locator&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
ui: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://quickpizza.grafana.com/browser.php&amp;#39;);
const options = await page.locator(&amp;#39;#numbers-options &amp;gt; option&amp;#39;).all();
console.log(`Found ${options.length} options.`);
for (const option of options) {
console.log(&amp;#39;Inner text: &amp;#39;, await option.innerText());
await option.click();
}
await page.close();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>boundingBox([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/boundingbox/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/boundingbox/</guid><content><![CDATA[&lt;h1 id=&#34;boundingboxoptions&#34;&gt;boundingBox([options])&lt;/h1&gt;
&lt;p&gt;Returns the bounding box of the element. The bounding box is calculated with respect to the position of the 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/frame/&#34;&gt;Frame&lt;/a&gt; of the current element, which is usually the 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;&amp;rsquo;s main frame.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;null | Rect&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with the bounding box of the element as a &lt;a href=&#34;#rect&#34;&gt;Rect&lt;/a&gt;. If the element is not visible, the Promise resolves to &lt;code&gt;null&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;rect&#34;&gt;Rect&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;Rect&lt;/code&gt; object represents the bounding box of an element.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Property&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;x&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The x-coordinate of the element in pixels.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;y&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The y-coordinate of the element in pixels.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;width&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The width of the element in pixels.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;height&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The height of the element in pixels.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);

  const textbox = page.locator(&amp;#39;#text1&amp;#39;);
  const boundingBox = await textbox.boundingBox();
  console.log(`x: ${boundingBox.x}, y: ${boundingBox.y}, width: ${boundingBox.width}, height: ${boundingBox.height}`);

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="boundingboxoptions">boundingBox([options])&lt;/h1>
&lt;p>Returns the bounding box of the element. The bounding box is calculated with respect to the position of the
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/frame/">Frame&lt;/a> of the current element, which is usually the
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>&amp;rsquo;s main frame.&lt;/p></description></item><item><title>check([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/check/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/check/</guid><content><![CDATA[&lt;h1 id=&#34;checkoptions&#34;&gt;check([options])&lt;/h1&gt;


&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;This feature has known issues. For details, refer to
&lt;a href=&#34;https://github.com/grafana/xk6-browser/issues/471&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#471&lt;/a&gt; and &lt;a href=&#34;https://github.com/grafana/xk6-browser/issues/475&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#475&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;Use this method to select an &lt;code&gt;input&lt;/code&gt; checkbox.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.x&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The x coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.y&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The y coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.trial&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will perform the actionability checks without performing the action.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the check action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const checkbox = page.locator(&amp;#39;#checkbox1&amp;#39;);
  await checkbox.check();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="checkoptions">check([options])&lt;/h1>
&lt;div class="admonition admonition-caution">&lt;blockquote>&lt;p class="title text-uppercase">Caution&lt;/p>&lt;p>This feature has known issues. For details, refer to
&lt;a href="https://github.com/grafana/xk6-browser/issues/471" target="_blank" rel="noopener noreferrer">#471&lt;/a> and &lt;a href="https://github.com/grafana/xk6-browser/issues/475" target="_blank" rel="noopener noreferrer">#475&lt;/a>.&lt;/p>&lt;/blockquote>&lt;/div>
&lt;p>Use this method to select an &lt;code>input&lt;/code> checkbox.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.x&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The x coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.y&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The y coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.trial&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will perform the actionability checks without performing the action.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the check action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const checkbox = page.locator(&amp;#39;#checkbox1&amp;#39;);
await checkbox.check();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>clear([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/clear/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/clear/</guid><content><![CDATA[&lt;h1 id=&#34;clearoptions&#34;&gt;clear([options])&lt;/h1&gt;
&lt;p&gt;Clears text boxes and input fields (&lt;code&gt;input&lt;/code&gt;, &lt;code&gt;textarea&lt;/code&gt; or &lt;code&gt;contenteditable&lt;/code&gt; elements) of any existing values.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the clear action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;
import { check } from &amp;#34;https://jslib.k6.io/k6-utils/1.5.0/index.js&amp;#34;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const context = await browser.newContext();
  const page = await context.newPage();

  await page.goto(&amp;#34;https://test.k6.io/my_messages.php&amp;#34;, {
    waitUntil: &amp;#39;networkidle&amp;#39;,
  });

  // Fill an input element with some text that we will later clear
  const login = page.locator(&amp;#39;input[name=&amp;#34;login&amp;#34;]&amp;#39;);
  await login.type(&amp;#39;admin&amp;#39;);

  // Check that the element has been filled with text
  await check(login, {
    &amp;#39;not empty&amp;#39;: async lo =&amp;gt; await lo.inputValue() != &amp;#39;&amp;#39;,
  });

  // Now clear the text from the element
  await login.clear();

  // Check that the element is now empty
  await check(login, {
    empty: async lo =&amp;gt; await lo.inputValue() == &amp;#39;&amp;#39;,
  });

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="clearoptions">clear([options])&lt;/h1>
&lt;p>Clears text boxes and input fields (&lt;code>input&lt;/code>, &lt;code>textarea&lt;/code> or &lt;code>contenteditable&lt;/code> elements) of any existing values.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the clear action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
import { check } from &amp;#34;https://jslib.k6.io/k6-utils/1.5.0/index.js&amp;#34;;
export const options = {
scenarios: {
ui: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const context = await browser.newContext();
const page = await context.newPage();
await page.goto(&amp;#34;https://test.k6.io/my_messages.php&amp;#34;, {
waitUntil: &amp;#39;networkidle&amp;#39;,
});
// Fill an input element with some text that we will later clear
const login = page.locator(&amp;#39;input[name=&amp;#34;login&amp;#34;]&amp;#39;);
await login.type(&amp;#39;admin&amp;#39;);
// Check that the element has been filled with text
await check(login, {
&amp;#39;not empty&amp;#39;: async lo =&amp;gt; await lo.inputValue() != &amp;#39;&amp;#39;,
});
// Now clear the text from the element
await login.clear();
// Check that the element is now empty
await check(login, {
empty: async lo =&amp;gt; await lo.inputValue() == &amp;#39;&amp;#39;,
});
await page.close();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>click([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/click/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/click/</guid><content><![CDATA[&lt;h1 id=&#34;clickoptions&#34;&gt;click([options])&lt;/h1&gt;


&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;This method has &lt;strong&gt;known issues&lt;/strong&gt;. For details, refer to &lt;a href=&#34;https://github.com/grafana/xk6-browser/issues/471&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#471&lt;/a&gt; and &lt;a href=&#34;https://github.com/grafana/xk6-browser/issues/474&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#474&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;Mouse click on the chosen element.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.button&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;left&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The mouse button (&lt;code&gt;left&lt;/code&gt;, &lt;code&gt;middle&lt;/code&gt; or &lt;code&gt;right&lt;/code&gt;) to use during the action.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.clickCount&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The number of times the action is performed.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.delay&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Milliseconds to wait between &lt;code&gt;mousedown&lt;/code&gt; and &lt;code&gt;mouseup&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;). Avoid using &lt;code&gt;force: true&lt;/code&gt; in  &lt;code&gt;click&lt;/code&gt; actions, as it may mask underlying test design or app issues. It bypasses normal user interaction checks, and elements may not be clickable due to &lt;a href=&#34;/docs/k6/latest/using-k6-browser/recommended-practices/prevent-cookie-banners-blocking/&#34;&gt;cookie banner interference&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.modifiers&lt;/td&gt;
              &lt;td&gt;string[]&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;Alt&lt;/code&gt;, &lt;code&gt;Control&lt;/code&gt;, &lt;code&gt;Meta&lt;/code&gt; or &lt;code&gt;Shift&lt;/code&gt; modifiers keys pressed during the action. If not specified, currently pressed modifiers are used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.x&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The x coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.y&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The y coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.trial&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will perform the actionability checks without performing the action.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the click action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;examples&#34;&gt;Examples&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const button = page.locator(&amp;#39;#counter-button&amp;#39;);
  await button.click();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When a click action results in a page navigation, remember to work with &lt;code&gt;Promise.all()&lt;/code&gt; and &lt;code&gt;page.waitForNavigation()&lt;/code&gt; to properly handle the asynchronous operation.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  await page.goto(&amp;#39;https://test.k6.io/&amp;#39;);
  const messagesLink = page.locator(&amp;#39;a[href=&amp;#34;/my_messages.php&amp;#34;]&amp;#39;);

  await Promise.all([page.waitForNavigation(), messagesLink.click()]);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="clickoptions">click([options])&lt;/h1>
&lt;div class="admonition admonition-caution">&lt;blockquote>&lt;p class="title text-uppercase">Caution&lt;/p>&lt;p>This method has &lt;strong>known issues&lt;/strong>. For details, refer to &lt;a href="https://github.com/grafana/xk6-browser/issues/471" target="_blank" rel="noopener noreferrer">#471&lt;/a> and &lt;a href="https://github.com/grafana/xk6-browser/issues/474" target="_blank" rel="noopener noreferrer">#474&lt;/a>.&lt;/p>&lt;/blockquote>&lt;/div>
&lt;p>Mouse click on the chosen element.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.button&lt;/td>
&lt;td>string&lt;/td>
&lt;td>&lt;code>left&lt;/code>&lt;/td>
&lt;td>The mouse button (&lt;code>left&lt;/code>, &lt;code>middle&lt;/code> or &lt;code>right&lt;/code>) to use during the action.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.clickCount&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>1&lt;/code>&lt;/td>
&lt;td>The number of times the action is performed.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.delay&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>Milliseconds to wait between &lt;code>mousedown&lt;/code> and &lt;code>mouseup&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>). Avoid using &lt;code>force: true&lt;/code> in &lt;code>click&lt;/code> actions, as it may mask underlying test design or app issues. It bypasses normal user interaction checks, and elements may not be clickable due to &lt;a href="/docs/k6/latest/using-k6-browser/recommended-practices/prevent-cookie-banners-blocking/">cookie banner interference&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.modifiers&lt;/td>
&lt;td>string[]&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;code>Alt&lt;/code>, &lt;code>Control&lt;/code>, &lt;code>Meta&lt;/code> or &lt;code>Shift&lt;/code> modifiers keys pressed during the action. If not specified, currently pressed modifiers are used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.x&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The x coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.y&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The y coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.trial&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will perform the actionability checks without performing the action.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the click action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="examples">Examples&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const button = page.locator(&amp;#39;#counter-button&amp;#39;);
await button.click();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;p>When a click action results in a page navigation, remember to work with &lt;code>Promise.all()&lt;/code> and &lt;code>page.waitForNavigation()&lt;/code> to properly handle the asynchronous operation.&lt;/p></description></item><item><title>contentFrame()</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/contentframe/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/contentframe/</guid><content><![CDATA[&lt;h1 id=&#34;contentframe&#34;&gt;contentFrame()&lt;/h1&gt;
&lt;p&gt;This method returns a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/framelocator/&#34;&gt;FrameLocator&lt;/a&gt; object pointing to the same &lt;code&gt;iframe&lt;/code&gt; as this locator. This is useful when you have a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt; object obtained somewhere, and later on would like to interact with the content inside the frame.&lt;/p&gt;
&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/framelocator/&#34;&gt;FrameLocator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;The &lt;code&gt;FrameLocator&lt;/code&gt; pointing to the same&lt;code&gt;iframe&lt;/code&gt; as this locator.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.setContent(`
      &amp;lt;iframe id=&amp;#34;my_frame&amp;#34; src=&amp;#34;https://quickpizza.grafana.com&amp;#34; width=&amp;#34;50%&amp;#34; height=&amp;#34;50%&amp;#34;&amp;gt;&amp;lt;/iframe&amp;gt;
    `);

    const frameLocator = page.locator(&amp;#39;#my_frame&amp;#39;).contentFrame();
    await frameLocator.getByText(&amp;#39;Pizza, Please!&amp;#39;).click();

    const noThanksBtn = frameLocator.getByText(&amp;#39;No thanks&amp;#39;);
    await noThanksBtn.click();
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="contentframe">contentFrame()&lt;/h1>
&lt;p>This method returns a
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/framelocator/">FrameLocator&lt;/a> object pointing to the same &lt;code>iframe&lt;/code> as this locator. This is useful when you have a
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a> object obtained somewhere, and later on would like to interact with the content inside the frame.&lt;/p></description></item><item><title>count()</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/count/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/count/</guid><content><![CDATA[&lt;h1 id=&#34;count&#34;&gt;count()&lt;/h1&gt;
&lt;p&gt;Returns the number of elements matching the selector. This does not wait for actionability checks (whether the matching elements are &lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, and &lt;code&gt;enabled&lt;/code&gt;). If the return value from &lt;code&gt;count&lt;/code&gt; doesn&amp;rsquo;t match the expected count, then you should manually retry the API call.&lt;/p&gt;
&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A promise which resolves with the number of elements matching the selector.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { expect } from &amp;#39;https://jslib.k6.io/k6-testing/0.6.1/index.js&amp;#39;;
import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://quickpizza.grafana.com/login&amp;#39;);

  const expected = 3;
  let match = false;
  for (let i = 0; i &amp;lt; 5; i&amp;#43;&amp;#43;) {
    match = await page.locator(&amp;#39;input&amp;#39;).count();
    if (match == expected) {
      break;
    }
  }

  expect(match).toEqual(expected);

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="count">count()&lt;/h1>
&lt;p>Returns the number of elements matching the selector. This does not wait for actionability checks (whether the matching elements are &lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, and &lt;code>enabled&lt;/code>). If the return value from &lt;code>count&lt;/code> doesn&amp;rsquo;t match the expected count, then you should manually retry the API call.&lt;/p></description></item><item><title>dblclick([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/dblclick/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/dblclick/</guid><content><![CDATA[&lt;h1 id=&#34;dblclickoptions&#34;&gt;dblclick([options])&lt;/h1&gt;


&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;This feature has known issues. For details, refer to &lt;a href=&#34;https://github.com/grafana/xk6-browser/issues/471&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#471&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;Mouse double click on the chosen element.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.button&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;left&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The mouse button (&lt;code&gt;left&lt;/code&gt;, &lt;code&gt;middle&lt;/code&gt; or &lt;code&gt;right&lt;/code&gt;) to use during the action.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.delay&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Milliseconds to wait between &lt;code&gt;mousedown&lt;/code&gt; and &lt;code&gt;mouseup&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.modifiers&lt;/td&gt;
              &lt;td&gt;string[]&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;Alt&lt;/code&gt;, &lt;code&gt;Control&lt;/code&gt;, &lt;code&gt;Meta&lt;/code&gt; or &lt;code&gt;Shift&lt;/code&gt; modifiers keys pressed during the action. If not specified, currently pressed modifiers are used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.x&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The x coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.y&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The y coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.trial&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will perform the actionability checks without performing the action.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the double click action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const button = page.locator(&amp;#39;#counter-button&amp;#39;);
  await button.dblclick();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="dblclickoptions">dblclick([options])&lt;/h1>
&lt;div class="admonition admonition-caution">&lt;blockquote>&lt;p class="title text-uppercase">Caution&lt;/p>&lt;p>This feature has known issues. For details, refer to &lt;a href="https://github.com/grafana/xk6-browser/issues/471" target="_blank" rel="noopener noreferrer">#471&lt;/a>.&lt;/p>&lt;/blockquote>&lt;/div>
&lt;p>Mouse double click on the chosen element.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.button&lt;/td>
&lt;td>string&lt;/td>
&lt;td>&lt;code>left&lt;/code>&lt;/td>
&lt;td>The mouse button (&lt;code>left&lt;/code>, &lt;code>middle&lt;/code> or &lt;code>right&lt;/code>) to use during the action.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.delay&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>Milliseconds to wait between &lt;code>mousedown&lt;/code> and &lt;code>mouseup&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.modifiers&lt;/td>
&lt;td>string[]&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;code>Alt&lt;/code>, &lt;code>Control&lt;/code>, &lt;code>Meta&lt;/code> or &lt;code>Shift&lt;/code> modifiers keys pressed during the action. If not specified, currently pressed modifiers are used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.x&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The x coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.y&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The y coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.trial&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will perform the actionability checks without performing the action.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the double click action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const button = page.locator(&amp;#39;#counter-button&amp;#39;);
await button.dblclick();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>dispatchEvent(type, eventInit, [options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/dispatchevent/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/dispatchevent/</guid><content><![CDATA[&lt;h1 id=&#34;dispatcheventtype-eventinit-options&#34;&gt;dispatchEvent(type, eventInit, [options])&lt;/h1&gt;
&lt;p&gt;Dispatches HTML DOM event types e.g. &lt;code&gt;&#39;click&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Defaults&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;type&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;DOM event type e.g. &lt;code&gt;&#39;click&#39;&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;eventInit&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Optional event specific properties. See &lt;a href=&#34;#eventinit&#34;&gt;eventInit&lt;/a&gt; for more details.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;eventinit&#34;&gt;eventInit&lt;/h3&gt;
&lt;p&gt;Since eventInit is event-specific, please refer to the events documentation for the lists of initial properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/DragEvent/DragEvent&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;DragEvent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent/FocusEvent&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;FocusEvent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;KeyboardEvent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MouseEvent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/PointerEvent&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PointerEvent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/TouchEvent&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;TouchEvent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Event/Event&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Event&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills once the event is dispatched.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export default async function () {
  const page = await browser.newPage();

  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const button = page.locator(&amp;#39;#counter-button&amp;#39;);
  await button.dispatchEvent(&amp;#39;click&amp;#39;);

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="dispatcheventtype-eventinit-options">dispatchEvent(type, eventInit, [options])&lt;/h1>
&lt;p>Dispatches HTML DOM event types e.g. &lt;code>'click'&lt;/code>.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Defaults&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>type&lt;/td>
&lt;td>string&lt;/td>
&lt;td>&lt;code>''&lt;/code>&lt;/td>
&lt;td>DOM event type e.g. &lt;code>'click'&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>eventInit&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>Optional event specific properties. See &lt;a href="#eventinit">eventInit&lt;/a> for more details.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="eventinit">eventInit&lt;/h3>
&lt;p>Since eventInit is event-specific, please refer to the events documentation for the lists of initial properties:&lt;/p></description></item><item><title>evaluate(pageFunction[, arg])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/evaluate/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/evaluate/</guid><content><![CDATA[&lt;h1 id=&#34;evaluatepagefunction-arg&#34;&gt;evaluate(pageFunction[, arg])&lt;/h1&gt;
&lt;p&gt;Executes JavaScript code in the page, passing the matching element of the locator as the first argument to the &lt;code&gt;pageFunction&lt;/code&gt; and &lt;code&gt;arg&lt;/code&gt; as the following arguments. It returns the value of the &lt;code&gt;pageFunction&lt;/code&gt; invocation.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Defaults&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;pageFunction&lt;/td&gt;
              &lt;td&gt;function or string&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
              &lt;td&gt;Function to be evaluated in the page context.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;arg&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Optional argument to pass to &lt;code&gt;pageFunction&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;Promise&lt;any&gt;&lt;/td&gt;
              &lt;td&gt;The return value of &lt;code&gt;pageFunction&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;
import { check } from &amp;#39;https://jslib.k6.io/k6-utils/1.5.0/index.js&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.goto(&amp;#34;https://quickpizza.grafana.com&amp;#34;, { waitUntil: &amp;#34;load&amp;#34; });

    await page.getByText(&amp;#39;Pizza, Please!&amp;#39;).click();

    await check(page, {
      &amp;#39;pizza name&amp;#39;: async p =&amp;gt; {
        const n = await p.locator(&amp;#39;#pizza-name&amp;#39;).evaluate((pizzaName, extra) =&amp;gt; pizzaName.textContent &amp;#43; extra, &amp;#39; Super pizza!&amp;#39;);
        return n == &amp;#39;Our recommendation: Super pizza!&amp;#39;;
      }
    });
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="evaluatepagefunction-arg">evaluate(pageFunction[, arg])&lt;/h1>
&lt;p>Executes JavaScript code in the page, passing the matching element of the locator as the first argument to the &lt;code>pageFunction&lt;/code> and &lt;code>arg&lt;/code> as the following arguments. It returns the value of the &lt;code>pageFunction&lt;/code> invocation.&lt;/p></description></item><item><title>evaluateHandle(pageFunction[, arg])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/evaluatehandle/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/evaluatehandle/</guid><content><![CDATA[&lt;h1 id=&#34;evaluatehandlepagefunction-arg&#34;&gt;evaluateHandle(pageFunction[, arg])&lt;/h1&gt;
&lt;p&gt;Executes JavaScript code in the page, passing the matching element of the locator as the first argument to the &lt;code&gt;pageFunction&lt;/code&gt; and &lt;code&gt;arg&lt;/code&gt; as the following arguments. It returns the value of the &lt;code&gt;pageFunction&lt;/code&gt; invocation as a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/jshandle/&#34;&gt;JSHandle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The only difference between 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/evaluate/&#34;&gt;&lt;code&gt;evaluate&lt;/code&gt;&lt;/a&gt; and &lt;code&gt;evaluateHandle&lt;/code&gt; is that &lt;code&gt;evaluateHandle&lt;/code&gt; returns 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/jshandle/&#34;&gt;JSHandle&lt;/a&gt;.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Defaults&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;pageFunction&lt;/td&gt;
              &lt;td&gt;function or string&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
              &lt;td&gt;Function to be evaluated in the page context.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;arg&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Optional argument to pass to &lt;code&gt;pageFunction&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;Promise&lt;JSHandle&gt;&lt;/td&gt;
              &lt;td&gt;A 
    &lt;a href=&#34;%28https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/jshandle/%29&#34;&gt;JSHandle&lt;/a&gt; of the return value of &lt;code&gt;pageFunction&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.goto(&amp;#34;https://quickpizza.grafana.com&amp;#34;, { waitUntil: &amp;#34;load&amp;#34; });

    await page.getByText(&amp;#39;Pizza, Please!&amp;#39;).click();

    const jsHandle = await page.locator(&amp;#39;#pizza-name&amp;#39;).evaluateHandle((pizzaName) =&amp;gt; pizzaName);

    const obj = await jsHandle.evaluateHandle((handle) =&amp;gt; {
      return { innerText: handle.innerText };
    });
    console.log(await obj.jsonValue()); // {&amp;#34;innerText&amp;#34;:&amp;#34;Our recommendation:&amp;#34;}
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="evaluatehandlepagefunction-arg">evaluateHandle(pageFunction[, arg])&lt;/h1>
&lt;p>Executes JavaScript code in the page, passing the matching element of the locator as the first argument to the &lt;code>pageFunction&lt;/code> and &lt;code>arg&lt;/code> as the following arguments. It returns the value of the &lt;code>pageFunction&lt;/code> invocation as a
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/jshandle/">JSHandle&lt;/a>.&lt;/p></description></item><item><title>fill(value, [options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/</guid><content><![CDATA[&lt;h1 id=&#34;fillvalue-options&#34;&gt;fill(value, [options])&lt;/h1&gt;
&lt;p&gt;Fill an &lt;code&gt;input&lt;/code&gt;, &lt;code&gt;textarea&lt;/code&gt; or &lt;code&gt;contenteditable&lt;/code&gt; element with the provided value.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;value&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Value to set for the &lt;code&gt;input&lt;/code&gt;, &lt;code&gt;textarea&lt;/code&gt; or &lt;code&gt;contenteditable&lt;/code&gt; element.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the fill action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const textbox = page.locator(&amp;#39;#text1&amp;#39;);
  await textbox.fill(&amp;#39;hello world!&amp;#39;);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;related&#34;&gt;Related&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/presssequentially/&#34;&gt;pressSequentially()&lt;/a&gt; - Type text character by character with keyboard events&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/type/&#34;&gt;type()&lt;/a&gt; - Type text into an input field&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="fillvalue-options">fill(value, [options])&lt;/h1>
&lt;p>Fill an &lt;code>input&lt;/code>, &lt;code>textarea&lt;/code> or &lt;code>contenteditable&lt;/code> element with the provided value.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>value&lt;/td>
&lt;td>string&lt;/td>
&lt;td>&lt;code>''&lt;/code>&lt;/td>
&lt;td>Value to set for the &lt;code>input&lt;/code>, &lt;code>textarea&lt;/code> or &lt;code>contenteditable&lt;/code> element.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the fill action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const textbox = page.locator(&amp;#39;#text1&amp;#39;);
await textbox.fill(&amp;#39;hello world!&amp;#39;);
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;h3 id="related">Related&lt;/h3>
&lt;ul>
&lt;li>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/presssequentially/">pressSequentially()&lt;/a> - Type text character by character with keyboard events&lt;/li>
&lt;li>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/type/">type()&lt;/a> - Type text into an input field&lt;/li>
&lt;/ul></description></item><item><title>filter(options)</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/filter/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/filter/</guid><content><![CDATA[&lt;h1 id=&#34;filteroptions&#34;&gt;filter(options)&lt;/h1&gt;
&lt;p&gt;Returns a new 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt; that matches only elements containing or excluding specified text.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If not provided, the method behaves like a no-op and returns a locator identical to the original one.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.hasText&lt;/td&gt;
              &lt;td&gt;string or RegExp&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Matches only elements that contain the specified text. String or regular expression. Optional.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.hasNotText&lt;/td&gt;
              &lt;td&gt;string or RegExp&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Matches only elements that do not contain the specified text. String or regular expression. Optional.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A new filtered &lt;code&gt;Locator&lt;/code&gt; that can be chained with other methods.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;
import { check } from &amp;#39;https://jslib.k6.io/k6-utils/1.5.0/index.js&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  await page.setContent(`
    &amp;lt;ul&amp;gt;
      &amp;lt;li&amp;gt;
        &amp;lt;h3&amp;gt;Product 1&amp;lt;/h3&amp;gt;
        &amp;lt;button&amp;gt;Add to cart 1&amp;lt;/button&amp;gt;
      &amp;lt;/li&amp;gt;
      &amp;lt;li&amp;gt;
        &amp;lt;h3&amp;gt;Product 2&amp;lt;/h3&amp;gt;
        &amp;lt;button&amp;gt;Add to cart 2&amp;lt;/button&amp;gt;
      &amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  `);

  // Filter list items that contain &amp;#34;Product 2&amp;#34; text
  const product2Item = page
    .locator(&amp;#39;li&amp;#39;)
    .filter({ hasText: &amp;#39;Product 2&amp;#39; })
    .first();

  const product2Text = await product2Item.textContent();
  console.log(product2Text); // Contains &amp;#34;Product 2&amp;#34; and &amp;#34;Add to cart 2&amp;#34;

  // Filter list items that do NOT contain &amp;#34;Product 2&amp;#34; using regex
  const product1Item = page
    .locator(&amp;#39;li&amp;#39;)
    .filter({ hasNotText: /Product 2/ })
    .first();

  const product1Text = await product1Item.textContent();
  console.log(product1Text); // Contains &amp;#34;Product 1&amp;#34; and &amp;#34;Add to cart 1&amp;#34;

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="filteroptions">filter(options)&lt;/h1>
&lt;p>Returns a new
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a> that matches only elements containing or excluding specified text.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>If not provided, the method behaves like a no-op and returns a locator identical to the original one.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.hasText&lt;/td>
&lt;td>string or RegExp&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>Matches only elements that contain the specified text. String or regular expression. Optional.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.hasNotText&lt;/td>
&lt;td>string or RegExp&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>Matches only elements that do not contain the specified text. String or regular expression. Optional.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a>&lt;/td>
&lt;td>A new filtered &lt;code>Locator&lt;/code> that can be chained with other methods.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
import { check } from &amp;#39;https://jslib.k6.io/k6-utils/1.5.0/index.js&amp;#39;;
export const options = {
scenarios: {
ui: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.setContent(`
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;
&amp;lt;h3&amp;gt;Product 1&amp;lt;/h3&amp;gt;
&amp;lt;button&amp;gt;Add to cart 1&amp;lt;/button&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;
&amp;lt;h3&amp;gt;Product 2&amp;lt;/h3&amp;gt;
&amp;lt;button&amp;gt;Add to cart 2&amp;lt;/button&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
`);
// Filter list items that contain &amp;#34;Product 2&amp;#34; text
const product2Item = page
.locator(&amp;#39;li&amp;#39;)
.filter({ hasText: &amp;#39;Product 2&amp;#39; })
.first();
const product2Text = await product2Item.textContent();
console.log(product2Text); // Contains &amp;#34;Product 2&amp;#34; and &amp;#34;Add to cart 2&amp;#34;
// Filter list items that do NOT contain &amp;#34;Product 2&amp;#34; using regex
const product1Item = page
.locator(&amp;#39;li&amp;#39;)
.filter({ hasNotText: /Product 2/ })
.first();
const product1Text = await product1Item.textContent();
console.log(product1Text); // Contains &amp;#34;Product 1&amp;#34; and &amp;#34;Add to cart 1&amp;#34;
await page.close();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>first()</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/first/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/first/</guid><content><![CDATA[&lt;h1 id=&#34;first&#34;&gt;first()&lt;/h1&gt;
&lt;p&gt;Returns a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt; to the first matching element.&lt;/p&gt;
&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;The first element &lt;code&gt;Locator&lt;/code&gt; associated with the selector.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { expect } from &amp;#39;https://jslib.k6.io/k6-testing/0.6.1/index.js&amp;#39;;
import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://quickpizza.grafana.com&amp;#39;);

  await expect(await page.locator(&amp;#39;p&amp;#39;).first()).toContainText(&amp;#39;QuickPizza&amp;#39;);

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="first">first()&lt;/h1>
&lt;p>Returns a
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a> to the first matching element.&lt;/p>
&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a>&lt;/td>
&lt;td>The first element &lt;code>Locator&lt;/code> associated with the selector.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { expect } from &amp;#39;https://jslib.k6.io/k6-testing/0.6.1/index.js&amp;#39;;
import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
ui: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://quickpizza.grafana.com&amp;#39;);
await expect(await page.locator(&amp;#39;p&amp;#39;).first()).toContainText(&amp;#39;QuickPizza&amp;#39;);
await page.close();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>focus([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/focus/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/focus/</guid><content><![CDATA[&lt;h1 id=&#34;focusoptions&#34;&gt;focus([options])&lt;/h1&gt;
&lt;p&gt;Calls &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;focus&lt;/a&gt; on the element, if it can be focused on.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the focus action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const textbox = page.locator(&amp;#39;#text1&amp;#39;);
  await textbox.focus();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="focusoptions">focus([options])&lt;/h1>
&lt;p>Calls &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus" target="_blank" rel="noopener noreferrer">focus&lt;/a> on the element, if it can be focused on.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the focus action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const textbox = page.locator(&amp;#39;#text1&amp;#39;);
await textbox.focus();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>frameLocator(selector)</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/framelocator/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/framelocator/</guid><content><![CDATA[&lt;h1 id=&#34;framelocatorselector&#34;&gt;frameLocator(selector)&lt;/h1&gt;
&lt;p&gt;Shorthand for &lt;code&gt;locator(selector).contentFrame()&lt;/code&gt;. Returns a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/framelocator/&#34;&gt;FrameLocator&lt;/a&gt; for the iframe that matches the given &lt;code&gt;selector&lt;/code&gt;. Use this to interact with elements inside iframes without calling &lt;code&gt;locator()&lt;/code&gt; and &lt;code&gt;contentFrame()&lt;/code&gt; separately.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;selector&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;A selector that resolves to an iframe element (for example &lt;code&gt;iframe#payment&lt;/code&gt; or &lt;code&gt;iframe[name=&amp;quot;form&amp;quot;]&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/framelocator/&#34;&gt;FrameLocator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A &lt;code&gt;FrameLocator&lt;/code&gt; for the matched iframe.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.setContent(`
      &amp;lt;div class=&amp;#34;widget&amp;#34;&amp;gt;&amp;lt;iframe id=&amp;#34;my_frame&amp;#34; src=&amp;#34;https://quickpizza.grafana.com&amp;#34;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/div&amp;gt;
    `);

    // Shorthand: instead of page.locator(&amp;#39;.widget&amp;#39;).locator(&amp;#39;#my_frame&amp;#39;).contentFrame()
    const frame = page.locator(&amp;#39;.widget&amp;#39;).frameLocator(&amp;#39;#my_frame&amp;#39;);
    await frame.getByText(&amp;#39;Pizza, Please!&amp;#39;).click();
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="framelocatorselector">frameLocator(selector)&lt;/h1>
&lt;p>Shorthand for &lt;code>locator(selector).contentFrame()&lt;/code>. Returns a
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/framelocator/">FrameLocator&lt;/a> for the iframe that matches the given &lt;code>selector&lt;/code>. Use this to interact with elements inside iframes without calling &lt;code>locator()&lt;/code> and &lt;code>contentFrame()&lt;/code> separately.&lt;/p></description></item><item><title>getAttribute(name, [options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getattribute/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getattribute/</guid><content><![CDATA[&lt;h1 id=&#34;getattributename-options&#34;&gt;getAttribute(name, [options])&lt;/h1&gt;
&lt;p&gt;Returns the element attribute value for the given attribute name.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;name&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Attribute name to get the value for.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;`Promise&amp;lt;string&lt;/td&gt;
              &lt;td&gt;null&amp;gt;`&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const textbox = page.locator(&amp;#39;#text1&amp;#39;);
  const attribute = await textbox.getAttribute(&amp;#39;onfocus&amp;#39;);
  console.log(attribute);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="getattributename-options">getAttribute(name, [options])&lt;/h1>
&lt;p>Returns the element attribute value for the given attribute name.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>name&lt;/td>
&lt;td>string&lt;/td>
&lt;td>&lt;code>''&lt;/code>&lt;/td>
&lt;td>Attribute name to get the value for.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>`Promise&amp;lt;string&lt;/td>
&lt;td>null&amp;gt;`&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const textbox = page.locator(&amp;#39;#text1&amp;#39;);
const attribute = await textbox.getAttribute(&amp;#39;onfocus&amp;#39;);
console.log(attribute);
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>getByAltText(altText[, options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyalttext/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyalttext/</guid><content><![CDATA[

&lt;div data-shared=&#34;browser/getby-apis/getbyalttext-spec.md&#34;&gt;
            &lt;h1 id=&#34;getbyalttextalttext-options&#34;&gt;getByAltText(altText[, options])&lt;/h1&gt;
&lt;p&gt;Returns a locator for elements with the specified alt text. This method is useful for locating images and other elements that have an &lt;code&gt;alt&lt;/code&gt; attribute, making your tests more accessible and user-focused.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;altText&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string | RegExp&lt;/td&gt;
              &lt;td&gt;-&lt;/td&gt;
              &lt;td&gt;Required. The alt text to search for. Can be a string for exact match or a RegExp for pattern matching.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.exact&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Whether to match the alt text exactly with case sensitivity. When &lt;code&gt;true&lt;/code&gt;, performs a case-sensitive match.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A locator object that can be used to interact with elements matching the specified alt text.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;h3 id=&#34;basic-alt-text-matching&#34;&gt;Basic alt text matching&lt;/h3&gt;
&lt;p&gt;Find and click an image by its alt text:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.goto(&amp;#39;https://quickpizza.grafana.com&amp;#39;);

    const logo = page.locator(&amp;#39;:root&amp;#39;).getByAltText(&amp;#39;LOGO&amp;#39;);
    await logo.waitFor();

    await logo.click();
    await page.waitForLoadState();
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;exact-alt-text-matching&#34;&gt;Exact alt text matching&lt;/h3&gt;
&lt;p&gt;Use exact matching for precise alt text:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.goto(&amp;#39;https://quickpizza.grafana.com&amp;#39;);

    const logo = page.locator(&amp;#39;:root&amp;#39;).getByAltText(&amp;#39;logo&amp;#39;, { exact: true });
    await logo.waitFor();

    await logo.click();
    await page.waitForLoadState();
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;using-regular-expressions&#34;&gt;Using regular expressions&lt;/h3&gt;
&lt;p&gt;Find images using pattern matching:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.goto(&amp;#39;https://quickpizza.grafana.com&amp;#39;);

    const logo = page.locator(&amp;#39;:root&amp;#39;).getByAltText(/logo/s);
    await logo.waitFor();

    await logo.click();
    await page.waitForLoadState();
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div data-shared=&#34;browser/getby-apis/getbyalttext-tips.md&#34;&gt;
            &lt;h2 id=&#34;common-use-cases&#34;&gt;Common use cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Image testing:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Testing image alt text for accessibility compliance&lt;/li&gt;
&lt;li&gt;Interacting with clickable images/banners&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessibility testing:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Ensuring all images have meaningful alt text&lt;/li&gt;
&lt;li&gt;Testing screen reader compatibility&lt;/li&gt;
&lt;li&gt;Validating WCAG compliance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI interaction:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Clicking on logo images to navigate home&lt;/li&gt;
&lt;li&gt;Selecting images in galleries or carousels&lt;/li&gt;
&lt;li&gt;Interacting with image-based buttons&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;best-practices&#34;&gt;Best practices&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use descriptive alt text&lt;/strong&gt;: When creating tests, ensure your application uses meaningful alt text that describes the image content or function.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefer exact matches&lt;/strong&gt;: Use &lt;code&gt;exact: true&lt;/code&gt; when you need precise matching to avoid false positives.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessibility-first&lt;/strong&gt;: Using &lt;code&gt;getByAltText()&lt;/code&gt; encourages better accessibility practices by ensuring images have proper alt attributes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regular expressions for patterns&lt;/strong&gt;: Use RegExp for flexible matching when dealing with dynamic or numbered content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combine with assertions&lt;/strong&gt;: Always verify that the located elements behave as expected using assertions.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

        
&lt;h2 id=&#34;related&#34;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyrole/&#34;&gt;locator.getByRole()&lt;/a&gt; - Locate by ARIA role&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbylabel/&#34;&gt;locator.getByLabel()&lt;/a&gt; - Locate by form labels&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyplaceholder/&#34;&gt;locator.getByPlaceholder()&lt;/a&gt; - Locate by placeholder text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytestid/&#34;&gt;locator.getByTestId()&lt;/a&gt; - Locate by test ID&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytitle/&#34;&gt;locator.getByTitle()&lt;/a&gt; - Locate by title attribute&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytext/&#34;&gt;locator.getByText()&lt;/a&gt; - Locate by visible text&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;div data-shared="browser/getby-apis/getbyalttext-spec.md">
&lt;h1 id="getbyalttextalttext-options">getByAltText(altText[, options])&lt;/h1>
&lt;p>Returns a locator for elements with the specified alt text. This method is useful for locating images and other elements that have an &lt;code>alt&lt;/code> attribute, making your tests more accessible and user-focused.&lt;/p></description></item><item><title>getByLabel(text[, options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbylabel/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbylabel/</guid><content><![CDATA[

&lt;div data-shared=&#34;browser/getby-apis/getbylabel-spec.md&#34;&gt;
            &lt;h1 id=&#34;getbylabeltext-options&#34;&gt;getByLabel(text[, options])&lt;/h1&gt;
&lt;p&gt;Returns a locator for form controls associated with the specified label text. This method is ideal for interacting with form elements in an accessible and user-focused way, as it mirrors how users typically identify form fields.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;text&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string | RegExp&lt;/td&gt;
              &lt;td&gt;-&lt;/td&gt;
              &lt;td&gt;Required. The label text to search for. Can be a string for exact match or a RegExp for pattern matching.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.exact&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Whether to match the label text exactly with case sensitivity. When &lt;code&gt;true&lt;/code&gt;, performs a case-sensitive match.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A locator object that can be used to interact with the form control associated with the specified label.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;h3 id=&#34;basic-form-interaction&#34;&gt;Basic form interaction&lt;/h3&gt;
&lt;p&gt;Fill form fields using their labels:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.setContent(`
      &amp;lt;label for=&amp;#34;username&amp;#34;&amp;gt;Username (hint: default)&amp;lt;/label&amp;gt;
      &amp;lt;input type=&amp;#34;text&amp;#34; id=&amp;#34;username&amp;#34; name=&amp;#34;username&amp;#34;&amp;gt;
      &amp;lt;label for=&amp;#34;password&amp;#34;&amp;gt;Password (hint: 12345678)&amp;lt;/label&amp;gt;
      &amp;lt;input type=&amp;#34;password&amp;#34; id=&amp;#34;password&amp;#34; name=&amp;#34;password&amp;#34;&amp;gt;
    `);

    const locator = page.locator(&amp;#39;:root&amp;#39;);
    const username = locator.getByLabel(&amp;#39;Username (hint: default)&amp;#39;, { exact: true });
    const password = locator.getByLabel(/^Password.*$/);

    await username.fill(&amp;#39;default&amp;#39;);
    await password.fill(&amp;#39;12345678&amp;#39;);
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;working-with-different-input-types&#34;&gt;Working with different input types&lt;/h3&gt;
&lt;p&gt;Handle various form control types in various label association patterns:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.setContent(`
      &amp;lt;label for=&amp;#34;username&amp;#34;&amp;gt;Username (hint: default)&amp;lt;/label&amp;gt;
      &amp;lt;input type=&amp;#34;text&amp;#34; id=&amp;#34;username&amp;#34; name=&amp;#34;username&amp;#34;&amp;gt;
      &amp;lt;span id=&amp;#34;password-label&amp;#34;&amp;gt;Password (hint: 12345678)&amp;lt;/span&amp;gt;
      &amp;lt;input type=&amp;#34;password&amp;#34; aria-labelledby=&amp;#34;password-label&amp;#34;&amp;gt;
      &amp;lt;label for=&amp;#34;subscribe&amp;#34;&amp;gt;Subscribe to newsletter&amp;lt;/label&amp;gt;
      &amp;lt;input type=&amp;#34;checkbox&amp;#34; id=&amp;#34;subscribe&amp;#34; name=&amp;#34;subscribe&amp;#34;&amp;gt;
      &amp;lt;label for=&amp;#34;email&amp;#34;&amp;gt;Email&amp;lt;/label&amp;gt;
      &amp;lt;input type=&amp;#34;radio&amp;#34; id=&amp;#34;email&amp;#34; value=&amp;#34;email&amp;#34;&amp;gt;
      &amp;lt;label for=&amp;#34;sms&amp;#34;&amp;gt;Text message&amp;lt;/label&amp;gt;
      &amp;lt;input type=&amp;#34;radio&amp;#34; id=&amp;#34;sms&amp;#34; value=&amp;#34;sms&amp;#34;&amp;gt;
      &amp;lt;label for=&amp;#34;theme&amp;#34;&amp;gt;Theme&amp;lt;/label&amp;gt;
      &amp;lt;select id=&amp;#34;theme&amp;#34; name=&amp;#34;theme&amp;#34;&amp;gt;
        &amp;lt;option value=&amp;#34;light&amp;#34;&amp;gt;Light&amp;lt;/option&amp;gt;
        &amp;lt;option value=&amp;#34;dark&amp;#34;&amp;gt;Dark&amp;lt;/option&amp;gt;
        &amp;lt;option value=&amp;#34;system&amp;#34;&amp;gt;System&amp;lt;/option&amp;gt;
      &amp;lt;/select&amp;gt;
      &amp;lt;textarea aria-label=&amp;#34;Comments&amp;#34;&amp;gt;&amp;lt;/textarea&amp;gt;
    `);

    const locator = page.locator(&amp;#39;:root&amp;#39;);

    // Inputs
    await locator.getByLabel(&amp;#39;Username (hint: default)&amp;#39;, { exact: true }).fill(&amp;#39;default&amp;#39;);
    await locator.getByLabel(/^Password.*$/).fill(&amp;#39;12345678&amp;#39;);

    // Checkbox
    await locator.getByLabel(&amp;#39;Subscribe to newsletter&amp;#39;).check();

    // Radio button
    await locator.getByLabel(&amp;#39;Email&amp;#39;, { exact: true }).check();

    // Select dropdown
    await locator.getByLabel(&amp;#39;Theme&amp;#39;).selectOption(&amp;#39;light&amp;#39;);

    // Textarea
    await locator.getByLabel(&amp;#39;Comments&amp;#39;).fill(&amp;#39;This is a test comment&amp;#39;);
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div data-shared=&#34;browser/getby-apis/getbylabel-tips.md&#34;&gt;
            &lt;h2 id=&#34;label-association-patterns&#34;&gt;Label association patterns&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;getByLabel()&lt;/code&gt; method works with several HTML patterns for associating labels with form controls:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Explicit association with &lt;code&gt;for&lt;/code&gt; attribute:&lt;/p&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;HTML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;&amp;lt;label for=&amp;#34;username&amp;#34;&amp;gt;Username&amp;lt;/label&amp;gt; &amp;lt;input type=&amp;#34;text&amp;#34; id=&amp;#34;username&amp;#34; name=&amp;#34;username&amp;#34; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ARIA labeling:&lt;/p&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;HTML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;&amp;lt;span id=&amp;#34;username-label&amp;#34;&amp;gt;Username&amp;lt;/span&amp;gt; &amp;lt;input type=&amp;#34;text&amp;#34; aria-labelledby=&amp;#34;username-label&amp;#34; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ARIA label attribute:&lt;/p&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;HTML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;&amp;lt;input type=&amp;#34;text&amp;#34; aria-label=&amp;#34;Username&amp;#34; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;common-use-cases&#34;&gt;Common use cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form testing&lt;/strong&gt;: Login forms, registration forms, contact forms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E-commerce&lt;/strong&gt;: Checkout forms, shipping information, payment details&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings pages&lt;/strong&gt;: User preferences, account settings, configuration forms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessibility testing&lt;/strong&gt;: Ensuring proper label association and screen reader compatibility&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;best-practices&#34;&gt;Best practices&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Accessibility-first approach&lt;/strong&gt;: Using &lt;code&gt;getByLabel()&lt;/code&gt; ensures your tests work the same way users with assistive technology interact with forms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meaningful labels&lt;/strong&gt;: Encourage developers to use descriptive, unique label text that clearly identifies the form control&amp;rsquo;s purpose.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Required field indicators&lt;/strong&gt;: When testing required fields, include any visual indicators (like asterisks) in your label text matching.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Form validation testing&lt;/strong&gt;: Use labels to test form validation scenarios, as they provide a stable way to identify fields regardless of styling changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

        
&lt;h2 id=&#34;related&#34;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyrole/&#34;&gt;locator.getByRole()&lt;/a&gt; - Locate by ARIA role&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyalttext/&#34;&gt;locator.getByAltText()&lt;/a&gt; - Locate by alt text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyplaceholder/&#34;&gt;locator.getByPlaceholder()&lt;/a&gt; - Locate by placeholder text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytestid/&#34;&gt;locator.getByTestId()&lt;/a&gt; - Locate by test ID&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytitle/&#34;&gt;locator.getByTitle()&lt;/a&gt; - Locate by title attribute&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytext/&#34;&gt;locator.getByText()&lt;/a&gt; - Locate by text content&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;div data-shared="browser/getby-apis/getbylabel-spec.md">
&lt;h1 id="getbylabeltext-options">getByLabel(text[, options])&lt;/h1>
&lt;p>Returns a locator for form controls associated with the specified label text. This method is ideal for interacting with form elements in an accessible and user-focused way, as it mirrors how users typically identify form fields.&lt;/p></description></item><item><title>getByPlaceholder(placeholder[, options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyplaceholder/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyplaceholder/</guid><content><![CDATA[

&lt;div data-shared=&#34;browser/getby-apis/getbyplaceholder-spec.md&#34;&gt;
            &lt;h1 id=&#34;getbyplaceholderplaceholder-options&#34;&gt;getByPlaceholder(placeholder[, options])&lt;/h1&gt;
&lt;p&gt;Returns a locator for input elements with the specified &lt;code&gt;placeholder&lt;/code&gt; attribute. This method is useful for locating form fields that use &lt;code&gt;placeholder&lt;/code&gt; attribute to provide hints or examples to users about the expected input format.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;placeholder&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string | RegExp&lt;/td&gt;
              &lt;td&gt;-&lt;/td&gt;
              &lt;td&gt;Required. The placeholder text to search for. Can be a string for exact match or a RegExp for pattern matching.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.exact&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Whether to match the placeholder text exactly with case sensitivity. When &lt;code&gt;true&lt;/code&gt;, performs a case-sensitive match.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A locator object that can be used to interact with the input elements matching the specified placeholder text.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;
&lt;p&gt;Find and fill inputs by their placeholder text:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.setContent(`
      &amp;lt;input type=&amp;#34;text&amp;#34; placeholder=&amp;#34;First name&amp;#34;&amp;gt;
      &amp;lt;input type=&amp;#34;text&amp;#34; placeholder=&amp;#34;Last name&amp;#34;&amp;gt;
      &amp;lt;input type=&amp;#34;text&amp;#34; placeholder=&amp;#34;dd/mm/yyyy&amp;#34;&amp;gt;
      &amp;lt;input type=&amp;#34;text&amp;#34; placeholder=&amp;#34;your.email@example.com&amp;#34;&amp;gt;
      &amp;lt;input type=&amp;#34;text&amp;#34; placeholder=&amp;#34;&amp;#43;1 (555) 123-4567&amp;#34;&amp;gt;
    `);

    const locator = page.locator(&amp;#39;:root&amp;#39;);
    await locator.getByPlaceholder(&amp;#39;First name&amp;#39;).fill(&amp;#39;First&amp;#39;);
    await locator.getByPlaceholder(&amp;#39;Last name&amp;#39;).fill(&amp;#39;Last&amp;#39;);
    await locator.getByPlaceholder(&amp;#39;dd/mm/yyyy&amp;#39;).fill(&amp;#39;01/01/1990&amp;#39;);

    await locator.getByPlaceholder(&amp;#39;your.email@example.com&amp;#39;).fill(&amp;#39;first.last@example.com&amp;#39;);
    await locator.getByPlaceholder(&amp;#39;&amp;#43;1 (555) 123-4567&amp;#39;).fill(&amp;#39;&amp;#43;1 (555) 987-6543&amp;#39;);
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div data-shared=&#34;browser/getby-apis/getbyplaceholder-tips.md&#34;&gt;
            &lt;h2 id=&#34;common-use-cases&#34;&gt;Common use cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form field identification:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Login and registration forms without explicit labels&lt;/li&gt;
&lt;li&gt;Quick search boxes&lt;/li&gt;
&lt;li&gt;Filter and input controls&lt;/li&gt;
&lt;li&gt;Comment and feedback forms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E-commerce:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Product search bars&lt;/li&gt;
&lt;li&gt;Quantity input fields&lt;/li&gt;
&lt;li&gt;Promo code entry&lt;/li&gt;
&lt;li&gt;Address and payment information&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interactive applications:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Chat input fields&lt;/li&gt;
&lt;li&gt;Command input interfaces&lt;/li&gt;
&lt;li&gt;Settings and configuration forms&lt;/li&gt;
&lt;li&gt;Data entry applications&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;best-practices&#34;&gt;Best practices&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Complement, don&amp;rsquo;t replace labels&lt;/strong&gt;: Placeholder text should supplement, not replace proper form labels for accessibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use descriptive placeholders&lt;/strong&gt;: Ensure placeholder text clearly indicates the expected input format or content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consider internationalization&lt;/strong&gt;: When testing multi-language applications, be aware that placeholder text may change.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessibility considerations&lt;/strong&gt;: Remember that placeholder text alone may not be sufficient for users with disabilities.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

        
&lt;h2 id=&#34;related&#34;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyrole/&#34;&gt;locator.getByRole()&lt;/a&gt; - Locate by ARIA role&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyalttext/&#34;&gt;locator.getByAltText()&lt;/a&gt; - Locate by alt text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbylabel/&#34;&gt;locator.getByLabel()&lt;/a&gt; - Locate by form labels (preferred for accessibility)&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytestid/&#34;&gt;locator.getByTestId()&lt;/a&gt; - Locate by test ID&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytitle/&#34;&gt;locator.getByTitle()&lt;/a&gt; - Locate by title attribute&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytext/&#34;&gt;locator.getByText()&lt;/a&gt; - Locate by visible text&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;div data-shared="browser/getby-apis/getbyplaceholder-spec.md">
&lt;h1 id="getbyplaceholderplaceholder-options">getByPlaceholder(placeholder[, options])&lt;/h1>
&lt;p>Returns a locator for input elements with the specified &lt;code>placeholder&lt;/code> attribute. This method is useful for locating form fields that use &lt;code>placeholder&lt;/code> attribute to provide hints or examples to users about the expected input format.&lt;/p></description></item><item><title>getByRole(role[, options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyrole/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyrole/</guid><content><![CDATA[

&lt;div data-shared=&#34;browser/getby-apis/getbyrole-spec.md&#34;&gt;
            &lt;h1 id=&#34;getbyrolerole-options&#34;&gt;getByRole(role[, options])&lt;/h1&gt;
&lt;p&gt;Returns a locator for elements with the specified ARIA role. This is the preferred way to locate elements as it most closely resembles how users and assistive technology perceive the page.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;role&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;-&lt;/td&gt;
              &lt;td&gt;Required. The ARIA role to search for. For example, &lt;code&gt;&#39;button&#39;&lt;/code&gt;, &lt;code&gt;&#39;link&#39;&lt;/code&gt;, &lt;code&gt;&#39;heading&#39;&lt;/code&gt;, or &lt;code&gt;&#39;textbox&#39;&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.checked&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Filter elements by their checked state. Only applicable for roles like &lt;code&gt;checkbox&lt;/code&gt;, &lt;code&gt;radio&lt;/code&gt;, &lt;code&gt;menuitemcheckbox&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.disabled&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Filter elements by their disabled state.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.exact&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Whether to match the accessible name exactly with case sensitivity. When &lt;code&gt;true&lt;/code&gt;, performs a case-sensitive match.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.expanded&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Filter elements by their expanded state. Only applicable for roles that support the &lt;code&gt;aria-expanded&lt;/code&gt; attribute.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.includeHidden&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Whether to include elements that are normally excluded from the accessibility tree in the search.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.level&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Filter headings by their level 1 to 6. Only applicable for &lt;code&gt;heading&lt;/code&gt; role.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.name&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string|RegExp&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Filter elements by their accessible name. The accessible name is typically the text content, label text, or aria-label attribute.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.pressed&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Filter elements by their pressed state. Only applicable for roles like &lt;code&gt;button&lt;/code&gt; with toggle behavior.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.selected&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Filter elements by their selected state. Only applicable for roles like &lt;code&gt;option&lt;/code&gt;, &lt;code&gt;tab&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A locator object that can be used to interact with the elements matching the specified role and options.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;h3 id=&#34;basic-role-selection&#34;&gt;Basic role selection&lt;/h3&gt;
&lt;p&gt;Find and click a button by its role:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.goto(&amp;#39;https://quickpizza.grafana.com/&amp;#39;);

    const locator = page.locator(&amp;#39;:root&amp;#39;);
    await locator.getByRole(&amp;#39;button&amp;#39;, { name: &amp;#39;Pizza, Please!&amp;#39; }).click();
  } finally {
    page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div data-shared=&#34;browser/getby-apis/getbyrole-tips.md&#34;&gt;
            &lt;h2 id=&#34;complete-aria-roles-reference&#34;&gt;Complete ARIA roles reference&lt;/h2&gt;
&lt;p&gt;The following roles are supported and can be used with &lt;code&gt;getByRole()&lt;/code&gt;, organized by category:&lt;/p&gt;
&lt;h3 id=&#34;widgets--inputs&#34;&gt;Widgets &amp;amp; Inputs&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;button&lt;/code&gt; - Buttons and clickable elements&lt;/li&gt;
&lt;li&gt;&lt;code&gt;checkbox&lt;/code&gt; - Checkable boxes that can be on/off&lt;/li&gt;
&lt;li&gt;&lt;code&gt;combobox&lt;/code&gt; - Editable drop-down menu combining input and list box&lt;/li&gt;
&lt;li&gt;&lt;code&gt;listbox&lt;/code&gt; - Container for selectable list options&lt;/li&gt;
&lt;li&gt;&lt;code&gt;menu&lt;/code&gt; - Menu of actions or navigation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;menubar&lt;/code&gt; - Container for top-level menus&lt;/li&gt;
&lt;li&gt;&lt;code&gt;menuitem&lt;/code&gt; - Option within a menu&lt;/li&gt;
&lt;li&gt;&lt;code&gt;menuitemcheckbox&lt;/code&gt; - Checkable menu item&lt;/li&gt;
&lt;li&gt;&lt;code&gt;menuitemradio&lt;/code&gt; - Mutually exclusive menu item&lt;/li&gt;
&lt;li&gt;&lt;code&gt;meter&lt;/code&gt; - Scalar measurement within a known range&lt;/li&gt;
&lt;li&gt;&lt;code&gt;option&lt;/code&gt; - Selectable option in a list box or combo box&lt;/li&gt;
&lt;li&gt;&lt;code&gt;progressbar&lt;/code&gt; - Progress indicator of an operation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;radio&lt;/code&gt; - Single-select option in a group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;radiogroup&lt;/code&gt; - Grouping of related radio buttons&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scrollbar&lt;/code&gt; - Control for scrolling content&lt;/li&gt;
&lt;li&gt;&lt;code&gt;searchbox&lt;/code&gt; - Text field for search input&lt;/li&gt;
&lt;li&gt;&lt;code&gt;separator&lt;/code&gt; - Divider that separates content or controls&lt;/li&gt;
&lt;li&gt;&lt;code&gt;slider&lt;/code&gt; - Adjustable value control within a range&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spinbutton&lt;/code&gt; - Numeric input with increment/decrement controls&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt; - Advisory status information (non-alert)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;switch&lt;/code&gt; - On/off toggle control&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tab&lt;/code&gt; - A tab in a tabbed interface&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tablist&lt;/code&gt; - Container for a set of tabs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tabpanel&lt;/code&gt; - Content panel associated with a tab&lt;/li&gt;
&lt;li&gt;&lt;code&gt;textbox&lt;/code&gt; - Input field for free-form text&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timer&lt;/code&gt; - Running time display that updates&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toolbar&lt;/code&gt; - Group of interactive controls&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tooltip&lt;/code&gt; - Contextual help popup&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tree&lt;/code&gt; - Hierarchical list of items&lt;/li&gt;
&lt;li&gt;&lt;code&gt;treeitem&lt;/code&gt; - Item in a tree&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;tables--grids&#34;&gt;Tables &amp;amp; Grids&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;table&lt;/code&gt; - Tabular data with rows and columns.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rowgroup&lt;/code&gt; - Section that groups rows. For example, &lt;code&gt;thead&lt;/code&gt;, &lt;code&gt;tbody&lt;/code&gt;, &lt;code&gt;tfoot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;row&lt;/code&gt; - A row of cells within a table or grid.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rowheader&lt;/code&gt; - Header cell for a row.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;columnheader&lt;/code&gt; - Header cell for a column.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cell&lt;/code&gt; - Data cell in a table.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid&lt;/code&gt; - Interactive, tabular widget, such as a spreadsheet.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gridcell&lt;/code&gt; - Cell within a grid.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;treegrid&lt;/code&gt; - Tree-structured grid with expandable rows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;document-structure--semantics&#34;&gt;Document Structure &amp;amp; Semantics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;article&lt;/code&gt; - Self-contained composition (article)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;blockquote&lt;/code&gt; - Quotation from another source&lt;/li&gt;
&lt;li&gt;&lt;code&gt;caption&lt;/code&gt; - Caption for a figure, table, or media&lt;/li&gt;
&lt;li&gt;&lt;code&gt;code&lt;/code&gt; - Fragment of computer code&lt;/li&gt;
&lt;li&gt;&lt;code&gt;definition&lt;/code&gt; - Definition of a term&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deletion&lt;/code&gt; - Content removed from a document&lt;/li&gt;
&lt;li&gt;&lt;code&gt;directory&lt;/code&gt; - List of references&lt;/li&gt;
&lt;li&gt;&lt;code&gt;document&lt;/code&gt; - Standalone document content&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emphasis&lt;/code&gt; - Content with emphatic stress&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feed&lt;/code&gt; - Stream of articles or entries&lt;/li&gt;
&lt;li&gt;&lt;code&gt;figure&lt;/code&gt; - Figure with optional caption&lt;/li&gt;
&lt;li&gt;&lt;code&gt;generic&lt;/code&gt; - Generic container with no specific semantics&lt;/li&gt;
&lt;li&gt;&lt;code&gt;img&lt;/code&gt; - Image treated as a single graphic&lt;/li&gt;
&lt;li&gt;&lt;code&gt;insertion&lt;/code&gt; - Content added to a document&lt;/li&gt;
&lt;li&gt;&lt;code&gt;link&lt;/code&gt; - Hyperlink to another location&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list&lt;/code&gt; - List of items&lt;/li&gt;
&lt;li&gt;&lt;code&gt;listitem&lt;/code&gt; - A single item within a list&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mark&lt;/code&gt; - Highlighted or marked content&lt;/li&gt;
&lt;li&gt;&lt;code&gt;marquee&lt;/code&gt; - Scrolling region of text&lt;/li&gt;
&lt;li&gt;&lt;code&gt;math&lt;/code&gt; - Mathematical expression&lt;/li&gt;
&lt;li&gt;&lt;code&gt;note&lt;/code&gt; - An aside or annotation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;none&lt;/code&gt; - No semantic role; remove semantics&lt;/li&gt;
&lt;li&gt;&lt;code&gt;paragraph&lt;/code&gt; - Paragraph of text&lt;/li&gt;
&lt;li&gt;&lt;code&gt;presentation&lt;/code&gt; - Presentational only; ignore semantics&lt;/li&gt;
&lt;li&gt;&lt;code&gt;strong&lt;/code&gt; - Content of strong importance&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subscript&lt;/code&gt; - Subscripted text&lt;/li&gt;
&lt;li&gt;&lt;code&gt;superscript&lt;/code&gt; - Superscripted text&lt;/li&gt;
&lt;li&gt;&lt;code&gt;term&lt;/code&gt; - A term being defined&lt;/li&gt;
&lt;li&gt;&lt;code&gt;time&lt;/code&gt; - A time or date&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;landmarks--regions&#34;&gt;Landmarks &amp;amp; Regions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;banner&lt;/code&gt; - Site header landmark&lt;/li&gt;
&lt;li&gt;&lt;code&gt;complementary&lt;/code&gt; - Complementary content (sidebar)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;contentinfo&lt;/code&gt; - Page footer information&lt;/li&gt;
&lt;li&gt;&lt;code&gt;form&lt;/code&gt; - Region containing a form&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt; - Main content landmark&lt;/li&gt;
&lt;li&gt;&lt;code&gt;navigation&lt;/code&gt; - Navigation region of links&lt;/li&gt;
&lt;li&gt;&lt;code&gt;region&lt;/code&gt; - Generic region of the page&lt;/li&gt;
&lt;li&gt;&lt;code&gt;search&lt;/code&gt; - Search region&lt;/li&gt;
&lt;li&gt;&lt;code&gt;application&lt;/code&gt; - Application container widget&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;usage-examples-by-category&#34;&gt;Usage Examples by Category&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Form Testing:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- md-k6:skip --&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;// Text inputs
await page.getByRole(&amp;#39;textbox&amp;#39;, { name: &amp;#39;Email&amp;#39; }).fill(&amp;#39;user@example.com&amp;#39;);
await page.getByRole(&amp;#39;searchbox&amp;#39;, { name: &amp;#39;Search products&amp;#39; }).fill(&amp;#39;laptop&amp;#39;);

// Selections
await page.getByRole(&amp;#39;checkbox&amp;#39;, { name: &amp;#39;Agree to terms&amp;#39; }).check();
await page.getByRole(&amp;#39;radio&amp;#39;, { name: &amp;#39;Standard shipping&amp;#39; }).check();
await page.getByRole(&amp;#39;combobox&amp;#39;, { name: &amp;#39;Country&amp;#39; }).selectOption(&amp;#39;US&amp;#39;);

// Interactive controls
await page.getByRole(&amp;#39;slider&amp;#39;, { name: &amp;#39;Volume&amp;#39; }).fill(&amp;#39;75&amp;#39;);
await page.getByRole(&amp;#39;switch&amp;#39;, { name: &amp;#39;Enable notifications&amp;#39; }).click();&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Navigation Testing:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- md-k6:skip --&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;// Tabs
await page.getByRole(&amp;#39;tab&amp;#39;, { name: &amp;#39;Overview&amp;#39; }).click();
await expect(page.getByRole(&amp;#39;tabpanel&amp;#39;, { name: &amp;#39;Overview&amp;#39; })).toBeVisible();&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Content Verification:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- md-k6:skip --&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;// Structure
await expect(page.getByRole(&amp;#39;article&amp;#39;)).toHaveCount(5);
await expect(page.getByRole(&amp;#39;heading&amp;#39;, { level: 1 })).toHaveText(&amp;#39;Welcome&amp;#39;);

// Status and feedback
await expect(page.getByRole(&amp;#39;alert&amp;#39;)).toHaveText(&amp;#39;Form submitted successfully&amp;#39;);
await expect(page.getByRole(&amp;#39;status&amp;#39;)).toHaveText(&amp;#39;3 items selected&amp;#39;);&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;best-practices&#34;&gt;Best practices&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prefer role-based selection&lt;/strong&gt;: &lt;code&gt;getByRole()&lt;/code&gt; is the preferred method for locating elements as it closely mirrors how users and assistive technology interact with your page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use accessible names&lt;/strong&gt;: Always try to use the &lt;code&gt;name&lt;/code&gt; option to make your tests more specific and reliable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consider accessibility&lt;/strong&gt;: Using &lt;code&gt;getByRole()&lt;/code&gt; encourages better accessibility practices in your application by ensuring elements have proper ARIA roles.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

        
&lt;h2 id=&#34;related&#34;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyalttext/&#34;&gt;locator.getByAltText()&lt;/a&gt; - Locate by alt text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbylabel/&#34;&gt;locator.getByLabel()&lt;/a&gt; - Locate by form labels&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyplaceholder/&#34;&gt;locator.getByPlaceholder()&lt;/a&gt; - Locate by placeholder text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytestid/&#34;&gt;locator.getByTestId()&lt;/a&gt; - Locate by test ID&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytext/&#34;&gt;locator.getByText()&lt;/a&gt; - Locate by text content&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytitle/&#34;&gt;locator.getByTitle()&lt;/a&gt; - Locate by title attribute&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;div data-shared="browser/getby-apis/getbyrole-spec.md">
&lt;h1 id="getbyrolerole-options">getByRole(role[, options])&lt;/h1>
&lt;p>Returns a locator for elements with the specified ARIA role. This is the preferred way to locate elements as it most closely resembles how users and assistive technology perceive the page.&lt;/p></description></item><item><title>getByTestId(testId)</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytestid/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytestid/</guid><content><![CDATA[

&lt;div data-shared=&#34;browser/getby-apis/getbytestid-spec.md&#34;&gt;
            &lt;h1 id=&#34;getbytestidtestid&#34;&gt;getByTestId(testId)&lt;/h1&gt;
&lt;p&gt;Returns a locator for elements with the specified test ID attribute. This method is designed for robust test automation by locating elements using dedicated test identifiers that are independent of the visual appearance or content changes. Currently it can only work with the &lt;code&gt;data-testid&lt;/code&gt; attribute.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;testId&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string | RegExp&lt;/td&gt;
              &lt;td&gt;-&lt;/td&gt;
              &lt;td&gt;Required. The test ID value to search for. Searches for the &lt;code&gt;data-testid&lt;/code&gt; attribute. Can be a string for exact match or a RegExp for pattern matching.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A locator object that can be used to interact with the elements matching the specified test ID.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;h3 id=&#34;basic-test-id-usage&#34;&gt;Basic test ID usage&lt;/h3&gt;
&lt;p&gt;Locate and interact with elements using test IDs:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.setContent(`
      &amp;lt;input type=&amp;#34;text&amp;#34; data-testid=&amp;#34;username&amp;#34;&amp;gt;
      &amp;lt;input type=&amp;#34;text&amp;#34; data-testid=&amp;#34;email&amp;#34;&amp;gt;
      &amp;lt;button data-testid=&amp;#34;submit-button&amp;#34;&amp;gt;Submit&amp;lt;/button&amp;gt;
    `);

    const locator = page.locator(&amp;#39;:root&amp;#39;);
    await locator.getByTestId(&amp;#39;username&amp;#39;).fill(&amp;#39;FirstLast&amp;#39;);
    await locator.getByTestId(&amp;#39;email&amp;#39;).fill(&amp;#39;firstlast@example.com&amp;#39;);
    await locator.getByTestId(&amp;#39;submit-button&amp;#39;).click();
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div data-shared=&#34;browser/getby-apis/getbytestid-tips.md&#34;&gt;
            &lt;h2 id=&#34;best-practices&#34;&gt;Best practices&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Stable identifiers&lt;/strong&gt;: Use meaningful, stable test IDs that won&amp;rsquo;t change with refactoring or content updates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hierarchical naming&lt;/strong&gt;: Use consistent naming conventions like &lt;code&gt;user-profile-edit-btn&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid duplicates&lt;/strong&gt;: Ensure test IDs are unique within the page to prevent ambiguity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strategic placement&lt;/strong&gt;: Add test IDs to key interactive elements and components that are frequently tested.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team coordination&lt;/strong&gt;: Establish test ID conventions with your development team to ensure consistency.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

        
&lt;h2 id=&#34;related&#34;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyrole/&#34;&gt;locator.getByRole()&lt;/a&gt; - Locate by ARIA role&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyalttext/&#34;&gt;locator.getByAltText()&lt;/a&gt; - Locate by alt text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbylabel/&#34;&gt;locator.getByLabel()&lt;/a&gt; - Locate by form labels&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyplaceholder/&#34;&gt;locator.getByPlaceholder()&lt;/a&gt; - Locate by placeholder text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytext/&#34;&gt;locator.getByText()&lt;/a&gt; - Locate by text content&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytitle/&#34;&gt;locator.getByTitle()&lt;/a&gt; - Locate by title attribute&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;div data-shared="browser/getby-apis/getbytestid-spec.md">
&lt;h1 id="getbytestidtestid">getByTestId(testId)&lt;/h1>
&lt;p>Returns a locator for elements with the specified test ID attribute. This method is designed for robust test automation by locating elements using dedicated test identifiers that are independent of the visual appearance or content changes. Currently it can only work with the &lt;code>data-testid&lt;/code> attribute.&lt;/p></description></item><item><title>getByText(text[, options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytext/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytext/</guid><content><![CDATA[

&lt;div data-shared=&#34;browser/getby-apis/getbytext-spec.md&#34;&gt;
            &lt;h1 id=&#34;getbytexttext-options&#34;&gt;getByText(text[, options])&lt;/h1&gt;
&lt;p&gt;Returns a locator for elements containing the specified text. This method finds elements by their visible text content, making it ideal for locating user-facing content like buttons, links, headings, and other text elements.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;text&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string | RegExp&lt;/td&gt;
              &lt;td&gt;-&lt;/td&gt;
              &lt;td&gt;Required. The text content to search for. Can be a string for exact match or a RegExp for pattern matching.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.exact&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Whether to match the text exactly with case sensitivity. When &lt;code&gt;true&lt;/code&gt;, performs a case-sensitive match.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A locator object that can be used to interact with the elements containing the specified text.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;p&gt;Find and click elements by their visible text:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.goto(&amp;#39;https://quickpizza.grafana.com/&amp;#39;);

    const locator = page.locator(&amp;#39;:root&amp;#39;);
    await locator.getByText(&amp;#39;Pizza, Please!&amp;#39;).click();

    const noThanksBtn = locator.getByText(&amp;#39;No thanks&amp;#39;);
    await noThanksBtn.click();
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div data-shared=&#34;browser/getby-apis/getbytext-tips.md&#34;&gt;
            &lt;h2 id=&#34;text-matching-behavior&#34;&gt;Text matching behavior&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Whitespace normalization&lt;/strong&gt;: Text matching automatically normalizes whitespace, meaning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple spaces become single spaces&lt;/li&gt;
&lt;li&gt;Line breaks become spaces&lt;/li&gt;
&lt;li&gt;Leading and trailing whitespace is ignored&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consider the following DOM structure:&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;HTML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;&amp;lt;div&amp;gt;Hello &amp;lt;span&amp;gt;world&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;Hello&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can locate by text substring, exact string, or a regular expression:&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;
&lt;!-- eslint-skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;js&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-js&#34;&gt;// Matches &amp;lt;span&amp;gt;
page.getByText(&amp;#39;world&amp;#39;);
// Matches first &amp;lt;div&amp;gt;
page.getByText(&amp;#39;Hello world&amp;#39;);
// Matches second &amp;lt;div&amp;gt;
page.getByText(&amp;#39;Hello&amp;#39;, { exact: true });
// Matches both &amp;lt;div&amp;gt;s
page.getByText(/Hello/);
// Matches second &amp;lt;div&amp;gt;
page.getByText(/^hello$/i);&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;common-use-cases&#34;&gt;Common use cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Button interactions&lt;/strong&gt;: Submit, Cancel, Delete, Edit buttons&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Navigation&lt;/strong&gt;: Menu items, breadcrumbs, pagination links&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content verification&lt;/strong&gt;: Success messages, error messages, headings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Form interactions&lt;/strong&gt;: Checkbox labels, radio button options&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status indicators&lt;/strong&gt;: Active, Inactive, Pending states&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;best-practices&#34;&gt;Best practices&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;User-focused testing&lt;/strong&gt;: Using &lt;code&gt;getByText()&lt;/code&gt; ensures your tests interact with content as users see it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid brittle text&lt;/strong&gt;: Be cautious with exact text that might change frequently (like dates, counts, or user-generated content).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use meaningful text&lt;/strong&gt;: Prefer descriptive button text and labels over generic terms like &amp;ldquo;Click here&amp;rdquo; or &amp;ldquo;Button&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handle dynamic content&lt;/strong&gt;: Use regular expressions for text that contains variable parts (timestamps, user names, counts).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consider accessibility&lt;/strong&gt;: Text-based selection encourages better accessibility practices in your application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internationalization&lt;/strong&gt;: For multi-language applications, consider using test IDs or roles instead of text for critical interactions.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

        
&lt;h2 id=&#34;related&#34;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyrole/&#34;&gt;locator.getByRole()&lt;/a&gt; - Locate by ARIA role&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyalttext/&#34;&gt;locator.getByAltText()&lt;/a&gt; - Locate by alt text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbylabel/&#34;&gt;locator.getByLabel()&lt;/a&gt; - Locate by form labels&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyplaceholder/&#34;&gt;locator.getByPlaceholder()&lt;/a&gt; - Locate by placeholder text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytestid/&#34;&gt;locator.getByTestId()&lt;/a&gt; - Locate by test ID&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytitle/&#34;&gt;locator.getByTitle()&lt;/a&gt; - Locate by title attribute&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;div data-shared="browser/getby-apis/getbytext-spec.md">
&lt;h1 id="getbytexttext-options">getByText(text[, options])&lt;/h1>
&lt;p>Returns a locator for elements containing the specified text. This method finds elements by their visible text content, making it ideal for locating user-facing content like buttons, links, headings, and other text elements.&lt;/p></description></item><item><title>getByTitle(title[, options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytitle/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytitle/</guid><content><![CDATA[

&lt;div data-shared=&#34;browser/getby-apis/getbytitle-spec.md&#34;&gt;
            &lt;h1 id=&#34;getbytitletitle-options&#34;&gt;getByTitle(title[, options])&lt;/h1&gt;
&lt;p&gt;Returns a locator for elements with the specified &lt;code&gt;title&lt;/code&gt; attribute. This method is useful for locating elements that use the &lt;code&gt;title&lt;/code&gt; attribute to provide additional information, tooltips, or accessibility context.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;string | RegExp&lt;/td&gt;
              &lt;td&gt;-&lt;/td&gt;
              &lt;td&gt;Required. The title text to search for. Can be a string for exact match or a RegExp for pattern matching.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;options.exact&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Whether to match the title text exactly with case sensitivity. When &lt;code&gt;true&lt;/code&gt;, performs a case-sensitive match.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;returns&#34;&gt;Returns&lt;/h2&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A locator object that can be used to interact with the elements matching the specified title attribute.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/div&gt;

        
&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;
&lt;p&gt;Find and interact with elements by their title attribute:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.setContent(`
      &amp;lt;button title=&amp;#34;Hello World&amp;#34;&amp;gt;Hi&amp;lt;/button&amp;gt;
      &amp;lt;select title=&amp;#34;Favorite Color&amp;#34;&amp;gt;
        &amp;lt;option value=&amp;#34;Red&amp;#34;&amp;gt;Red&amp;lt;/option&amp;gt;
        &amp;lt;option value=&amp;#34;Green&amp;#34;&amp;gt;Green&amp;lt;/option&amp;gt;
        &amp;lt;option value=&amp;#34;Blue&amp;#34;&amp;gt;Blue&amp;lt;/option&amp;gt;
      &amp;lt;/select&amp;gt;
      &amp;lt;input type=&amp;#34;checkbox&amp;#34; title=&amp;#34;Check me&amp;#34;&amp;gt;
    `);

    const locator = page.locator(&amp;#39;:root&amp;#39;);

    await locator.getByTitle(&amp;#39;Hello World&amp;#39;).click();

    await locator.getByTitle(&amp;#39;Favorite Color&amp;#39;).selectOption(&amp;#39;Red&amp;#39;);

    await locator.getByTitle(&amp;#39;Check me&amp;#39;).check();
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div data-shared=&#34;browser/getby-apis/getbytitle-tips.md&#34;&gt;
            &lt;h2 id=&#34;common-use-cases&#34;&gt;Common use cases&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User interface controls:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Toolbar buttons and action items&lt;/li&gt;
&lt;li&gt;Navigation controls (previous/next, pagination)&lt;/li&gt;
&lt;li&gt;Media player controls&lt;/li&gt;
&lt;li&gt;Menu and drop-down triggers&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Informational elements:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Help icons and tooltips&lt;/li&gt;
&lt;li&gt;Status indicators and badges&lt;/li&gt;
&lt;li&gt;Progress indicators&lt;/li&gt;
&lt;li&gt;Warning and error messages&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessibility support:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Screen reader descriptions&lt;/li&gt;
&lt;li&gt;Alternative text for complex elements&lt;/li&gt;
&lt;li&gt;Context-sensitive help&lt;/li&gt;
&lt;li&gt;Form field explanations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;best-practices&#34;&gt;Best practices&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Meaningful titles&lt;/strong&gt;: Ensure title attributes provide clear, helpful information about the element&amp;rsquo;s purpose or content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessibility compliance&lt;/strong&gt;: Use titles to enhance accessibility, especially for elements that might not have clear visual labels.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid redundancy&lt;/strong&gt;: Don&amp;rsquo;t duplicate visible text in the title attribute unless providing additional context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic content&lt;/strong&gt;: When testing applications with changing title content, use flexible matching patterns or regular expressions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tooltip testing&lt;/strong&gt;: Remember that title attributes often create tooltips on hover, which can be useful for UI testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internationalization&lt;/strong&gt;: Consider that title text may change in different language versions of your application.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

        
&lt;h2 id=&#34;related&#34;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyrole/&#34;&gt;locator.getByRole()&lt;/a&gt; - Locate by ARIA role&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyalttext/&#34;&gt;locator.getByAltText()&lt;/a&gt; - Locate by alt text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbylabel/&#34;&gt;locator.getByLabel()&lt;/a&gt; - Locate by form labels&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbyplaceholder/&#34;&gt;locator.getByPlaceholder()&lt;/a&gt; - Locate by placeholder text&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytestid/&#34;&gt;locator.getByTestId()&lt;/a&gt; - Locate by test ID&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/getbytext/&#34;&gt;locator.getByText()&lt;/a&gt; - Locate by visible text&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;div data-shared="browser/getby-apis/getbytitle-spec.md">
&lt;h1 id="getbytitletitle-options">getByTitle(title[, options])&lt;/h1>
&lt;p>Returns a locator for elements with the specified &lt;code>title&lt;/code> attribute. This method is useful for locating elements that use the &lt;code>title&lt;/code> attribute to provide additional information, tooltips, or accessibility context.&lt;/p></description></item><item><title>hover([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/hover/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/hover/</guid><content><![CDATA[&lt;h1 id=&#34;hoveroptions&#34;&gt;hover([options])&lt;/h1&gt;


&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;This feature has known issues. For details, refer to
&lt;a href=&#34;https://github.com/grafana/xk6-browser/issues/471&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#471&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;Hovers over the element.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.modifiers&lt;/td&gt;
              &lt;td&gt;string[]&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;Alt&lt;/code&gt;, &lt;code&gt;Control&lt;/code&gt;, &lt;code&gt;Meta&lt;/code&gt; or &lt;code&gt;Shift&lt;/code&gt; modifiers keys pressed during the action. If not specified, currently pressed modifiers are used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.x&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The x coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.y&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The y coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.trial&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will perform the actionability checks without performing the action.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the hover action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const offScreenElement = page.locator(&amp;#39;#off-screen&amp;#39;);
  await offScreenElement.hover();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="hoveroptions">hover([options])&lt;/h1>
&lt;div class="admonition admonition-caution">&lt;blockquote>&lt;p class="title text-uppercase">Caution&lt;/p>&lt;p>This feature has known issues. For details, refer to
&lt;a href="https://github.com/grafana/xk6-browser/issues/471" target="_blank" rel="noopener noreferrer">#471&lt;/a>.&lt;/p>&lt;/blockquote>&lt;/div>
&lt;p>Hovers over the element.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.modifiers&lt;/td>
&lt;td>string[]&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;code>Alt&lt;/code>, &lt;code>Control&lt;/code>, &lt;code>Meta&lt;/code> or &lt;code>Shift&lt;/code> modifiers keys pressed during the action. If not specified, currently pressed modifiers are used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.x&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The x coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.y&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The y coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.trial&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will perform the actionability checks without performing the action.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the hover action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const offScreenElement = page.locator(&amp;#39;#off-screen&amp;#39;);
await offScreenElement.hover();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>innerHTML([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/innerhtml/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/innerhtml/</guid><content><![CDATA[&lt;h1 id=&#34;innerhtmloptions&#34;&gt;innerHTML([options])&lt;/h1&gt;
&lt;p&gt;Returns the &lt;code&gt;element.innerHTML&lt;/code&gt;.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;string&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with the inner HTML of the element.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const offScreen = page.locator(&amp;#39;#off-screen&amp;#39;);
  console.log(await offScreen.innerHTML());
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="innerhtmloptions">innerHTML([options])&lt;/h1>
&lt;p>Returns the &lt;code>element.innerHTML&lt;/code>.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;string&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with the inner HTML of the element.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const offScreen = page.locator(&amp;#39;#off-screen&amp;#39;);
console.log(await offScreen.innerHTML());
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>innerText([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/innertext/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/innertext/</guid><content><![CDATA[&lt;h1 id=&#34;innertextoptions&#34;&gt;innerText([options])&lt;/h1&gt;
&lt;p&gt;Returns the &lt;code&gt;element.innerText&lt;/code&gt;.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;string&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with the inner text of the element.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const offScreen = page.locator(&amp;#39;#off-screen&amp;#39;);
  console.log(await offScreen.innerText()); // Off page div
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="innertextoptions">innerText([options])&lt;/h1>
&lt;p>Returns the &lt;code>element.innerText&lt;/code>.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;string&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with the inner text of the element.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const offScreen = page.locator(&amp;#39;#off-screen&amp;#39;);
console.log(await offScreen.innerText()); // Off page div
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>inputValue([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/inputvalue/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/inputvalue/</guid><content><![CDATA[&lt;h1 id=&#34;inputvalueoptions&#34;&gt;inputValue([options])&lt;/h1&gt;
&lt;p&gt;Returns &lt;code&gt;input.value&lt;/code&gt; for the selected &lt;code&gt;input&lt;/code&gt;, &lt;code&gt;textarea&lt;/code&gt; or &lt;code&gt;select&lt;/code&gt; element.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;string&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with the input value of the element.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const textInput = page.locator(&amp;#39;#text1&amp;#39;);
  await textInput.fill(&amp;#39;Hello world!&amp;#39;);
  console.log(await textInput.inputValue());
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="inputvalueoptions">inputValue([options])&lt;/h1>
&lt;p>Returns &lt;code>input.value&lt;/code> for the selected &lt;code>input&lt;/code>, &lt;code>textarea&lt;/code> or &lt;code>select&lt;/code> element.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;string&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with the input value of the element.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const textInput = page.locator(&amp;#39;#text1&amp;#39;);
await textInput.fill(&amp;#39;Hello world!&amp;#39;);
console.log(await textInput.inputValue());
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>isChecked([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/ischecked/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/ischecked/</guid><content><![CDATA[&lt;h1 id=&#34;ischeckedoptions&#34;&gt;isChecked([options])&lt;/h1&gt;
&lt;p&gt;Checks to see if the &lt;code&gt;checkbox&lt;/code&gt; &lt;code&gt;input&lt;/code&gt; type is selected or not.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;bool&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with &lt;code&gt;true&lt;/code&gt; if the element is checked, else &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const checkbox = page.locator(&amp;#39;#checkbox1&amp;#39;);
  const isChecked = await checkbox.isChecked();
  if (!isChecked) {
    await checkbox.check();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="ischeckedoptions">isChecked([options])&lt;/h1>
&lt;p>Checks to see if the &lt;code>checkbox&lt;/code> &lt;code>input&lt;/code> type is selected or not.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;bool&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with &lt;code>true&lt;/code> if the element is checked, else &lt;code>false&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const checkbox = page.locator(&amp;#39;#checkbox1&amp;#39;);
const isChecked = await checkbox.isChecked();
if (!isChecked) {
await checkbox.check();
}
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>isDisabled([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/isdisabled/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/isdisabled/</guid><content><![CDATA[&lt;h1 id=&#34;isdisabledoptions&#34;&gt;isDisabled([options])&lt;/h1&gt;
&lt;p&gt;Checks if the element is disabled.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;bool&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with &lt;code&gt;true&lt;/code&gt; if the element is disabled, else &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const text = page.locator(&amp;#39;#input-text-disabled&amp;#39;);
  const isDisabled = await text.isDisabled();
  if (isDisabled) {
    console.log(&amp;#39;element is disabled&amp;#39;);
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="isdisabledoptions">isDisabled([options])&lt;/h1>
&lt;p>Checks if the element is disabled.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;bool&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with &lt;code>true&lt;/code> if the element is disabled, else &lt;code>false&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const text = page.locator(&amp;#39;#input-text-disabled&amp;#39;);
const isDisabled = await text.isDisabled();
if (isDisabled) {
console.log(&amp;#39;element is disabled&amp;#39;);
}
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>isEditable([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/iseditable/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/iseditable/</guid><content><![CDATA[&lt;h1 id=&#34;iseditableoptions&#34;&gt;isEditable([options])&lt;/h1&gt;
&lt;p&gt;Checks if the element is editable.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;bool&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with &lt;code&gt;true&lt;/code&gt; if the element is editable, else &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const text = page.locator(&amp;#39;#text1&amp;#39;);
  const isEditable = await text.isEditable();
  if (isEditable) {
    text.fill(&amp;#39;hello world!&amp;#39;);
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="iseditableoptions">isEditable([options])&lt;/h1>
&lt;p>Checks if the element is editable.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;bool&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with &lt;code>true&lt;/code> if the element is editable, else &lt;code>false&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const text = page.locator(&amp;#39;#text1&amp;#39;);
const isEditable = await text.isEditable();
if (isEditable) {
text.fill(&amp;#39;hello world!&amp;#39;);
}
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>isEnabled([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/isenabled/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/isenabled/</guid><content><![CDATA[&lt;h1 id=&#34;isenabledoptions&#34;&gt;isEnabled([options])&lt;/h1&gt;
&lt;p&gt;Checks if the element is enabled.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;bool&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with &lt;code&gt;true&lt;/code&gt; if the element is enabled, else &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const text = page.locator(&amp;#39;#text1&amp;#39;);
  const isEnabled = await text.isEnabled();
  if (isEnabled) {
    console.log(&amp;#39;element is enabled&amp;#39;);
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="isenabledoptions">isEnabled([options])&lt;/h1>
&lt;p>Checks if the element is enabled.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;bool&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with &lt;code>true&lt;/code> if the element is enabled, else &lt;code>false&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const text = page.locator(&amp;#39;#text1&amp;#39;);
const isEnabled = await text.isEnabled();
if (isEnabled) {
console.log(&amp;#39;element is enabled&amp;#39;);
}
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>isHidden()</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/ishidden/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/ishidden/</guid><content><![CDATA[&lt;h1 id=&#34;ishidden&#34;&gt;isHidden()&lt;/h1&gt;
&lt;p&gt;Checks if the element is hidden.&lt;/p&gt;
&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;bool&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with &lt;code&gt;true&lt;/code&gt; if the element is hidden, else &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const text = page.locator(&amp;#39;#input-text-hidden&amp;#39;);
  const isHidden = await text.isHidden();
  if (isHidden) {  
    console.log(&amp;#39;element is hidden&amp;#39;);
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="ishidden">isHidden()&lt;/h1>
&lt;p>Checks if the element is hidden.&lt;/p>
&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;bool&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with &lt;code>true&lt;/code> if the element is hidden, else &lt;code>false&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const text = page.locator(&amp;#39;#input-text-hidden&amp;#39;);
const isHidden = await text.isHidden();
if (isHidden) {
console.log(&amp;#39;element is hidden&amp;#39;);
}
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>isInViewport([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/isinviewport/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/isinviewport/</guid><content><![CDATA[&lt;h1 id=&#34;isinviewportoptions&#34;&gt;isInViewport([options])&lt;/h1&gt;
&lt;p&gt;Checks whether the element intersects the browser viewport. This matches Playwright&amp;rsquo;s &lt;code&gt;toBeInViewport&lt;/code&gt; semantics.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.ratio&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The minimum ratio of the element that must be within the viewport for it to count as in viewport, from &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt;. The default of &lt;code&gt;0&lt;/code&gt; means any visible pixel counts.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;bool&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with &lt;code&gt;true&lt;/code&gt; if the element is in the viewport, else &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/&amp;#39;);
  const button = page.locator(&amp;#39;button#submit&amp;#39;);
  if (await button.isInViewport()) {
    await button.click();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="isinviewportoptions">isInViewport([options])&lt;/h1>
&lt;p>Checks whether the element intersects the browser viewport. This matches Playwright&amp;rsquo;s &lt;code>toBeInViewport&lt;/code> semantics.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.ratio&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The minimum ratio of the element that must be within the viewport for it to count as in viewport, from &lt;code>0&lt;/code> to &lt;code>1&lt;/code>. The default of &lt;code>0&lt;/code> means any visible pixel counts.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;bool&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with &lt;code>true&lt;/code> if the element is in the viewport, else &lt;code>false&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/&amp;#39;);
const button = page.locator(&amp;#39;button#submit&amp;#39;);
if (await button.isInViewport()) {
await button.click();
}
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>isVisible()</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/isvisible/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/isvisible/</guid><content><![CDATA[&lt;h1 id=&#34;isvisible&#34;&gt;isVisible()&lt;/h1&gt;
&lt;p&gt;Checks if the element is visible.&lt;/p&gt;
&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;bool&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with &lt;code&gt;true&lt;/code&gt; if the element is visible, else &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const text = page.locator(&amp;#39;#text1&amp;#39;);
  const isVisible = await text.isVisible();
  if (isVisible) {
    console.log(&amp;#39;element is visible&amp;#39;);
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="isvisible">isVisible()&lt;/h1>
&lt;p>Checks if the element is visible.&lt;/p>
&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;bool&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with &lt;code>true&lt;/code> if the element is visible, else &lt;code>false&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const text = page.locator(&amp;#39;#text1&amp;#39;);
const isVisible = await text.isVisible();
if (isVisible) {
console.log(&amp;#39;element is visible&amp;#39;);
}
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>last()</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/last/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/last/</guid><content><![CDATA[&lt;h1 id=&#34;last&#34;&gt;last()&lt;/h1&gt;
&lt;p&gt;Returns a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt; to the last matching element.&lt;/p&gt;
&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;The last element &lt;code&gt;Locator&lt;/code&gt; associated with the selector.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { expect } from &amp;#39;https://jslib.k6.io/k6-testing/0.6.1/index.js&amp;#39;;
import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://quickpizza.grafana.com&amp;#39;);

  await expect(await page.locator(&amp;#39;p&amp;#39;).last()).toContainText(&amp;#39;Contribute to QuickPizza&amp;#39;);

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="last">last()&lt;/h1>
&lt;p>Returns a
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a> to the last matching element.&lt;/p>
&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a>&lt;/td>
&lt;td>The last element &lt;code>Locator&lt;/code> associated with the selector.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { expect } from &amp;#39;https://jslib.k6.io/k6-testing/0.6.1/index.js&amp;#39;;
import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
ui: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://quickpizza.grafana.com&amp;#39;);
await expect(await page.locator(&amp;#39;p&amp;#39;).last()).toContainText(&amp;#39;Contribute to QuickPizza&amp;#39;);
await page.close();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>locator(selector[, options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/locator/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/locator/</guid><content><![CDATA[&lt;h1 id=&#34;locatorselector-options&#34;&gt;locator(selector[, options])&lt;/h1&gt;
&lt;p&gt;The method finds all elements matching the selector and creates a new 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt; that matches all of them. This method can be used to further refine the locator by chaining additional selectors.&lt;/p&gt;
&lt;p&gt;This allows you to define locators relative to a parent locator, enabling more precise element targeting by creating nested locators.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;selector&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A selector to use when resolving a DOM element.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.hasText&lt;/td&gt;
              &lt;td&gt;string or RegExp&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Matches only elements that contain the specified text. String or regular expression. Optional.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.hasNotText&lt;/td&gt;
              &lt;td&gt;string or RegExp&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Matches only elements that do not contain the specified text. String or regular expression. Optional.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;A new chained &lt;code&gt;Locator&lt;/code&gt; that can be used for further actions.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { expect } from &amp;#39;https://jslib.k6.io/k6-testing/0.6.1/index.js&amp;#39;;
import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.setContent(`
      &amp;lt;div&amp;gt;
        &amp;lt;div data-testid=&amp;#34;products&amp;#34;&amp;gt;
          &amp;lt;div data-category=&amp;#34;fruits&amp;#34;&amp;gt;
            &amp;lt;div data-product=&amp;#34;apple&amp;#34;&amp;gt;
              &amp;lt;h3&amp;gt;Apple&amp;lt;/h3&amp;gt;
              &amp;lt;button&amp;gt;Add to Cart&amp;lt;/button&amp;gt;
              &amp;lt;button&amp;gt;View Details&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div data-category=&amp;#34;fruits&amp;#34;&amp;gt;
            &amp;lt;h3&amp;gt;Orange&amp;lt;/h3&amp;gt;
            &amp;lt;button&amp;gt;Add to Cart&amp;lt;/button&amp;gt;
            &amp;lt;button&amp;gt;View Details&amp;lt;/button&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div data-category=&amp;#34;vegetables&amp;#34;&amp;gt;
            &amp;lt;h3&amp;gt;Carrot&amp;lt;/h3&amp;gt;
            &amp;lt;button&amp;gt;Add to Cart&amp;lt;/button&amp;gt;
            &amp;lt;button&amp;gt;View Details&amp;lt;/button&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    `);

    // Use locator.locator to find specific products within the list
    const appleProduct = page.locator(&amp;#39;div[data-product=&amp;#34;apple&amp;#34;]&amp;#39;);
    const addToCartButton = appleProduct.locator(&amp;#39;//button[text()=&amp;#34;Add to Cart&amp;#34;]&amp;#39;);

    // Use locator.locator with options to find specific items
    const fruitsSection = page.locator(&amp;#39;div[data-category=&amp;#34;fruits&amp;#34;]&amp;#39;);
    const orangeButton = fruitsSection.locator(&amp;#39;button&amp;#39;, { hasText: &amp;#39;Add to Cart&amp;#39; });

    // Interact with the nested locators
    await addToCartButton.click();
    await orangeButton.click();
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="locatorselector-options">locator(selector[, options])&lt;/h1>
&lt;p>The method finds all elements matching the selector and creates a new
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a> that matches all of them. This method can be used to further refine the locator by chaining additional selectors.&lt;/p></description></item><item><title>nth(number)</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/nth/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/nth/</guid><content><![CDATA[&lt;h1 id=&#34;nthnumber&#34;&gt;nth(number)&lt;/h1&gt;
&lt;p&gt;Returns a 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt; to the n-th matching element. The method is zero-based; for example, &lt;code&gt;nth(0)&lt;/code&gt; selects the first element.&lt;/p&gt;
&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/&#34;&gt;Locator&lt;/a&gt;&lt;/td&gt;
              &lt;td&gt;The n-th element &lt;code&gt;Locator&lt;/code&gt; associated with the selector.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { expect } from &amp;#39;https://jslib.k6.io/k6-testing/0.6.1/index.js&amp;#39;;
import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    ui: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://quickpizza.grafana.com&amp;#39;);

  await expect(await page.locator(&amp;#39;p&amp;#39;).nth(4)).toContainText(&amp;#39;QuickPizza Labs.&amp;#39;);

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="nthnumber">nth(number)&lt;/h1>
&lt;p>Returns a
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a> to the n-th matching element. The method is zero-based; for example, &lt;code>nth(0)&lt;/code> selects the first element.&lt;/p>
&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/">Locator&lt;/a>&lt;/td>
&lt;td>The n-th element &lt;code>Locator&lt;/code> associated with the selector.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { expect } from &amp;#39;https://jslib.k6.io/k6-testing/0.6.1/index.js&amp;#39;;
import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
ui: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://quickpizza.grafana.com&amp;#39;);
await expect(await page.locator(&amp;#39;p&amp;#39;).nth(4)).toContainText(&amp;#39;QuickPizza Labs.&amp;#39;);
await page.close();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>press(key, [options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/press/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/press/</guid><content><![CDATA[&lt;h1 id=&#34;presskey-options&#34;&gt;press(key, [options])&lt;/h1&gt;
&lt;p&gt;Press a single key on the keyboard or a combination of keys.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;key&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Name of the key to press or a character to generate, such as &lt;code&gt;ArrowLeft&lt;/code&gt; or &lt;code&gt;a&lt;/code&gt;. A superset of the key values can be found &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.delay&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Milliseconds to wait between &lt;code&gt;keydown&lt;/code&gt; and &lt;code&gt;keyup&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the key is pressed.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const text = page.locator(&amp;#39;#text1&amp;#39;);
  await text.press(&amp;#39;i&amp;#39;);
  await text.press(&amp;#39;ArrowLeft&amp;#39;);
  await text.press(&amp;#39;h&amp;#39;);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;related&#34;&gt;Related&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/presssequentially/&#34;&gt;pressSequentially()&lt;/a&gt; - Type text character by character with keyboard events&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/type/&#34;&gt;type()&lt;/a&gt; - Type text into an input field&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/&#34;&gt;fill()&lt;/a&gt; - Fill text instantly without keyboard events&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="presskey-options">press(key, [options])&lt;/h1>
&lt;p>Press a single key on the keyboard or a combination of keys.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>key&lt;/td>
&lt;td>string&lt;/td>
&lt;td>&lt;code>''&lt;/code>&lt;/td>
&lt;td>Name of the key to press or a character to generate, such as &lt;code>ArrowLeft&lt;/code> or &lt;code>a&lt;/code>. A superset of the key values can be found &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values" target="_blank" rel="noopener noreferrer">here&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.delay&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>Milliseconds to wait between &lt;code>keydown&lt;/code> and &lt;code>keyup&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the key is pressed.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const text = page.locator(&amp;#39;#text1&amp;#39;);
await text.press(&amp;#39;i&amp;#39;);
await text.press(&amp;#39;ArrowLeft&amp;#39;);
await text.press(&amp;#39;h&amp;#39;);
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;h3 id="related">Related&lt;/h3>
&lt;ul>
&lt;li>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/presssequentially/">pressSequentially()&lt;/a> - Type text character by character with keyboard events&lt;/li>
&lt;li>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/type/">type()&lt;/a> - Type text into an input field&lt;/li>
&lt;li>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/">fill()&lt;/a> - Fill text instantly without keyboard events&lt;/li>
&lt;/ul></description></item><item><title>pressSequentially(text, [options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/presssequentially/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/presssequentially/</guid><content><![CDATA[&lt;h1 id=&#34;presssequentiallytext-options&#34;&gt;pressSequentially(text, [options])&lt;/h1&gt;
&lt;p&gt;Focuses the element and then sends a &lt;code&gt;keydown&lt;/code&gt;, &lt;code&gt;keypress&lt;/code&gt;/&lt;code&gt;input&lt;/code&gt;, and &lt;code&gt;keyup&lt;/code&gt; event for each character in the text.&lt;/p&gt;
&lt;p&gt;This method is useful for simulating real user typing behavior when the page has special keyboard event handling, such as input validation, autocomplete, or character counters that trigger on individual key presses. For simple text input without special keyboard handling, use 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/&#34;&gt;fill()&lt;/a&gt; instead, as it&amp;rsquo;s faster and more reliable.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;text&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Text to type into the focused element character by character.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.delay&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Milliseconds to wait between key presses. Defaults to &lt;code&gt;0&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the text has been typed into the element.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;examples&#34;&gt;Examples&lt;/h3&gt;
&lt;h4 id=&#34;basic-usage&#34;&gt;Basic usage&lt;/h4&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);

    // Type text character by character
    const textInput = page.locator(&amp;#39;#text1&amp;#39;);
    await textInput.pressSequentially(&amp;#39;Hello World&amp;#39;);
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;typing-with-delay&#34;&gt;Typing with delay&lt;/h4&gt;
&lt;p&gt;This example demonstrates typing text with a delay between keystrokes to simulate realistic user typing speed:&lt;/p&gt;
&lt;!-- md-k6:skip --&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  try {
    await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);

    // Type text with 100ms delay between each character
    const searchInput = page.locator(&amp;#39;input[type=&amp;#34;text&amp;#34;]&amp;#39;);
    await searchInput.pressSequentially(&amp;#39;test query&amp;#39;, { delay: 100 });
  } finally {
    await page.close();
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;best-practices&#34;&gt;Best practices&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use &lt;code&gt;fill()&lt;/code&gt; for simple text input&lt;/strong&gt;: For form fields without special keyboard handling, use 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/&#34;&gt;fill()&lt;/a&gt; instead as it&amp;rsquo;s significantly faster and more reliable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use &lt;code&gt;pressSequentially()&lt;/code&gt; for interactive input&lt;/strong&gt;: Only use &lt;code&gt;pressSequentially()&lt;/code&gt; when testing features that require gradual typing, such as:
&lt;ul&gt;
&lt;li&gt;Autocomplete suggestions&lt;/li&gt;
&lt;li&gt;Input validation that triggers per character&lt;/li&gt;
&lt;li&gt;Character counters&lt;/li&gt;
&lt;li&gt;Search-as-you-type functionality&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consider performance&lt;/strong&gt;: Typing character-by-character is slower than filling text directly. Use this method only when necessary for accurate testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handling special keys&lt;/strong&gt;: For special keys like &lt;code&gt;Enter&lt;/code&gt;, &lt;code&gt;Tab&lt;/code&gt;, or &lt;code&gt;Escape&lt;/code&gt;, use 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/press/&#34;&gt;press()&lt;/a&gt; instead.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;related&#34;&gt;Related&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/&#34;&gt;fill()&lt;/a&gt; - Fill text instantly without keyboard events&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/press/&#34;&gt;press()&lt;/a&gt; - Press special keys or key combinations&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/type/&#34;&gt;type()&lt;/a&gt; - Type text into an input field&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="presssequentiallytext-options">pressSequentially(text, [options])&lt;/h1>
&lt;p>Focuses the element and then sends a &lt;code>keydown&lt;/code>, &lt;code>keypress&lt;/code>/&lt;code>input&lt;/code>, and &lt;code>keyup&lt;/code> event for each character in the text.&lt;/p>
&lt;p>This method is useful for simulating real user typing behavior when the page has special keyboard event handling, such as input validation, autocomplete, or character counters that trigger on individual key presses. For simple text input without special keyboard handling, use
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/">fill()&lt;/a> instead, as it&amp;rsquo;s faster and more reliable.&lt;/p></description></item><item><title>selectOption(values, [options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/selectoption/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/selectoption/</guid><content><![CDATA[&lt;h1 id=&#34;selectoptionvalues-options&#34;&gt;selectOption(values, [options])&lt;/h1&gt;
&lt;p&gt;Select one or more options which match the values.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;values&lt;/td&gt;
              &lt;td&gt;string or string[] or object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If the &lt;code&gt;select&lt;/code&gt; has the multiple attribute, all matching options are selected, otherwise only the first option matching one of the passed options is selected. String values are matching both values and labels. Object can be made up of keys with &lt;code&gt;value&lt;/code&gt;, &lt;code&gt;label&lt;/code&gt; or &lt;code&gt;index&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;Array&amp;lt;string&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with the selected options as an array of strings.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const options = page.locator(&amp;#39;#numbers-options&amp;#39;);
  await options.selectOption(&amp;#39;three&amp;#39;);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="selectoptionvalues-options">selectOption(values, [options])&lt;/h1>
&lt;p>Select one or more options which match the values.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>values&lt;/td>
&lt;td>string or string[] or object&lt;/td>
&lt;td>&lt;code>''&lt;/code>&lt;/td>
&lt;td>If the &lt;code>select&lt;/code> has the multiple attribute, all matching options are selected, otherwise only the first option matching one of the passed options is selected. String values are matching both values and labels. Object can be made up of keys with &lt;code>value&lt;/code>, &lt;code>label&lt;/code> or &lt;code>index&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;Array&amp;lt;string&amp;gt;&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with the selected options as an array of strings.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const options = page.locator(&amp;#39;#numbers-options&amp;#39;);
await options.selectOption(&amp;#39;three&amp;#39;);
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>setChecked(checked[, options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/setchecked/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/setchecked/</guid><content><![CDATA[&lt;h1 id=&#34;setcheckedchecked-options&#34;&gt;setChecked(checked[, options])&lt;/h1&gt;
&lt;p&gt;Use this method to select or unselect an &lt;code&gt;input&lt;/code&gt; or &lt;code&gt;radio&lt;/code&gt; checkbox.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Optional parameters.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.x&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The x coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.y&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The y coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.trial&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will perform the actionability checks without performing the action.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the check action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);

  const checkbox = await page.locator(&amp;#39;#checkbox1&amp;#39;);
  await checkbox.setChecked(true);
  await checkbox.setChecked(false);

  await page.close();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="setcheckedchecked-options">setChecked(checked[, options])&lt;/h1>
&lt;p>Use this method to select or unselect an &lt;code>input&lt;/code> or &lt;code>radio&lt;/code> checkbox.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>Optional parameters.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.x&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The x coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.y&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The y coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.trial&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will perform the actionability checks without performing the action.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the check action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const checkbox = await page.locator(&amp;#39;#checkbox1&amp;#39;);
await checkbox.setChecked(true);
await checkbox.setChecked(false);
await page.close();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>tap([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/tap/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/tap/</guid><content><![CDATA[&lt;h1 id=&#34;tapoptions&#34;&gt;tap([options])&lt;/h1&gt;


&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;This feature has &lt;strong&gt;known issues&lt;/strong&gt;. For details, refer to
&lt;a href=&#34;https://github.com/grafana/xk6-browser/issues/436&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#436&lt;/a&gt; and &lt;a href=&#34;https://github.com/grafana/xk6-browser/issues/471&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#471&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;Tap on the chosen element.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.modifiers&lt;/td&gt;
              &lt;td&gt;string[]&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;Alt&lt;/code&gt;, &lt;code&gt;Control&lt;/code&gt;, &lt;code&gt;Meta&lt;/code&gt; or &lt;code&gt;Shift&lt;/code&gt; modifiers keys pressed during the action. If not specified, currently pressed modifiers are used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.x&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The x coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.y&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The y coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.trial&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will perform the actionability checks without performing the action.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the tap action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export default async function () {
  const page = await browser.newPage({
    hasTouch: true,
  });

  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const options = page.locator(&amp;#39;#numbers-options&amp;#39;);
  await options.tap();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="tapoptions">tap([options])&lt;/h1>
&lt;div class="admonition admonition-caution">&lt;blockquote>&lt;p class="title text-uppercase">Caution&lt;/p>&lt;p>This feature has &lt;strong>known issues&lt;/strong>. For details, refer to
&lt;a href="https://github.com/grafana/xk6-browser/issues/436" target="_blank" rel="noopener noreferrer">#436&lt;/a> and &lt;a href="https://github.com/grafana/xk6-browser/issues/471" target="_blank" rel="noopener noreferrer">#471&lt;/a>.&lt;/p>&lt;/blockquote>&lt;/div>
&lt;p>Tap on the chosen element.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.modifiers&lt;/td>
&lt;td>string[]&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;code>Alt&lt;/code>, &lt;code>Control&lt;/code>, &lt;code>Meta&lt;/code> or &lt;code>Shift&lt;/code> modifiers keys pressed during the action. If not specified, currently pressed modifiers are used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.x&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The x coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.y&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The y coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.trial&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will perform the actionability checks without performing the action.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the tap action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export default async function () {
const page = await browser.newPage({
hasTouch: true,
});
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const options = page.locator(&amp;#39;#numbers-options&amp;#39;);
await options.tap();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>textContent([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/textcontent/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/textcontent/</guid><content><![CDATA[&lt;h1 id=&#34;textcontentoptions&#34;&gt;textContent([options])&lt;/h1&gt;
&lt;p&gt;Returns the &lt;code&gt;element.textContent&lt;/code&gt;.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;null | string&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills with the text content of the selector or &lt;code&gt;null&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const options = page.locator(&amp;#39;#checkbox1&amp;#39;);
  console.log(await options.textContent());
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="textcontentoptions">textContent([options])&lt;/h1>
&lt;p>Returns the &lt;code>element.textContent&lt;/code>.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;null | string&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills with the text content of the selector or &lt;code>null&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const options = page.locator(&amp;#39;#checkbox1&amp;#39;);
console.log(await options.textContent());
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>type(text, [options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/type/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/type/</guid><content><![CDATA[&lt;h1 id=&#34;typetext-options&#34;&gt;type(text, [options])&lt;/h1&gt;
&lt;p&gt;Type in the text into the input field.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;text&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A text to type into a focused element.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.delay&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Milliseconds to wait between key presses. Defaults to &lt;code&gt;0&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the type action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const text = page.locator(&amp;#39;#text1&amp;#39;);
  await text.type(&amp;#39;hello world!&amp;#39;);
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;related&#34;&gt;Related&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/presssequentially/&#34;&gt;pressSequentially()&lt;/a&gt; - Type text character by character with keyboard events&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/press/&#34;&gt;press()&lt;/a&gt; - Press special keys or key combinations&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/&#34;&gt;fill()&lt;/a&gt; - Fill text instantly without keyboard events&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="typetext-options">type(text, [options])&lt;/h1>
&lt;p>Type in the text into the input field.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>text&lt;/td>
&lt;td>string&lt;/td>
&lt;td>&lt;code>''&lt;/code>&lt;/td>
&lt;td>A text to type into a focused element.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.delay&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>Milliseconds to wait between key presses. Defaults to &lt;code>0&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the type action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const text = page.locator(&amp;#39;#text1&amp;#39;);
await text.type(&amp;#39;hello world!&amp;#39;);
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;h3 id="related">Related&lt;/h3>
&lt;ul>
&lt;li>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/presssequentially/">pressSequentially()&lt;/a> - Type text character by character with keyboard events&lt;/li>
&lt;li>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/press/">press()&lt;/a> - Press special keys or key combinations&lt;/li>
&lt;li>
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/locator/fill/">fill()&lt;/a> - Fill text instantly without keyboard events&lt;/li>
&lt;/ul></description></item><item><title>uncheck([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/uncheck/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/uncheck/</guid><content><![CDATA[&lt;h1 id=&#34;uncheckoptions&#34;&gt;uncheck([options])&lt;/h1&gt;


&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;This feature has &lt;strong&gt;known issues&lt;/strong&gt;.
For details, refer to &lt;a href=&#34;https://github.com/grafana/xk6-browser/issues/471&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#471&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;Unselect the &lt;code&gt;input&lt;/code&gt; checkbox.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.force&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will bypass the actionability checks (&lt;code&gt;visible&lt;/code&gt;, &lt;code&gt;stable&lt;/code&gt;, &lt;code&gt;enabled&lt;/code&gt;).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.noWaitAfter&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;If set to &lt;code&gt;true&lt;/code&gt; and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.x&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The x coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.position.y&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The y coordinate.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.trial&lt;/td&gt;
              &lt;td&gt;boolean&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Setting this to &lt;code&gt;true&lt;/code&gt; will perform the actionability checks without performing the action.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills when the uncheck action is finished.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();
  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const checkbox = page.locator(&amp;#39;#checkbox1&amp;#39;);
  await checkbox.check();
  await checkbox.uncheck();
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="uncheckoptions">uncheck([options])&lt;/h1>
&lt;div class="admonition admonition-caution">&lt;blockquote>&lt;p class="title text-uppercase">Caution&lt;/p>&lt;p>This feature has &lt;strong>known issues&lt;/strong>.
For details, refer to &lt;a href="https://github.com/grafana/xk6-browser/issues/471" target="_blank" rel="noopener noreferrer">#471&lt;/a>.&lt;/p>&lt;/blockquote>&lt;/div>
&lt;p>Unselect the &lt;code>input&lt;/code> checkbox.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.force&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will bypass the actionability checks (&lt;code>visible&lt;/code>, &lt;code>stable&lt;/code>, &lt;code>enabled&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.noWaitAfter&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>If set to &lt;code>true&lt;/code> and a navigation occurs from performing this action, it will not wait for it to complete.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>A point to use relative to the top left corner of the element. If not supplied, a visible point of the element is used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.x&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The x coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.position.y&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>The y coordinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.trial&lt;/td>
&lt;td>boolean&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Setting this to &lt;code>true&lt;/code> will perform the actionability checks without performing the action.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills when the uncheck action is finished.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const checkbox = page.locator(&amp;#39;#checkbox1&amp;#39;);
await checkbox.check();
await checkbox.uncheck();
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item><item><title>waitFor([options])</title><link>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/waitfor/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/javascript-api/k6-browser/locator/waitfor/</guid><content><![CDATA[&lt;h1 id=&#34;waitforoptions&#34;&gt;waitFor([options])&lt;/h1&gt;
&lt;p&gt;Wait for the element to be in a particular state e.g. &lt;code&gt;visible&lt;/code&gt;.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;options&lt;/td&gt;
              &lt;td&gt;object&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.state&lt;/td&gt;
              &lt;td&gt;string&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;visible&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Can be &lt;code&gt;attached&lt;/code&gt;, &lt;code&gt;detached&lt;/code&gt;, &lt;code&gt;visible&lt;/code&gt; or &lt;code&gt;hidden&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;options.timeout&lt;/td&gt;
              &lt;td&gt;number&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30000&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Maximum time in milliseconds. Pass &lt;code&gt;0&lt;/code&gt; to disable the timeout. Default is overridden by the &lt;code&gt;setDefaultTimeout&lt;/code&gt; option on 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/&#34;&gt;BrowserContext&lt;/a&gt; or 
    &lt;a href=&#34;/docs/k6/v2.3.x/javascript-api/k6-browser/page/&#34;&gt;Page&lt;/a&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;returns&#34;&gt;Returns&lt;/h3&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Type&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;A Promise that fulfills once the element is in the desired state.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h3 id=&#34;example&#34;&gt;Example&lt;/h3&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;JavaScript&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;import { browser } from &amp;#39;k6/browser&amp;#39;;

export const options = {
  scenarios: {
    browser: {
      executor: &amp;#39;shared-iterations&amp;#39;,
      options: {
        browser: {
          type: &amp;#39;chromium&amp;#39;,
        },
      },
    },
  },
};

export default async function () {
  const page = await browser.newPage();

  await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
  const text = page.locator(&amp;#39;#input-text-hidden&amp;#39;);
  await text.waitFor({
    state: &amp;#39;hidden&amp;#39;,
  });
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="waitforoptions">waitFor([options])&lt;/h1>
&lt;p>Wait for the element to be in a particular state e.g. &lt;code>visible&lt;/code>.&lt;/p>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>options&lt;/td>
&lt;td>object&lt;/td>
&lt;td>&lt;code>null&lt;/code>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.state&lt;/td>
&lt;td>string&lt;/td>
&lt;td>&lt;code>visible&lt;/code>&lt;/td>
&lt;td>Can be &lt;code>attached&lt;/code>, &lt;code>detached&lt;/code>, &lt;code>visible&lt;/code> or &lt;code>hidden&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>options.timeout&lt;/td>
&lt;td>number&lt;/td>
&lt;td>&lt;code>30000&lt;/code>&lt;/td>
&lt;td>Maximum time in milliseconds. Pass &lt;code>0&lt;/code> to disable the timeout. Default is overridden by the &lt;code>setDefaultTimeout&lt;/code> option on
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/browsercontext/">BrowserContext&lt;/a> or
&lt;a href="/docs/k6/v2.3.x/javascript-api/k6-browser/page/">Page&lt;/a>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="returns">Returns&lt;/h3>
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Promise&amp;lt;void&amp;gt;&lt;/code>&lt;/td>
&lt;td>A Promise that fulfills once the element is in the desired state.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;h3 id="example">Example&lt;/h3>
&lt;div class="code-snippet ">&lt;div class="lang-toolbar">
&lt;span class="lang-toolbar__item lang-toolbar__item-active">JavaScript&lt;/span>
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;div class="lang-toolbar__border">&lt;/div>
&lt;/div>&lt;div class="code-snippet ">
&lt;pre data-expanded="false">&lt;code class="language-javascript">import { browser } from &amp;#39;k6/browser&amp;#39;;
export const options = {
scenarios: {
browser: {
executor: &amp;#39;shared-iterations&amp;#39;,
options: {
browser: {
type: &amp;#39;chromium&amp;#39;,
},
},
},
},
};
export default async function () {
const page = await browser.newPage();
await page.goto(&amp;#39;https://test.k6.io/browser.php&amp;#39;);
const text = page.locator(&amp;#39;#input-text-hidden&amp;#39;);
await text.waitFor({
state: &amp;#39;hidden&amp;#39;,
});
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div></description></item></channel></rss>