Тёмный
Automation Step by Step
Automation Step by Step
Automation Step by Step
Подписаться
Simple Basic Beginners Step-by-Step tutorials ❤️

I create videos on Automation, Testing, DevOps, CI and related tools, technologies and platform

Raghav is a teacher and founder of AutomationStepByStep.com
He was an Automation Architect and has led multiple teams of Automation and DevOps Engineers. For over a decade, Raghav witnessed, worked, and delivered multiple Automation Testing Projects and worked with some awesome people in this industry

► automationstepbystep.com/

Some topics covered:
- Jenkins
- JMeter
- Selenium
- Appium
- Cypress
- Playwright
- Katalon Studio
- API Testing
- Postman
- Docker
- Kubernetes
- Other DevOps topics

Words from Raghav
We often need someone to hold our hand and help us take the first few steps before we learn to walk and run. I am on a mission to spread education and make it available to anyone willing to learn

Never Stop Learning
Raghav

All education here is FREE FOR ALL, FOREVER

Share with as many people as you can in your lifetime
Gatling Step by Step Masterclass | Part 5
1:21:19
6 месяцев назад
Gatling Step by Step Masterclass | Part 4
1:07:32
6 месяцев назад
Gatling Step by Step Masterclass | Part 3
43:13
6 месяцев назад
Gatling Step by Step Masterclass | Part 2
56:14
6 месяцев назад
Gatling Step by Step Masterclass | Part 1
1:10:49
7 месяцев назад
What are environment variables How do they work
30:14
7 месяцев назад
#AskRaghav | Selenium Roadmap for Beginners
5:34
9 месяцев назад
TestCafe | 4 | VS Code Extensions
18:37
10 месяцев назад
#AskRaghav | 4 Scenario based interview Ques
13:09
10 месяцев назад
Комментарии
@SurajKumar-qm4gj
@SurajKumar-qm4gj 21 минуту назад
Thanks for the nice and simple explanation ❤❤
@SarahDavis-x1x
@SarahDavis-x1x 3 часа назад
94812 Brakus Tunnel
@J-a-c-k-k-k
@J-a-c-k-k-k 6 часов назад
hell yeah 🤘🤘
@deepthivelchuri
@deepthivelchuri 7 часов назад
I am getting this error after run as testng at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)
@divyavenumbaka9529
@divyavenumbaka9529 8 часов назад
hi sir am getting an error message while running the feature file...Can u please help me regarding this..... =============== ROOT CAUSE ===================== Caused by: java.lang.SecurityException: class "module-info"'s signer information does not match signer information of other classes in the same package
@pranaytammireddy
@pranaytammireddy 10 часов назад
Git clone not explained
@RaghavPal
@RaghavPal 8 часов назад
Pranay This can help ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-YoGli76EPkU.html
@pranaytammireddy
@pranaytammireddy 8 часов назад
@@RaghavPal any video on git gui completely like cloning creating branch committing changes to remote from local all gui?
@RaghavPal
@RaghavPal 7 часов назад
not completely
@pranaytammireddy
@pranaytammireddy 7 часов назад
@@RaghavPal anything with the gui?
@RaghavPal
@RaghavPal 7 часов назад
Can check here - automationstepbystep.com/
@seemapathak6456
@seemapathak6456 14 часов назад
great work Raghav ,I have learned a lot from your channel. I have a request please make a tutorial for Visual Regression Testing. thank you in advance.
@RaghavPal
@RaghavPal 8 часов назад
Great to know this helped Seema.. Sure i will check on this
@LongHoàng-m6l
@LongHoàng-m6l 14 часов назад
how to connect database ?
@RaghavPal
@RaghavPal 8 часов назад
Long Playwright is primarily designed for end-to-end testing and browser automation. It excels at interacting with web pages and simulating user actions. However, it doesn't have built-in capabilities to directly connect to databases. The Bridge: Your Server-Side Code To work with a database in your Playwright tests, you'll need a bridge between your frontend (the browser controlled by Playwright) and your backend (where your database lives). This bridge is typically your server-side code (e.g., using Node.js, Python, etc.) and a REST API or similar communication mechanism. Typical Flow: Playwright Action: Your Playwright test performs actions in the browser (e.g., filling out a form, clicking a button) API Request: These actions trigger API requests from your frontend to your backend server Server-Side Logic: Your server-side code receives these requests, processes them, and interacts with your database (using a database library appropriate for your chosen server-side language and database type) API Response: Your server sends a response back to the frontend (your Playwright-controlled browser) Playwright Assertions: Your Playwright test then checks the browser's state or the API response to verify that the database interaction produced the expected results. Example (Conceptual): JavaScript // In your Playwright test: await page.fill('#username', 'testuser'); await page.fill('#password', 'testpassword'); await page.click('#login-button'); // Your server-side code (example using Node.js and Express): app.post('/login', async (req, res) => { const { username, password } = req.body; // ... database query to check credentials ... if (/* credentials are valid */) { res.json({ success: true }); } else { res.status(401).json({ error: 'Invalid credentials' }); } }); // Back in your Playwright test: await page.waitForResponse('/login'); // ... assert that the login was successful ... Use code with caution. Key Points: Separation of Concerns: Keep your Playwright tests focused on browser interactions and your server-side code responsible for database operations. API Design: Design a clear and well-structured API to facilitate communication between your frontend and backend. Database Library: Choose a suitable database library for your server-side language and database (e.g., mysql, mongoose for MongoDB, etc.). Remember, Playwright is a powerful tool for browser automation, but database interactions are typically handled on the server-side -
@soloposmenu
@soloposmenu 17 часов назад
Hello @RaghavPal, I am an old developer and I missed the tablets and phones as devices to be used in a REST API environment, basically stuck on Windows. i would like to migrate my windows clients to Android using REST API, but still keeping my database as I have now (basically a Ms-access db). I know is to the subject of the video you created, but I though you may point me in the correct direction. Thank you beforehand If you can read this
@RaghavPal
@RaghavPal 8 часов назад
Alright, let's try to craft a basic roadmap to help you migrate your Windows clients to Android using REST APIs while keeping your existing MS Access database Core Idea: You'll essentially be building a bridge between your Android app and your MS Access database. The Android app will send requests (like "get this data" or "update that record") to your REST API, and the API will handle talking to your database and sending the appropriate responses back to the app. Basic Steps: Set up a REST API Server: You'll need a server-side environment to host your API. Consider options like: Node.js with Express.js (popular and relatively easy to learn) Python with Flask or Django .NET Core Web API (if you're comfortable with C#) Even PHP can work if you're familiar with it This server will receive requests from your Android app, process them, interact with your MS Access database, and send back the results. Connect your API to the MS Access Database: You'll need a way for your server-side code to talk to your MS Access database. Libraries like node-adodb (for Node.js) or pyodbc (for Python) can help establish this connection Design your API Endpoints: Think about the types of operations your Android app will need to perform (e.g., fetching customer data, adding new orders, updating inventory). Create API endpoints (URLs) for each of these operations. For example: GET /customers to fetch a list of customers POST /orders to add a new order PUT /inventory/{id} to update inventory for a specific item Build your Android App: Use Android Studio and either Java or Kotlin to develop your app. Utilize libraries like Retrofit or Volley to make HTTP requests to your REST API. Handle the responses from the API and display the data in your app's user interface Example (Using Node.js with Express.js and node-adodb): JavaScript const express = require('express'); const ADODB = require('node-adodb'); const app = express(); const connection = ADODB.open('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=your_database.accdb;'); app.get('/customers', async (req, res) => { try { const result = await connection.query('SELECT * FROM Customers'); res.json(result); } catch (error) { res.status(500).json({ error: error.message }); } }); // ... other endpoints app.listen(3000, () => console.log('Server listening on port 3000')); Use code with caution. Important Considerations: Security: Make sure to implement proper security measures to protect your API and database from unauthorized access. Error Handling: Include robust error handling in both your API and Android app to gracefully handle any issues that might arise Testing: Thoroughly test your API and Android app to ensure everything works as expected Remember: This is a simplified overview. The actual implementation will involve more details and complexities. Break down the process into smaller, manageable tasks. Don't hesitate to seek help from online resources or communities. Let me know if you have any specific questions or would like more elaboration on any of the steps -
@skandakumar4196
@skandakumar4196 19 часов назад
It was really a wonderful session Raghav
@RaghavPal
@RaghavPal 8 часов назад
Great to know Skanda .. keep learning
@supriya7123
@supriya7123 20 часов назад
I am facing issue of module not found while installing package.json file basically its not showing npm in system
@RaghavPal
@RaghavPal 8 часов назад
Supriya Sounds like npm (the tool that installs stuff for Cypress) might not be on your computer or is acting up Install Node.js: This usually comes with npm. Grab it from the official Node.js website Go to your project folder: In your terminal, use cd to get to where your package.json file is Install stuff: Run npm install to get all the things Cypress needs Still getting "module not found" errors? Check for typos: Make sure the package names in your package.json are correct Clear the cache & retry: Run npm cache clean --force then try npm install again. Google it: If a specific package is causing trouble, search online for solutions Extra tips Proxy/Firewall? You might need to tell npm how to get through. Try Yarn: It's another tool like npm, sometimes it's faster or more reliable -
@jahnavijammi8464
@jahnavijammi8464 21 час назад
Thanks for your detailed videos, they are very useful for beginners. Can you suggest a way to ignore ssl cerificate errors, this pop up is not even recognized by the PlayWright Object locator to cancel them. Appreciate your help!
@RaghavPal
@RaghavPal 8 часов назад
Jahnavi Sometimes those SSL certificate pop-ups get in the way, and Playwright's locators can't even see them. Here are a couple of ways to tell Playwright to just ignore them: 1. Tell Playwright to Ignore Them from the Start When you're setting up your browser, just add this little bit: JavaScript const context = await browser.newContext({ ignoreHTTPSErrors: true }); Use code with caution. This basically says, "Hey Playwright, don't worry about those SSL errors, just keep going!" 2. Handle Each Request Individually If you want more control, you can tell Playwright to ignore SSL errors on a case-by-case basis: JavaScript page.on('request', (request) => { request.continue({ overrides: { certificateErrors: 'ignore' } }); }); This way, you can decide which requests to let through even if they have SSL issues. Tip: If you're dealing with self-signed certificates or something similar, you might need to create your own custom CA certificate and add it to your browser's trusted list. But that's a bit more advanced - these two methods should work for most cases Let me know if it worked -
@LeexanderMorales
@LeexanderMorales 23 часа назад
my setup tools didn't show up
@RaghavPal
@RaghavPal 8 часов назад
Leexander will need more details. Give me the exact timestamp from the video where this is mentioned and details about your issue
@dikshantbhatia9930
@dikshantbhatia9930 23 часа назад
Hello sir Want to connect with you. Please share anyway to connect with you. Messenger, Instagram, what’s app, telegram anything
@paulovitordasilvasantos6479
@paulovitordasilvasantos6479 День назад
Hello 1st of all thanks for your videos Im had the warning after installed appium in my PC npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. npm warn deprecated glob@6.0.4: Glob versions prior to v9 are no longer supported npm warn deprecated rimraf@2.4.5: Rimraf versions prior to v4 are no longer supported is this critical?
@RaghavPal
@RaghavPal 8 часов назад
Paulo Those warnings you're seeing after installing Appium aren't a big deal. They just mean some of the parts Appium uses are a bit old and might get replaced later. Should you worry? Not right now: Appium should still work fine Maybe in the future: If Appium gets a big update, you might need to reinstall it later What to do: Ignore it for now: If everything's working, don't sweat it Stay updated: Keep an eye out for Appium updates, just in case. Basically, those warnings are like a heads-up, not a red alert. You're good to go with Appium for now -
@jarvisfriday7452
@jarvisfriday7452 День назад
Hi Raghav am unable to see the execution in GUI, i think it is running headless. Can you please tell me how can i execute in headed?
@RaghavPal
@RaghavPal 8 часов назад
Jarvis Just add this when you launch your browser: const browser = await chromium.launch({ headless: false }); Use code with caution. This tells Playwright to open a visible browser window. Easy peasy Remember: Playwright usually runs without showing the browser (it's faster that way) So, only use *headless: false* when you actually need to see what's going on Also, you can swap out chromium for firefox or webkit if you prefer a different browser -
@jarvisfriday7452
@jarvisfriday7452 6 часов назад
@@RaghavPal Thanks for the quick response:) am facing this below issue after adding the above code. SyntaxError: await is only valid in async functions and the top level bodies of modules Error: No tests found. Make sure that arguments are regular expressions matching test files. You may need to escape symbols like "$" or "*" and quote the arguments. can you please help here?
@knightysoul6818
@knightysoul6818 День назад
Thank you sir❤
@RaghavPal
@RaghavPal 8 часов назад
Most welcome
@andrewgraham6994
@andrewgraham6994 День назад
ok so I attempted to use instagram apk, and it fails to complete install, can you please explain why some apk work, and some do not? thanks in advance, and great videos my guy!
@RaghavPal
@RaghavPal 8 часов назад
Andrew There are a number of reasons why an APK file might not work on an Android device. Here are a few possibilities: The APK file is corrupt or damaged The APK file is not compatible with the device's operating system version The APK file is missing required permissions The device does not have enough storage space to install the APK file There is a conflict with another application on the device If you are having trouble installing an APK file, you can try troubleshooting the issue by checking for these common problems You can also search online for more specific information about the APK file you are trying to install -
@meghahanda1205
@meghahanda1205 День назад
Hey Raghav! Like you see a detailed report at 21:26, I don't see that. I have just been getting the final passed or failed update in the terminal. What needs to be done? I am new to learning a code-based automation tool
@RaghavPal
@RaghavPal 8 часов назад
Megha it's likely because you're missing an assertion. An assertion is a statement that verifies that something is true about your application. To fix the issue and see a detailed report try adding an assertion to your test -
@tarunKumar-xg6jc
@tarunKumar-xg6jc День назад
Great Video Raghav, what's the difference between Match and Assert assertions ?
@RaghavPal
@RaghavPal 8 часов назад
Tarun Match: Think of it as comparing two pictures. You want to see if they are generally the same, even if some minor details might be off. Great for checking if your API response looks like what you expected, even if the order of things is different or some values are slightly different. It's more forgiving - if something doesn't match perfectly, your test will still keep going and tell you about it later. Assert: This is like a strict yes-or-no question. You're checking if something is absolutely true. Perfect for simple things like making sure the status code is 200, or a specific value in your response is exactly what you expect. It's a bit more rigid - if the assertion fails, your test stops right there. So, when to use each? Use match when you're dealing with big, messy JSON responses and just want to make sure the important parts are there. Use assert when you need to be super sure about something specific in your response and want your test to fail if it's not right. Example: Code snippet # Match: Like checking if two pictures are generally the same * def expectedResponse = { id: 1, name: 'John' } * match response == expectedResponse # Is the response kinda like what I expected? # Assert: Like a strict yes-or-no question * status 200 # Is the status code exactly 200? * assert response.id == 1 # Is the ID in the response exactly 1? Use code with caution. Remember, there are other Karate tools like def and and that you can use to mix and match these assertions to fit your exact needs -
@tarunKumar-xg6jc
@tarunKumar-xg6jc 8 часов назад
@@RaghavPal got it Raghav. Thanks for faster response.
@RelaxingMusic-fj6ug
@RelaxingMusic-fj6ug День назад
Great sessions brother😀
@RaghavPal
@RaghavPal День назад
Thanks for the visit
@davidr-30
@davidr-30 День назад
It looks like appium desktop client is no longer used on the latest versions of appium. GitHub link says it has been deprecated.
@MayaSaqi
@MayaSaqi День назад
Sir my requirement is to analyze and purchase the pipelines for our QA automation process. I need to configure atleast 5 pipelines in azuredevops. I need to tell the estimations to the ceo. I checked the azure devops pricing page but i cant understand it. What is self hosting what is agent. Per build cost is charged? Can you pls explain in detail.
@RaghavPal
@RaghavPal День назад
Maya Self-Hosting: Run pipelines on your own infrastructure, giving you more control but requiring more resources and maintenance Agent: Software that runs on a machine, executing pipeline tasks. Can be Microsoft-hosted (free for public projects, paid for private) or self-hosted (pay for resources used) Per-build cost: Charged per minute, depending on agent type and pipeline duration To configure 5 pipelines in Azure DevOps: Create pipelines Define tasks and steps Configure agent settings Set up pipeline triggers For estimation purposes, consider pipeline complexity, agent type, and pipeline frequency. Rough estimates for 5 pipelines: Microsoft-hosted agents: $40/month Self-hosted agents: $10-20/month -
@MayaSaqi
@MayaSaqi День назад
@@RaghavPal Thanks for the explanation. So i think 1 parallel job which is default provided in Microsoft hosted CI/CD pipelines is enough
@RaghavPal
@RaghavPal 8 часов назад
should me.. consult with your team before making any decisions
@bragagnollo
@bragagnollo День назад
Blazemeter dont permit save in jmx anymore 🥲
@soundoffgur
@soundoffgur День назад
Thankyou for such a wonderful explanation
@RaghavPal
@RaghavPal День назад
Most welcome
@shubhs339
@shubhs339 День назад
Please tell how to check json response is normal or dynamic.
@RaghavPal
@RaghavPal День назад
Shubh To check if the JSON response is static or dynamic, you can use the following methods: Static JSON Response A static JSON response is one that remains the same for every request. To check if the response is static: Send the same request multiple times. Compare the responses to see if they are identical. If the responses are identical, it's likely a static response. Dynamic JSON Response A dynamic JSON response is one that changes based on certain conditions, such as input parameters or user data. To check if the response is dynamic: Send the same request with different input parameters (e.g., different query parameters or request bodies). Compare the responses to see if they are different. If the responses are different, it's likely a dynamic response. Example: Let's say you're testing a API endpoint that returns a list of users. You send a GET request to example.com/users and receive the following JSON response: [ { "id": 1, "name": "John Doe" }, { "id": 2, "name": "Jane Doe" } ] To check if the response is static or dynamic, you can try the following: Send the same request multiple times and compare the responses. If they are identical, it's likely a static response. Send the request with different query parameters, such as example.com/users?sort=name. If the response changes, it's likely a dynamic response.
@CodeInterviewGuru
@CodeInterviewGuru 2 дня назад
I have a project which have lot of multi windows means more inner pages, through cypress is it possible to switch from one window to another window easily? Project is having like half .net pages and half of the newly updated react pages. Is cypress good to do automation testing of this project? If not, can you please suggest me, which ia better to learn?
@RaghavPal
@RaghavPal День назад
Check this can help - reflect.run/articles/accessing-a-new-window-in-cypress-tests/
@Mithunkumar-oz2li
@Mithunkumar-oz2li 2 дня назад
@raghavpal i am getting error to run the Testrunner.java file. java.lang.VerifyError: Could not link verifier at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:89) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:514) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:758) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:453) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:211)
@SyedAnjumNaseer
@SyedAnjumNaseer 2 дня назад
Hi Raghav, Thanks for showing step by step configuration and setup. I am facing issue installing importing centos with vagrant. I am using macOS m2 pro and i always stuck on following steps. It doesn't go further. "==> ansible-controller: Matching MAC address for NAT networking... ==> ansible-controller: Checking if box 'bento/centos-7.2' version '2.3.1' is up to date..." and sometimes it stuck right at start like this: Bringing machine 'ansible-controller' up with 'virtualbox' provider... ==> ansible-controller: Importing base box 'centos/7'... Progress: 90% any idea what could be wrong? Thanks in advance.
@RaghavPal
@RaghavPal День назад
Syed Based on the error messages you provided, here are a few potential causes: Network connectivity issues: The first error message suggests that Vagrant is having trouble matching the MAC address for NAT networking. This could be due to issues with your network connection or firewall settings Box versioning issues: The second error message indicates that Vagrant is checking if the box 'bento/centos-7.2' version '2.3.1' is up to date. This could be a problem with the box version or the Vagrant configuration VirtualBox issues: The third error message suggests that Vagrant is having trouble importing the base box 'centos/7' with VirtualBox. This could be due to issues with VirtualBox installation or configuration Practical Solutions: Here are some practical solutions you can try to resolve the issue: 1. Check Network Connectivity: Ensure that your network connection is stable and working properly. Check your firewall settings to ensure that they are not blocking Vagrant's network requests 2. Update Vagrant and VirtualBox: Make sure you are running the latest version of Vagrant and VirtualBox. Update Vagrant by running vagrant update in your terminal. Update VirtualBox by downloading and installing the latest version from the official website 3. Check Box Versioning: Ensure that you are using the correct version of the CentOS box. Try updating the box version by running vagrant box update in your terminal. If you are using a specific version of the box, try updating to the latest version 4. Re-import the Base Box: Try re-importing the base box by running vagrant box repackage centos/7 in your terminal. If this doesn't work, try deleting the box and re-importing it by running vagrant box remove centos/7 and then vagrant box add centos/7 5. Check VirtualBox Configuration: Ensure that VirtualBox is properly installed and configured on your system. Check the VirtualBox settings to ensure that they are not causing any issues with Vagrant. Additional Troubleshooting Steps: Try running Vagrant with the --debug flag to get more detailed output: vagrant up --debug Check the Vagrant log files for any error messages: vagrant log -
@RahulSingh-ic5vy
@RahulSingh-ic5vy 2 дня назад
Hi Raghav can you help me with how to run multiple test classes in one single session of appium i.e in one single session of appium server multiple test scripts would run i.e the app launches once and multiple test scripts will run under a single session. I am sharing with you mobile base class and mobile setup class Please guide how to proceed Mobile Base class: public class MobileBaseClass { public static AppiumDriver driver; public static FlutterFinder find; public static ChromeDriver wdriver; public static FirefoxDriver fdriver; public static EdgeDriver edriver; protected static AppiumDriverLocalService service; public static AppiumServiceBuilder builder; @BeforeSuite @Parameters({ "portNumber", "executionOn" }) public void beforeClassSetup(String portNumber, String executionOn) throws IOException, Exception { // Runtime.getRuntime().exec("taskkill /F /IM node.exe"); if (executionOn.equals("mobile")) { startService(portNumber); } else { System.out.println("Web Execution Started"); } } @BeforeClass @Parameters({ "executionOn", "deviceName", "platformName", "platformVersion", "portNumber", "browser" }) public void setUp(String executionOn, String deviceName, String platformName, String platformVersion, String portNumber, String browser) throws Exception { logger = LogManager.getLogger(BaseClass.class); if ((executionOn.equals("mobile")) && (platformName.equals("Flutter"))) { MobileSetup mobileS = new MobileSetup();// to be changed mobileS.mobileAndroidSetup(deviceName, platformVersion); FlutterFinder find = new FlutterFinder(driver); mobileS.appPopupClicks(); // mobileS.mpinSet(); } else { System.out.println("Execution on is not valid. Expected Values are web or mobile"); } } @AfterClass public void tearDown() { if (driver != null) { driver.quit(); } /* * if (wdriver != null) { wdriver.quit(); * * } */ } @AfterSuite @Parameters({ "portNumber", "executionOn" }) public void AfterClassTearDown(String portNumber, String executionOn) throws IOException { if (executionOn.equals("mobile")) { String packageName = "com.offlineplay"; String command = "adb uninstall " + packageName; // Execute the command Process process = Runtime.getRuntime().exec(command); service.stop(); } // Appium Server stop // Device close } void startService(String portNumber) throws Exception { AppiumServiceBuilder builder = new AppiumServiceBuilder(); // Tell builder where node is installed. Or set this path in an environment // variable named NODE_PATH builder.usingDriverExecutable(new File(AppiumNodePath)); // Tell builder where Appium is installed. Or set this path in an environment // variable named APPIUM_PATH builder.withAppiumJS(new File(AppiumPath)); builder.withIPAddress("127.0.0.1"); builder.usingPort(Integer.parseInt(portNumber)); HashMap<String, String> environment = new HashMap<String, String>(); environment.put("PATH", "/usr/local/bin:" + System.getenv("PATH")); builder.withEnvironment(environment); builder.withArgument(() -> "--base-path", "/wd/"); builder.withArgument(GeneralServerFlag.SESSION_OVERRIDE); builder.withLogFile(new File(System.getProperty("user.dir") + "/target/resources/appium_server_logs" + portNumber + Thread.currentThread().getId())); System.out.println("SFDSDFSDG" + builder.toString()); service = AppiumDriverLocalService.buildService(builder); System.out.println("hi " + builder); service.start(); Thread.sleep(20000); System.out.println("After Service Start URL: " + service.getUrl()); } public static String getExceptionAfterMethodRun(ITestResult result) { String exceptionAsString = null; try { StringWriter sw = new StringWriter(); result.getThrowable().printStackTrace(new PrintWriter(sw)); exceptionAsString = sw.toString(); exceptionAsString = StringUtils.substringBefore(exceptionAsString, "at com."); } catch (Exception e) { System.out.println("Exception encountered while gettinh exception after Test Run"); } return exceptionAsString; } } Mobile setup class: public class MobileSetup extends MobileBaseClass { //AppiumFlutterDriver driver1; public void mobileAndroidSetup(String deviceName, String platformVersion) { System.out.println("Android Mobile Setup"); try { // mvn clean test -Dtestngfile=TestNG.xml // runAppiumService(portNumber); UiAutomator2Options options = new UiAutomator2Options(); // DesiredCapabilities dc = new DesiredCapabilities(); options.setCapability(MobileCapabilityType.DEVICE_NAME, deviceName);// deviceName options.setCapability(MobileCapabilityType.UDID, deviceName); options.setCapability("autoGrantPermissions", true); // dc.setCapability(MobileCapabilityType.PLATFORM_VERSION,platformVersion); options.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android"); options.setCapability(MobileCapabilityType.APP, System.getProperty("user.dir") + "/src/test/resources/apps/" + AppName); // options.setCapability("automationName","UiAutomator2"); options.setCapability("automationName", "Flutter"); options.setCapability("unicodeKeyboard", false); options.setCapability("flutter:enableFlutterDriver", true); options.setCapability("resetKeyboard", false); options.setCapability("printPageSourceOnFindFailure", true); options.setCapability("noReset", false); options.setCapability("appium:plugins", "{\"appium-gestures-plugin\": {\"enabled\": true}}"); //options.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2); // dc.setCapability("forwardingPort ","45761"); // dc.setCapability("autoWebview", true); // dc.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome"); // dc.setCapability("appWaitForLaunch", false); //options.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 300); options.setCapability("newCommandTimeout", 600); options.setChromedriverExecutable( "C:\\Users\\Mobile.Automation\\.appium\ ode_modules\\appium-flutter-driver\ ode_modules\\appium-chromedriver\\chromedriver\\win\\chromedriver.exe" ); driver = new AndroidDriver(service.getUrl(), options); // driver1 = new AppiumFlutterDriver(service.getUrl(), options); FlutterFinder find = new FlutterFinder(driver); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10)); // appPopupClicks(); // mpinSet(); } catch (Exception exp) { // TODO: handle exception System.out.println("Cause is :" + exp.getCause()); System.out.println("Message is :" + exp.getMessage()); exp.printStackTrace(); } } public void flutterfinderinitialize() throws InterruptedException { FlutterFinder find = new FlutterFinder(driver); Thread.sleep(10000); } public void appPopupClicks() throws InterruptedException { FlutterFinder find = new FlutterFinder(driver); Thread.sleep(20000); FlutterElement ElevatedButton = find.byValueKey("Continue"); ElevatedButton.click(); Thread.sleep(10000); } }
@fajardosalvador
@fajardosalvador 2 дня назад
Thank you
@RaghavPal
@RaghavPal День назад
You're welcome
@illustrationonstars543
@illustrationonstars543 2 дня назад
i want to do masters, for QA testing what masters should do?
@RaghavPal
@RaghavPal 2 дня назад
It will depend on what Master's degree you choose: Master of Science in Software Engineering (MSSE): This degree focuses on the design, development, testing, and maintenance of software systems. You'll learn about software testing methodologies, tools, and techniques Master of Science in Information Technology (MSIT): This degree covers a broad range of IT topics, including software testing, quality assurance, and IT project management Master of Science in Computer Science (MSCS): While not exclusively focused on QA testing, an MSCS degree can provide a strong foundation in computer science principles, including software testing and verification Master of Science in Quality Management (MSQM): This degree is more focused on quality management principles, including quality assurance, control, and improvement in various industries, including software development --
@ashishprabhakar4848
@ashishprabhakar4848 2 дня назад
You Saved me Raghav thank you so much buddy for this useful video.
@RaghavPal
@RaghavPal 2 дня назад
Always welcome Ashish
@IshwarMusical
@IshwarMusical 2 дня назад
Thanks Raghav ji🙏
@RaghavPal
@RaghavPal 2 дня назад
Most welcome Ishwar
@hashcodehub6717
@hashcodehub6717 2 дня назад
loved all the viudeos man
@RaghavPal
@RaghavPal 2 дня назад
Glad to know it helped.. keep learning
@hashcodehub6717
@hashcodehub6717 2 дня назад
amazing content raghav there is no one like you who can explains in such a calm and easy manner
@RaghavPal
@RaghavPal 2 дня назад
Thanks for the kind words
@AmitNiranjanChoudhary
@AmitNiranjanChoudhary 3 дня назад
Can we save result while recording the flow... For eg in jmeter we can save recording.xml under result tree
@RaghavPal
@RaghavPal 2 дня назад
Amit In Gatling, unlike JMeter, there isn't a direct way to save the recording as an XML file while recording the flow. However, there are alternative approaches to achieve similar results. Gatling's Recording Mode When you record a scenario in Gatling, it generates a Scala script that represents the recorded actions. This script is not saved automatically, but you can manually save it as a Scala file. Saving the Recorded Scenario To save the recorded scenario, you can follow these steps: Start the Gatling Recorder. Perform the actions you want to record. Stop the recorder. In the Gatling Recorder UI, click on the "Save" button. Choose a location and filename to save the Scala script. The saved Scala script will contain the recorded actions, which can be used as a starting point for your performance test. Comparison with JMeter's Recording In JMeter, the recording is saved as an XML file under the "Result Tree" as you mentioned. This XML file contains the recorded actions and can be used to create a test plan. While Gatling doesn't provide a similar XML-based recording, the saved Scala script serves a similar purpose. It allows you to modify and refine the recorded actions to create a more comprehensive performance test -
@pnarsar4705
@pnarsar4705 3 дня назад
Hi, is it possible to automate the validation of the incoming SMS content from the specific phone number (Short Code) on real devices using Appium?
@RaghavPal
@RaghavPal 2 дня назад
Yes, it is possible to automate the validation of incoming SMS content from a specific phone number (Short Code) on real devices using Appium. Here's a simple and practical step-by-step solution to achieve this: Prerequisites: Appium installed on your system A real device with a SIM card (Android or iOS) The device is connected to your system via USB The Short Code phone number is known Step 1: Start Appium using command appium Step 2: Connect the Device Verify that the device is connected to the Appium server by running the command appium --udid <device_udid> (replace <device_udid> with your device's UDID) Step 3: Write the Automation Script Create a new file with a .java or .python extension (depending on your preferred programming language) Import the necessary Appium libraries and create a new instance of the Appium driver Use the following code to automate the SMS validation: // Java example import io.appium.java_client.AppiumDriver; import io.appium.java_client.MobileElement; import io.appium.java_client.android.AndroidDriver; public class SmsValidation { public static void main(String[] args) { // Set up the Appium driver AppiumDriver<MobileElement> driver = new AndroidDriver<>(new URL("localhost:4723/wd/hub"), capabilities); // Wait for the SMS to arrive driver.wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//android.widget.TextView[@text='SMS from Short Code']"))); // Get the SMS content String smsContent = driver.findElement(By.xpath("//android.widget.TextView[@text='SMS from Short Code']")).getText(); // Validate the SMS content if (smsContent.contains("expected content")) { System.out.println("SMS validation successful"); } else { System.out.println("SMS validation failed"); } } } Step 4: Run the Automation Script -
@pnarsar4705
@pnarsar4705 2 дня назад
@@RaghavPal thanks for the response, what about if we check coming sms's characters/letters are broken or proper? could we do that?
@RaghavPal
@RaghavPal День назад
Yes, once you fetch the sms you can check this using code. Can check online for code
@pnarsar4705
@pnarsar4705 День назад
@@RaghavPal this is different question. For example, letter "s" seems like "ś" in phone. This is broken letter for me. Can i check that in appium? If i do, then how do i do that?
@RaghavPal
@RaghavPal 8 часов назад
You can check for broken or improper characters in incoming SMS messages using Appium. Here's how: 1. Access the SMS Content The first step is to access the text content of the incoming SMS. The exact implementation of this will depend on the specific app you are testing and its UI elements. You will likely need to use Appium's locators (e.g., id, xpath, class name, etc.) to identify the element displaying the SMS message 2. Retrieve the Text Once you have located the SMS message element, use Appium's getText() method to retrieve the text content. Use codes with caution. Java String smsText = driver.findElement(By.id("sms_message_text")).getText(); 3. Compare and Assert Compare the retrieved smsText with the expected text, paying close attention to any characters that might be displayed incorrectly. You can use string comparison methods or regular expressions to perform this check. Then, use an assertion to verify if the text matches your expectation. Java String expectedText = "This is the expected SMS text with proper characters."; Assert.assertEquals(smsText, expectedText); Important Considerations: Encoding: Make sure you are handling character encoding correctly. If the SMS message is using a different encoding than your test script, you might encounter issues with character comparison. Font and Display Issues: Sometimes, broken characters might be due to font rendering issues on the device rather than the actual SMS content. Consider visual inspection or image comparison techniques if necessary. Accessibility: If possible, leverage accessibility features to retrieve the SMS content. This can help ensure that you are getting the text as it is presented to the user, including any accessibility adjustments. Example (Illustrative): Java // Assuming you have already located the SMS message element WebElement smsElement = driver.findElement(By.id("sms_message_text")); String smsText = smsElement.getText(); // Check if the letter "s" is displayed correctly Assert.assertFalse(smsText.contains("ś")); // Or, check for the expected text with proper characters String expectedText = "This is the expected SMS text with proper characters."; Assert.assertEquals(smsText, expectedText); Additional Tips: Use Test Data: Prepare test SMS messages with known characters that might be problematic to ensure your checks are effective. Device/OS Specific Issues: Be aware that some character display issues might be specific to certain devices or operating systems. Error Handling: Implement proper error handling to gracefully handle situations where the SMS message is not found or cannot be accessed Remember to adapt this general approach to your specific Appium test setup and the application you are testing -
@AmitNiranjanChoudhary
@AmitNiranjanChoudhary 3 дня назад
Thanks Alot sir
@RaghavPal
@RaghavPal 2 дня назад
Most welcome Amit
@sampathnandha8194
@sampathnandha8194 3 дня назад
excellent content... Thanks Raghav!!!
@RaghavPal
@RaghavPal 2 дня назад
Most welcome Sampath
@adityajoshi8734
@adityajoshi8734 3 дня назад
I didnt understand about the location part in step 4
@RaghavPal
@RaghavPal 2 дня назад
Aditya can you please give the exact timestamp with some more details on your query
@adityajoshi8734
@adityajoshi8734 2 дня назад
​Sir at 7:57 copy index.html in usr/share/nginx, what location should i use@@RaghavPal
@RaghavPal
@RaghavPal 2 дня назад
okay this is the location of index.html file. Now in my case it was in the same file as dockerfile and therefore i did not give the complete location .. else you can give the location path COPY /path/to/index.html
@KeertikaAruljothi
@KeertikaAruljothi 3 дня назад
how to know all these are installed and also want to know how it can be deleted from my mac os?
@RaghavPal
@RaghavPal 2 дня назад
Keertika To verify that Minikube is installed and nodes are created on your MacOS, follow these steps: Check Minikube Version: Open a terminal on your MacOS and run the command minikube version Verify Minikube Status: Run the command minikube status. This will show you the status of your Minikube cluster, including the number of nodes created Get Node Information: Run the command kubectl get nodes. This will display a list of nodes in your Minikube cluster, including their names, statuses, and roles Deleting Minikube from MacOS To delete Minikube from your MacOS, follow these steps: Stop Minikube: Run the command minikube stop. This will stop the Minikube cluster Delete Minikube Cluster: Run the command minikube delete. This will delete the Minikube cluster and all associated resources Uninstall Minikube: Run the command brew uninstall minikube (assuming you installed Minikube using Homebrew). This will uninstall Minikube from your MacOS Additional Tips If you want to delete a specific node from your Minikube cluster, you can use the command kubectl delete node <node_name>. If you want to delete all nodes and resources from your Minikube cluster, you can use the command kubectl delete all --all --
@Nothingtosaymore
@Nothingtosaymore 3 дня назад
3:35
@RaghavPal
@RaghavPal 2 дня назад
Let me know if you faced any issues here
@sarthakitaliya7660
@sarthakitaliya7660 3 дня назад
thanks a lot.
@RaghavPal
@RaghavPal 3 дня назад
Most welcome Sarthak
@James-zc7pn
@James-zc7pn 3 дня назад
Can you please tell me how you are getting the auto suggestion when you are entering the test location in terminal.
@RaghavPal
@RaghavPal 3 дня назад
James, try pressing tab after writing few letters.