From 5aed3fb2a4f3fe5b6c180987603fde88efa42bde Mon Sep 17 00:00:00 2001 From: Aman Chopra Date: Thu, 5 Dec 2024 16:16:26 +0530 Subject: [PATCH 1/3] playwright lighthouse report and lambdaSetBrowser hook --- .../playwright-testing/lighthouse-report.png | Bin 0 -> 97924 bytes docs/playwright-desired-capabilities.md | 24 +-- docs/playwright-lighthouse library.md | 179 +++++++++--------- ...aywright-lighthouse-performance-metrics.md | 144 -------------- 4 files changed, 92 insertions(+), 255 deletions(-) create mode 100644 assets/images/playwright-testing/lighthouse-report.png delete mode 100644 docs/playwright-lighthouse-performance-metrics.md diff --git a/assets/images/playwright-testing/lighthouse-report.png b/assets/images/playwright-testing/lighthouse-report.png new file mode 100644 index 0000000000000000000000000000000000000000..e237014d74c2e08991584961a8ba47e00a3a6a62 GIT binary patch literal 97924 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 literal 0 HcmV?d00001 diff --git a/docs/playwright-desired-capabilities.md b/docs/playwright-desired-capabilities.md index 25820a3ac..d1b7b98fe 100644 --- a/docs/playwright-desired-capabilities.md +++ b/docs/playwright-desired-capabilities.md @@ -65,25 +65,5 @@ tests. | geoLocation | AR (Argentina) | Specify country code | `const capability = { "LT:Options": {"geoLocation": "AR",}}`| | idleTimeout | number| Specifies the timeout of the commands in seconds.

Default value: 300

Max value: 1800

If a value greater than 1800 is added, idleTimeout will be set to 1800.| `const capability = { "LT:Options": {"idleTimeout": "",}}`| | lambdaMaskCommands | array | `sendType` or `sendFill` Masks the type method of the ElementHandle and Locator class.

`sendPress` Masks the press method of the ElementHandle and Locator class.

`setHTTPCredentials` Masks the HTTP credentials parameter in the newContext and newPage method of the browser class.

`setStorageState` Masks the storage state parameter in the newContext and newPage method of the browser class

`setGeolocation` Masks the Geolocation parameter in the newContext and newPage method of the browser class.|`const capability = { "LT:Options": {'lambdaMaskCommands': ["sendType", "sendFill", "sendPress", "setHTTPCredentials", "setStorageState", "setGeolocation"]}}`

| -| useSpecificBundleVersion | Boolean | If set **`true`:** LambdaTest will select the playwright server version as per the browser version you have passed in the capabilities. Check the [supported browser version list](/support/docs/playwright-test-execution-setup/#playwright-supported-browsers).

If the value set in the `browser version` capability is supported by multiple Playwright versions, LambdaTest checks your Playwright client version and sets the Playwright version accordingly.


If set **`false` :** LambdaTest will run your playwright tests with the same version as setup in your local system and the browser version will also be used the compatible one as per the [supported browser version list](/support/docs/playwright-test-execution-setup/#playwright-supported-browsers) and not your defined one. | `const capabilities = { "LT:Options": {"useSpecificBundleVersion": true,}}` | - - -

+| useSpecificBundleVersion | Boolean | If set **`true`:** LambdaTest will select the playwright server version as per the browser version you have passed in the capabilities. Check the [supported browser version list](/support/docs/playwright-test-execution-setup/#playwright-supported-browsers).

If the value set in the `browser version` capability is supported by multiple Playwright versions, LambdaTest checks your Playwright client version and sets the Playwright version accordingly.


If set **`false` :** LambdaTest will run your playwright tests with the same version as setup in your local system and the browser version will also be used the compatible one as per the [supported browser version list](/support/docs/playwright-test-execution-setup/#playwright-supported-browsers) and not your defined one. | `const capability = { "LT:Options": {"useSpecificBundleVersion": true,}}` | +| lambdaSetBrowserPosition | | The `lambdaSetBrowserPosition` function is designed to arrange two browser windows on the screen, ensuring each occupies exactly half of the available screen space. This layout facilitates side-by-side browser comparisons or multitasking workflows.

Browsers supported : Chrome, Microsoft Edge , pw-chroium, pw-webkit & pw-firefox | `const capability = {action: 'lambdaSetBrowserPosition',}` | \ No newline at end of file diff --git a/docs/playwright-lighthouse library.md b/docs/playwright-lighthouse library.md index ebb640f53..2844f95f0 100644 --- a/docs/playwright-lighthouse library.md +++ b/docs/playwright-lighthouse library.md @@ -1,7 +1,7 @@ --- id: playwright-lighthouse-library -title: How to Generate Lighthouse Reports With Playwright Lighthouse Library -hide_title: true +title: Generate Lighthouse Reports With Playwright Lighthouse Library +hide_title: false sidebar_label: Playwright Lighthouse Library description: Learn how to generate multiple Lighthouse reports using Playwright Lighthouse Library. keywords: @@ -13,6 +13,11 @@ site_name: LambdaTest slug: playwright-lighthouse-library/ --- +import CodeBlock from '@theme/CodeBlock'; +import {YOUR_LAMBDATEST_USERNAME, YOUR_LAMBDATEST_ACCESS_KEY} from "@site/src/component/keys"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +A Lighthouse Report is a performance, accessibility, SEO, and best practices evaluation report generated using [Google Lighthouse](https://developers.google.com/web/tools/lighthouse), an open-source, automated tool developed by Google. It is commonly used to assess and optimize the quality of web pages. +LambdaTest lets you perform Playwright automation while allowing you to generate Lighthouse reports with Playwright Lighthouse Library in a single test. -# Generating Lighthouse Reports With Playwright Lighthouse Library ---- +> Lighthouse Report is supported on **Chrome**, **MicrosoftEdge** and **Chromium** browsers. -LambdaTest lets you perform Playwright automation while allowing you to generate Lighthouse reports with Playwright Lighthouse Library in a single test. +:::tip Sample repository +The code sample for generating the Lighthouse Performance Metrics in the Playwright test can be found on **LambdaTest's GitHub Repository**. You can either download or clone the repository to quickly run your tests. Image View on GitHub +::: ## Prerequisites ---- +- Ensure that you have the Playwright Lighthouse Library installed in your web project. + ```bash + npm install playwright-lighthouse + ``` + +- Export the *LIGHTHOUSE_LAMBDATEST* environment variable to your project environment. + ```bash + export LIGHTHOUSE_LAMBDATEST='true' + ``` + +## Write your Test Script +:::info +Generating lighthouse report within the test might increase the test duration. It is advisable to generate the lighthouse reports only in the required tests. +::: + +You can easily add the Lighthouse Performance Metrics of the website you want to test by using the `lighthouseReport` action via the test. Following is the code snippet for generating Lighthouse report from the Playwright if you are using JavaScript: +```js title="playwright-lighthouse-report.js" +await page.evaluate(_ => {}, `lambdatest_action: ${JSON.stringify({ + action: 'lighthouseReport', + arguments: { url: 'https://www.example.com' } +})}`) +``` -You can generate Lighthouse reports on LambdaTest platform while executing Playwright tests with the following steps. +### For Authenticated Pages +> This feature is only supported on **Windows** and **macOS** platforms. -1. Ensure that you have the Playwright Lighthouse Library installed in your web project. +The feature allows you to generate Lighthouse reports for authenticated web pages using Playwright. This is particularly useful for testing performance, accessibility, SEO, and other quality metrics for pages that require authentication. By leveraging authentication tokens, you can analyze restricted pages in your Playwright tests on both **Windows** and **macOS** environments. -```bash -npm install playwright-lighthouse + + + +```javascript +await page.evaluate(() => {}, `lambdatest_action: ${JSON.stringify({ action: 'lighthouseReport', arguments: { url: 'https://www.example.com', args: `--extra-headers ${JSON.stringify({ authtoken: "YOUR_AUTH_TOKEN" })}` } })}` ); ``` + -2. Export the *LIGHTHOUSE_LAMBDATEST* environment variable to your project environment. + -```bash -export LIGHTHOUSE_LAMBDATEST='true' +```javascript +await page.evaluate(() => {}, `lambdatest_action: ${JSON.stringify({ action: 'lighthouseReport', arguments: { url: 'https://www.example.com', args: '--extra-headers "{\\"authtoken\\": \\"YOUR_AUTH_TOKEN\\"}"' } })}`); ``` + + -## Run the Test ---- +### Sample Test Script + +This following script performs web automation testing using the Playwright and Lighthouse libraries on the LambdaTest platform. The script navigates to the DuckDuckGo search engine and searches for the term "Playwright". After that, the script runs a Lighthouse audit on the specified URL (https://duckduckgo.com) with defined performance thresholds and report formats. -This following script performs web automation testing using the Playwright and Lighthouse libraries on the LambdaTest platform.The script navigates to the DuckDuckGo search engine and searches for the term "Playwright". After that, the script runs a Lighthouse audit on the specified URL (https://duckduckgo.com) with defined performance thresholds and report formats. - -```js -import { chromium } from "playwright"; -import { playAudit } from "playwright-lighthouse"; - -(async () => { - let browser, page; - try { - const capabilities = { - browserName: "Chrome", // Browsers allowed: `Chrome`, `MicrosoftEdge` and `pw-chromium` - browserVersion: "latest", - "LT:Options": { - platform: "Windows 11", - build: "Web Performance testing", - name: "Lighthouse test", - user: process.env.LT_USERNAME, - accessKey: process.env.LT_ACCESS_KEY, - network: true, - video: true, - console: true, - }, - }; - - browser = await chromium.connect({ - wsEndpoint: `wss://cdp.lambdatest.com/playwright?capabilities=${encodeURIComponent(JSON.stringify(capabilities))}` - }); - - page = await browser.newPage(); - - await page.goto("https://duckduckgo.com"); - let element = await page.locator('[name="q"]'); - await element.click(); - await element.type("Playwright"); - await element.press("Enter"); - - try { - await playAudit({ - url: "https://duckduckgo.com", - page: page, - thresholds: { - performance: 50, - accessibility: 50, - "best-practices": 50, - seo: 50, - pwa: 10, - }, - reports: { - formats: { - json: true, - html: true, - csv: true, - }, - }, - }); - - await page.evaluate((_) => {}, - `lambdatest_action: ${JSON.stringify({ action: "setTestStatus", arguments: { status: "passed", remark: "Web performance metrics are are above the thresholds." } })}`); - } catch (e) { - await page.evaluate((_) => {}, - `lambdatest_action: ${JSON.stringify({ action: "setTestStatus", arguments: { status: "failed", remark: e.stack } })}`); - console.error(e); - } - } catch (e) { - await page.evaluate((_) => {}, - `lambdatest_action: ${JSON.stringify({ action: "setTestStatus", arguments: { status: "failed", remark: e.stack } })}`); - } finally { - await page.close(); - await browser.close(); - } -})(); +```javascript reference title="playwright-lighthouse-report.js" +https://github.com/LambdaTest/playwright-sample/blob/main/playwright-lighthouse-report.js ``` -## View Your Test Results ---- +## Trigger your Test on LambdaTest +### Set up your authentication + +Make sure you have your LambdaTest credentials with you to run test automation scripts on LambdaTest. To obtain your access credentials, [purchase a plan](https://billing.lambdatest.com/billing/plans) or access the [Automation Dashboard](https://appautomation.lambdatest.com/). Then, set LambdaTest `Username` and `Access Key` in environment variables with following commands. + + + + +
+ + {`export LT_USERNAME=${ YOUR_LAMBDATEST_USERNAME()} +export LT_ACCESS_KEY=${ YOUR_LAMBDATEST_ACCESS_KEY()}`} + +
+ +
+ + + +
+ + {`set LT_USERNAME=${ YOUR_LAMBDATEST_USERNAME()} +set LT_ACCESS_KEY=${ YOUR_LAMBDATEST_ACCESS_KEY()}`} + +
+ +
+
+ +### Run your test +Pass the below command in the terminal to run the test: +```bash +node RELATIVE_PATH_OF_YOUR_TEST_FILE +``` +### View Your Test Results To view your test runs that uses Playwright Lighthouse Library, go to the LambdaTest [Web Automation Dashboard](https://automation.lambdatest.com/). -Image +Image diff --git a/docs/playwright-lighthouse-performance-metrics.md b/docs/playwright-lighthouse-performance-metrics.md deleted file mode 100644 index 8206b4944..000000000 --- a/docs/playwright-lighthouse-performance-metrics.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -id: playwright-lighthouse-performance-metrics -title: How To View Lighthouse Performance Metrics in Playwright -hide_title: true -sidebar_label: Lighthouse Performance Metrics -description: Guide to view Lighthouse Performance metrics of a website using Playwright. View the Lighthouse audits, scores, metrics, and much more. -keywords: - - lighthouse performance - - lighthouse performance management - - google lighthouse performance - - google lighthouse performance score - - lighthouse partners performance - - lighthouse performance metrics - - lighthouse performance score - - lighthouse performance testing - - lighthouse web performance - - lighthouse website performance - - google lighthouse performance audit - - google lighthouse performance test - - google's own lighthouse for performance accessibility and seo ratings - - how is lighthouse performance score calculated - - lighthouse audit for performance - - lighthouse check performance - - LambdaTest automation - - playwright - - playwright online - - online playwright automation - - playwright automation online - - LambdaTest playwright automation - - playwright tutorial - - Playwright getting started - - lambdatest getting started -url: https://www.lambdatest.com/support/docs/playwright-lighthouse-performance-metrics/ -site_name: LambdaTest -slug: playwright-lighthouse-performance-metrics/ ---- - - - -# View Lighthouse Performance Metrics Using Playwright -* * * - -LambdaTest now integrates [**Lighthouse**](https://developers.google.com/web/tools/lighthouse) to view the performance metrics (**Lighthouse Audits**) while running Playwright tests on the LambdaTest cloud. You can now view the scores of: - -* **Performance**, -* **Accessibility**, -* **Best Practices**, -* **SEO** -* **Progressive Web App** - -metrics with the help of LambdaTest. - -:::tip Sample repository -The code sample for generating the Lighthouse Performance Metrics in the Playwright test can be found on **LambdaTest's GitHub Repository**. You can either download or clone the repository to quickly run your tests. Image View on GitHub -::: - -## Prerequisites - -* * * - -You will need a [LambdaTest account](https://accounts.lambdatest.com/login) to run your Playwright tests. Use your: - -* LambdaTest Username -* LambdaTest Access Key - -to run your tests on LambdaTest and view the **Lighthouse Performance Metrics**. You can obtain these credentials from the [LambdaTest Automation Dashboard](https://automation.lambdatest.com/build) or through [LambdaTest Profile](https://accounts.lambdatest.com/login). - -## How to Include Lighthouse Performance Metrics in Playwright Automation? - -* * * - -You can easily add the Lighthouse Performance Metrics of the website you want to test by executing the `lighthouseReport` action via the test. -As of now, LambdaTest supports **Lighthouse** on Chrome, MicrosoftEdge and Chromium browsers. -Following is the code snippet for generating Lighthouse report from the Playwright if you are using JavaScript: -```js -await page.evaluate(_ => {}, `lambdatest_action: ${JSON.stringify({ - action: 'lighthouseReport', - arguments: { url: 'https://www.example.com' } -})}`) -``` - -> **Note:** Generating lighthouse report within the test might increase the test duration. It is advisable to generate the lighthouse reports only in the required tests. - -## How to View Lighthouse Performance Metrics on LambdaTest? -*** -Once you have run your Playwright automation tests on LambdaTest platform, you can view the Lighthouse Performance Metrics on the website under test. - -Follow the below steps to view the **Lighthouse Performance Metrics** on LambdaTest platform: - -**1.** Go to the [Automation Dashboard](https://automation.lambdatest.com). Here you can see your recently executed Playwright automation tests. For this demo purpose, we have used a sample Playwright JS script, from this [GitHub repository](https://github.com/LambdaTest/playwright-sample/blob/main/playwright-lighthouse-report.js). - -**2.** Open the test where you executed the lighthouse command and click on the **Performance** tab. - -Image - -**3.** You can see the Lighthouse Performance Metrics on your screen now, for the URL requested. For example, in the below image, the lighthouse report is generated for [https://login.live.com](https://login.live.com). - -Image - -Similarly, you can click on any of the performance reports to view it in detail. Performance reports can also be downloaded in various formats. Not only this, but LambdaTest also helps you view the Passed Audits, individual metrics, detailed diagnosis, and improvement opportunities about that particular Lighthouse Audit. - -* * * - -That's it folks! That's all about the Lighthouse Performance Metrics with LambdaTest. You can read more about the Lighthouse Audits and Performance Metrics from [web.dev](https://web.dev/lighthouse-performance/) page. If you have any doubt or questions, feel free to contact our experts at  window.openLTChatWidget()}>**24/7 chat support** or mail us at [support@lambdatest.com](mailto:support@lambdatest.com). Happy testing! :) - - From 4dee7306127a09126b96b738b576683f2a37644b Mon Sep 17 00:00:00 2001 From: Aman Chopra Date: Thu, 5 Dec 2024 17:51:08 +0530 Subject: [PATCH 2/3] updated formatting --- docs/playwright-desired-capabilities.md | 2 +- docs/playwright-lighthouse library.md | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/playwright-desired-capabilities.md b/docs/playwright-desired-capabilities.md index d1b7b98fe..e1df31b9f 100644 --- a/docs/playwright-desired-capabilities.md +++ b/docs/playwright-desired-capabilities.md @@ -66,4 +66,4 @@ tests. | idleTimeout | number| Specifies the timeout of the commands in seconds.

Default value: 300

Max value: 1800

If a value greater than 1800 is added, idleTimeout will be set to 1800.| `const capability = { "LT:Options": {"idleTimeout": "",}}`| | lambdaMaskCommands | array | `sendType` or `sendFill` Masks the type method of the ElementHandle and Locator class.

`sendPress` Masks the press method of the ElementHandle and Locator class.

`setHTTPCredentials` Masks the HTTP credentials parameter in the newContext and newPage method of the browser class.

`setStorageState` Masks the storage state parameter in the newContext and newPage method of the browser class

`setGeolocation` Masks the Geolocation parameter in the newContext and newPage method of the browser class.|`const capability = { "LT:Options": {'lambdaMaskCommands': ["sendType", "sendFill", "sendPress", "setHTTPCredentials", "setStorageState", "setGeolocation"]}}`

| | useSpecificBundleVersion | Boolean | If set **`true`:** LambdaTest will select the playwright server version as per the browser version you have passed in the capabilities. Check the [supported browser version list](/support/docs/playwright-test-execution-setup/#playwright-supported-browsers).

If the value set in the `browser version` capability is supported by multiple Playwright versions, LambdaTest checks your Playwright client version and sets the Playwright version accordingly.


If set **`false` :** LambdaTest will run your playwright tests with the same version as setup in your local system and the browser version will also be used the compatible one as per the [supported browser version list](/support/docs/playwright-test-execution-setup/#playwright-supported-browsers) and not your defined one. | `const capability = { "LT:Options": {"useSpecificBundleVersion": true,}}` | -| lambdaSetBrowserPosition | | The `lambdaSetBrowserPosition` function is designed to arrange two browser windows on the screen, ensuring each occupies exactly half of the available screen space. This layout facilitates side-by-side browser comparisons or multitasking workflows.

Browsers supported : Chrome, Microsoft Edge , pw-chroium, pw-webkit & pw-firefox | `const capability = {action: 'lambdaSetBrowserPosition',}` | \ No newline at end of file +| lambdaSetBrowserPosition | | The `lambdaSetBrowserPosition` function is designed to arrange two browser windows on the screen, ensuring each occupies exactly half of the available screen space. This layout facilitates side-by-side browser comparisons or multitasking workflows.

OS Supported - Windows

Browsers supported : Chrome, Microsoft Edge , pw-chroium, pw-webkit & pw-firefox | `const capability = {action: 'lambdaSetBrowserPosition',}` | \ No newline at end of file diff --git a/docs/playwright-lighthouse library.md b/docs/playwright-lighthouse library.md index 2844f95f0..d93164518 100644 --- a/docs/playwright-lighthouse library.md +++ b/docs/playwright-lighthouse library.md @@ -84,14 +84,24 @@ The feature allows you to generate Lighthouse reports for authenticated web page ```javascript -await page.evaluate(() => {}, `lambdatest_action: ${JSON.stringify({ action: 'lighthouseReport', arguments: { url: 'https://www.example.com', args: `--extra-headers ${JSON.stringify({ authtoken: "YOUR_AUTH_TOKEN" })}` } })}` ); +await page.evaluate(() => {}, `lambdatest_action: ${JSON.stringify({ + action: 'lighthouseReport', + arguments: { url: 'https://www.example.com', + args: `--extra-headers + ${JSON.stringify({ authtoken: "YOUR_AUTH_TOKEN" })}` +} })}` ); ``` ```javascript -await page.evaluate(() => {}, `lambdatest_action: ${JSON.stringify({ action: 'lighthouseReport', arguments: { url: 'https://www.example.com', args: '--extra-headers "{\\"authtoken\\": \\"YOUR_AUTH_TOKEN\\"}"' } })}`); +await page.evaluate(() => {}, `lambdatest_action: ${JSON.stringify({ + action: 'lighthouseReport', + arguments: { url: 'https://www.example.com', + args: '--extra-headers + "{\\"authtoken\\": \\"YOUR_AUTH_TOKEN\\"}"' +} })}`); ``` From 1bb3460a79f9d4d0f8283783a5a00678e8accb0e Mon Sep 17 00:00:00 2001 From: Aman Chopra Date: Thu, 5 Dec 2024 17:16:48 +0530 Subject: [PATCH 3/3] biometric, camera injection, xctestplan --- docs/biometric-authentication.md | 8 ++++++- docs/camera-image-injection.md | 4 ++-- docs/sharding-xcui.md | 36 ++++++++++++-------------------- docs/xctestplan.md | 32 ++++++++++++---------------- 4 files changed, 35 insertions(+), 45 deletions(-) diff --git a/docs/biometric-authentication.md b/docs/biometric-authentication.md index c03838d72..72e9f2bae 100644 --- a/docs/biometric-authentication.md +++ b/docs/biometric-authentication.md @@ -74,6 +74,10 @@ Below given is the list of Biometric Authentication APIs which are supported. Pl |`canEvaluatePolicy`: The canEvaluatePolicy(_:error:) method of LAContext that checks whether a specific biometric authentication policy can be evaluated on the device.| + :::warning note + We don’t support apps using IOS Keychain APIs with Biometric access control. For more details [IOS Keychain Documentation](https://developer.apple.com/documentation/localauthentication/accessing-keychain-items-with-face-id-or-touch-id) + ::: + @@ -83,12 +87,14 @@ Below given is the list of Biometric Authentication APIs which are supported. Pl |----------------| | `BiometricPrompt` class's `authenticate` method from the **AndroidX Biometric library** is used for Biometric authentication on Android devices.

📕For details, please check [AndroidX Biometric Documentation](https://developer.android.com/jetpack/androidx/releases/biometric). | | **Android's Native** `BiometricPrompt` API is part of the Android platform and is used for Biometric authentication on Android devices.

📕 For details, please check [Android Developers Documentation](https://developer.android.com/reference/android/hardware/biometrics/BiometricPrompt).| + | `BiometricManager` API

📕 For more details [BiometricManager Documentation](https://developer.android.com/reference/android/hardware/biometrics/BiometricManager) | + | `KeyguardManager` API

📕 For more details [KeyguardManager Documentation](https://developer.android.com/reference/android/app/KeyguardManager) |
-:::warning note +:::tip The OS versions and APIs mentioned above are subject to change as per the latest OS updates and best practices recommended by Android and iOS. ::: diff --git a/docs/camera-image-injection.md b/docs/camera-image-injection.md index a1bb64012..19f3cad18 100644 --- a/docs/camera-image-injection.md +++ b/docs/camera-image-injection.md @@ -48,7 +48,6 @@ import TabItem from '@theme/TabItem'; }) }} > - Camera Image Injection feature allows you to test **image capturing, QR code scanning**, and **barcode scanning** functionalities in your app across **3000+ real devices** on the LambdaTest Real Device Cloud platform. This tool is ideal for testing features such as: @@ -84,7 +83,8 @@ Below given is the list of Camera APIs which are supported by LambdaTest Image I | Supported APIs | |----------------| | `didFinishPickingMediaWithInfo` API of `UIImagePickerController` iOS SDK class for capturing an image.

📕 For details, please check [Apple documentation](https://developer.apple.com/documentation/uikit/uiimagepickercontrollerdelegate/1619126-imagepickercontroller)| - | `AVCapturePhoto` iOS SDK class for receiving captured photos from `AVCapturePhotoOutput` API.

📕 For details, please check [Apple Documentation](https://developer.apple.com/documentation/avfoundation/avcapturephoto). | + | `AVCapturePhoto` iOS SDK class for receiving captured photos from `AVCapturePhotoOutput` API.

📕 For details, please check [Apple Documentation](https://developer.apple.com/documentation/avfoundation/avcapturephoto).| + | `AVMetadataMachineReadableCodeObject` is a subclass of `AVMetadataObject` iOS SDK class for scanning QR/Barcodes.

📕 For more details, please check [AVMetadataMachineReadableCodeObject Documentation](https://developer.apple.com/documentation/avfoundation/avmetadatamachinereadablecodeobject) | diff --git a/docs/sharding-xcui.md b/docs/sharding-xcui.md index e08f97ab5..541c25715 100644 --- a/docs/sharding-xcui.md +++ b/docs/sharding-xcui.md @@ -258,11 +258,9 @@ You can refer to this example and screenshot below: ::: ## Filters in Sharding - You can filter the Classes / Tests that you'd like to execute using filters. Here's an example of the same. - ```java filters: attributes: @@ -271,31 +269,23 @@ filters: - type: testName values: ["LambdaUiKitIOSUITests/testverifyAppLaunch"] ``` - This example will run only the 2 classes & one test as mentioned from the TestSuite. -## Additional Links +## XCTestPlan in Sharding +To implement the XCTestPlan in Sharding, add the `xctestplan` flag along with `app` and `testSuite` in the [framework](https://www.lambdatest.com/support/docs/hyperexecute-yaml-version0.2/#framework) flag as shown below: ---- +```yaml +framework: + name: "ios/xcui" + args: + "app" : "lt://APP_ID", + "testSuite": "lt://TEST_SUITE_ID", + "xctestplan" : "lt://YOUR_XC_TEST_PLAN_ID" #only when you want to use XCTestPlan +``` +> Refer the documentation to learn how to use [XCTestPlan feature](/support/docs/xctestplan/). + +## Additional Links - [Advanced Configuration for Capabilities](https://www.lambdatest.com/support/docs/desired-capabilities-in-appium/) - [How to test locally hosted apps](https://www.lambdatest.com/support/docs/testing-locally-hosted-pages/) - [How to integrate LambdaTest with CI/CD](https://www.lambdatest.com/support/docs/integrations-with-ci-cd-tools/) - - diff --git a/docs/xctestplan.md b/docs/xctestplan.md index 4f508d152..2fb0e04a7 100644 --- a/docs/xctestplan.md +++ b/docs/xctestplan.md @@ -193,16 +193,14 @@ Take note of the base64 encoded authentication which needs to be added in the -
- - -```bash +```yaml curl --location --request POST 'https://mobile-api.lambdatest.com/framework/v1/xcui/build' \ --header 'Authorization: Basic BASIC_AUTH_TOKEN' \ --header 'Content-Type: application/json' \ --data-raw '{ - "app" : "APP_ID", - "testSuite": "TEST_SUITE_ID", + "app" : "lt://APP_ID", + "testSuite": "lt://TEST_SUITE_ID", + "xctestplan" : "lt://YOUR_XC_TEST_PLAN_ID" #only when you want to use XCTestPlan "device" : ["iPhone 11-14"], "video" : true, "queueTimeout": 10800, @@ -213,23 +211,18 @@ curl --location --request POST 'https://mobile-api.lambdatest.com/framework/v1/x }' ``` - -
-
-
- - -```bash +```yaml curl --location --request POST "https://mobile-api.lambdatest.com/framework/v1/xcui/build" \ --header "Authorization: Basic BASIC_AUTH_TOKEN" \ --header "Content-Type: application/json" \ --data-raw "{ - "app" : "APP_ID", - "testSuite": "TEST_SUITE_ID", + "app" : "lt://APP_ID", + "testSuite": "lt://TEST_SUITE_ID", + "xctestplan" : "lt://YOUR_XC_TEST_PLAN_ID" #only when you want to use XCTestPlan "device" : ["iPhone 11-14"], "video" : true, "queueTimeout": 10800, @@ -239,9 +232,6 @@ curl --location --request POST "https://mobile-api.lambdatest.com/framework/v1/x "build" : "Proverbial-XCUITest" }" ``` - -
-
@@ -249,4 +239,8 @@ curl --location --request POST "https://mobile-api.lambdatest.com/framework/v1/x Once you have run your tests, you can view the test execution along with logs. You will be able to see the test cases passing or failing. You can view the same at [LambdaTest Automation](https://accounts.lambdatest.com/login). -> **NOTE:** You cannot use XCTestPlan and [Filters](/support/docs/speedup-xcui/) simultaneously \ No newline at end of file +> **NOTE:** You cannot use XCTestPlan and [Filters](/support/docs/speedup-xcui/) simultaneously + +:::tip +To learn how to use XCTestPlan with sharding in XCUI, refer to the detailed guide in [Sharding for XCUI](http://localhost:3000/support/docs/sharding-rd-hyperexec/#xctestplan-in-sharding). +::: \ No newline at end of file