mirror of
https://github.com/elastic/kibana.git
synced 2025-06-27 10:40:07 -04:00
## Summary I had to change `waitForRender` since `page.waitForFunction` tries to run a script on page and it is not working due to CSP settings on Cloud. Instead of injecting a script, we use a classical API to find elements/attributes in the DOM. Since `PUT /internal/core/_settings` is merged in 8.11.0, journeys run on Cloud with on-fly labels update is supported starting deployments 8.11.0+. I added error message for 404 code just in case someone runs it on earlier version. `many_fields_discover` journey was update since on Cloud the data view used by scenario is not selected by default. How it works: Create a deployment with QAF and re-configure it for journey run: ``` export EC_DEPLOYMENT_NAME=my-run-8.11 qaf elastic-cloud deployments create --stack-version 8.11.0-SNAPSHOT --environment staging --region gcp-us-central1 qaf elastic-cloud deployments configure-for-performance-journeys ``` Run any journey, e.g. many_fields_discover ``` TEST_CLOUD=1 TEST_ES_URL=https://username:pswd@es_url:443 TEST_KIBANA_URL=https://username:pswd@kibana-ur_url node scripts/functional_test_runner --config x-pack/performance/journeys/many_fields_discover.ts ``` You should see a log about labels being updated: ``` Updating telemetry & APM labels: {"testJobId":"local-a3272047-6724-44d1-9a61-5c79781b06a1","testBuildId":"local-d8edbace-f441-4ba9-ac83-5909be3acf2a","journeyName":"many_fields_discover","ftrConfig":"x-pack/performance/journeys/many_fields_discover.ts"} ``` And then able to find APM logs for the journey in [Ops](https://kibana-ops-e2e-perf.kb.us-central1.gcp.cloud.es.io:9243/app/apm/services?comparisonEnabled=true&environment=ENVIRONMENT_ALL&kuery=labels.testJobId%20%3A%20%22local-d79a878c-cc7a-423b-b884-c9b6b1a8d781%22&latencyAggregationType=avg&offset=1d&rangeFrom=now-24h%2Fh&rangeTo=now&serviceGroup=&transactionType=request) cluster
99 lines
3.1 KiB
TypeScript
99 lines
3.1 KiB
TypeScript
/*
|
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
* or more contributor license agreements. Licensed under the Elastic License
|
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
|
* Side Public License, v 1.
|
|
*/
|
|
|
|
import { subj } from '@kbn/test-subj-selector';
|
|
import { ToolingLog } from '@kbn/tooling-log';
|
|
import { Page } from 'playwright';
|
|
import { Retry } from '..';
|
|
|
|
interface WaitForRenderArgs {
|
|
expectedItemsCount: number;
|
|
itemLocator: string;
|
|
checkAttribute: string;
|
|
}
|
|
|
|
export class KibanaPage {
|
|
readonly page: Page;
|
|
readonly log: ToolingLog;
|
|
readonly retry: Retry;
|
|
|
|
constructor(page: Page, log: ToolingLog, retry: Retry) {
|
|
this.page = page;
|
|
this.log = log;
|
|
this.retry = retry;
|
|
}
|
|
|
|
async waitForHeader() {
|
|
return this.page.waitForSelector('.headerGlobalNav', {
|
|
state: 'attached',
|
|
});
|
|
}
|
|
|
|
async backToDashboardListing() {
|
|
await this.page.click(subj('breadcrumb dashboardListingBreadcrumb first'));
|
|
}
|
|
|
|
async waitForRender({ expectedItemsCount, itemLocator, checkAttribute }: WaitForRenderArgs) {
|
|
// we can't use `page.waitForFunction` because of CSP while testing on Cloud
|
|
await this.retry.waitFor(
|
|
`rendering of ${expectedItemsCount} elements with selector ${itemLocator} is completed`,
|
|
async () => {
|
|
const renderingItems = await this.page.$$(itemLocator);
|
|
if (renderingItems.length === expectedItemsCount) {
|
|
// all components are loaded, checking if all are rendered
|
|
const renderStatuses = await Promise.all(
|
|
renderingItems.map(async (item) => {
|
|
return (await item.getAttribute(checkAttribute)) === 'true';
|
|
})
|
|
);
|
|
const rendered = renderStatuses.filter((isRendered) => isRendered === true);
|
|
this.log.debug(
|
|
`waitForRender: ${rendered.length} out of ${expectedItemsCount} are rendered...`
|
|
);
|
|
return rendered.length === expectedItemsCount;
|
|
} else {
|
|
// not all components are loaded yet
|
|
this.log.debug(
|
|
`waitForRender: ${renderingItems.length} out of ${expectedItemsCount} are loaded...`
|
|
);
|
|
return false;
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
async waitForVisualizations(count: number) {
|
|
await this.waitForRender({
|
|
expectedItemsCount: count,
|
|
itemLocator: '[data-rendering-count]',
|
|
checkAttribute: 'data-render-complete',
|
|
});
|
|
}
|
|
|
|
async waitForCharts(count: number) {
|
|
await this.waitForRender({
|
|
expectedItemsCount: count,
|
|
itemLocator: '.echChartStatus',
|
|
checkAttribute: 'data-ech-render-complete',
|
|
});
|
|
}
|
|
|
|
async clearInput(locator: string) {
|
|
const textArea = this.page.locator(locator);
|
|
await textArea.clear();
|
|
}
|
|
|
|
async clickAndWaitFor(
|
|
locator: string,
|
|
state?: 'attached' | 'detached' | 'visible' | 'hidden' | undefined
|
|
) {
|
|
const element = this.page.locator(locator);
|
|
await element.click();
|
|
await element.waitFor({ state });
|
|
}
|
|
}
|