[{"data":1,"prerenderedAt":16965},["ShallowReactive",2],{"author-alex-barlow":3,"content-doc-\u002Fauthors\u002Falex-barlow-inline":3,"blog-list-{\"where\":[{\"author\":\"Alex Barlow\"}],\"sort\":[{\"date\":-1}]}":29},{"id":4,"title":5,"bio":6,"body":7,"date":18,"description":13,"extension":19,"image":20,"linkedin":21,"meta":22,"name":23,"navigation":24,"order":18,"path":25,"seo":26,"stem":27,"__hash__":28},"authors\u002Fauthors\u002Falex-barlow.md","Co Founder","Alex spent 14 years automating repetitive tasks, before co-founding axiom.ai. He’s hands-on with users and enjoys learning from them. He creates intricate automation the no-code way, and empowered by generative AI, he's extending his skill set to include code. Outside of work, he loves exploring the Scottish Highlands with his daughter and making sandcastles on Firemore Beach.",{"type":8,"value":9,"toc":14},"minimark",[10],[11,12,13],"p",{},".",{"title":15,"searchDepth":16,"depth":16,"links":17},"",3,[],null,"md","\u002Fauthors\u002Falex-barlow.jpeg","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falex-barlow-9b489330\u002F",{},"Alex Barlow",true,"\u002Fauthors\u002Falex-barlow",{"title":5,"description":13},"authors\u002Falex-barlow","mthwrlpXbshOSgAygqgpyg38ZdiM_P6DKRLDBGrqcOo",[30,597,827,1986,2930,3603,4762,5357,5800,6067,6336,6676,6989,7259,7572,7913,8186,8569,8943,9268,9648,10031,10422,10752,10965,11255,11538,11948,12291,12601,13027,13405,16182,16554],{"id":31,"title":32,"author":23,"body":33,"date":573,"description":574,"draft":575,"extension":19,"meta":576,"navigation":24,"path":593,"seo":594,"stem":595,"__hash__":596},"blog\u002Fblog\u002Fhow-to-instagram-dm-with-a-bot.md","How to automate Instagram DMs with a bot? (updated 2025-26)",{"type":8,"value":34,"toc":539},[35,45,52,59,62,67,70,73,76,80,83,91,95,98,101,105,108,112,115,124,128,133,143,146,150,153,157,160,164,167,179,183,186,196,200,204,207,211,215,230,240,244,248,257,261,272,276,282,286,295,309,313,323,328,332,336,345,350,354,363,380,383,387,395,399,403,413,421,425,430,434,443,448,452,456,467,473,477,483,487,490,493,496,499,502,506,513,516,523,527,530],[11,36,37,38],{},"Want to boost engagement or share offers with your followers? You can now automate Instagram DMs without writing a single line of code using a bot. We’ve just updated and tested the template, so you can get set up and ",[39,40,44],"a",{"href":41,"rel":42},"https:\u002F\u002Fwww.axiom.ai\u002Frecipes\u002Finstagram-dm-like",[43],"nofollow","start automating DMs with a single click.",[11,46,47,48],{},"In this guide, you'll learn how to make a bot that automates direct messages on Instagram without a single line of code. What's more, you'll pick up skills that empower you to automate just about anything on the web. How awesome is that? ",[49,50,51],"strong",{},"🚀",[11,53,54,55],{},"Read on if you want to learn or just dive in and install the ",[39,56,58],{"href":41,"rel":57},[43],"updated template.",[60,61],"hero-media",{},[63,64,66],"h2",{"id":65},"why-would-you-build-a-bot-to-automate-instagram-direct-messages","Why would you build a bot to automate Instagram direct messages?",[11,68,69],{},"Wouldn't it be great if you could sit back and let your computer do all your work for you? Well, now you can! Get all the engagement of a personal DM while expending all the effort of falling asleep in your chair.",[11,71,72],{},"Let’s be real though, there’s a bit of a learning curve to setting up a bot. Even so, we reckon it’s worth it. One member of our community put it like this: “If you don’t have a bit of time to invest this is not for you if you do this is the best thing you will ever encounter LEGIT!”.",[11,74,75],{},"If you’ve used a tool like Zapier before, then you should find it no sweat to program a bot for Instagram without coding. This guide takes you through the steps for creating a bot that will automate your most tedious Instagram tasks!",[63,77,79],{"id":78},"what-exactly-is-a-insta-dm-bot","What exactly is a Insta DM bot?",[11,81,82],{},"A bot is like a robot's software cousin. A bot, like a physical robot, requires instructions to understand how to do the job. In this case, you'll give the bot a set of instructions instructing it in the ancient art of automating Instagram direct messages.",[11,84,85,86,90],{},"Check out our ",[39,87,89],{"href":88},"\u002Fblog\u002Fwhat-is-a-bot","blog on what are bots"," to learn more.",[63,92,94],{"id":93},"how-are-instagram-bots-made","How are Instagram bots made?",[11,96,97],{},"With axiom.ai's no-code bot builder, you can create bots for Instagram direct messages without having to code. Use a simple point and click interface to create as many bots as you want!",[11,99,100],{},"If you follow the steps below, you'll have a working bot by the end of this article.",[63,102,104],{"id":103},"how-do-bots-automate-dms-on-instagram","How do bots automate DMs on Instagram?",[11,106,107],{},"Your bot will automate the same web actions you use to send an Instagram DM. Bots operate in the same manner as humans: opening a browser window, visiting a user's profile, and clicking the DM button.",[63,109,111],{"id":110},"will-my-instagram-account-get-blocked-if-i-automate-dms","Will my Instagram account get blocked if I automate DMs?",[11,113,114],{},"It could if you’re not careful and respectful! Instagram limits direct messaging, so if you created an army of bots automating Instagram 24\u002F7, you would be blocked.",[11,116,117,118,123],{},"We believe that bots should be used responsibly and should not be used to spam websites or degrade the experiences of other users. To avoid being blocked,\n",[39,119,122],{"href":120,"rel":121},"https:\u002F\u002Fthepreviewapp.com\u002Finstagram-limitsl",[43],"familiarise yourself with Instagram's rate limits "," and do not exceed them. Don't use Axiom to take advantage of the system!",[63,125,127],{"id":126},"lets-learn-how-to-build-an-instagram-dm-bot","Let’s learn how to build an Instagram DM bot!",[129,130,132],"h3",{"id":131},"install-axiom-in-your-chrome-browser","Install Axiom in your chrome browser",[11,134,135,136,13],{},"If you haven’t yet installed Axiom, and created an account please goto the chrome store and ",[49,137,138],{},[39,139,142],{"href":140,"rel":141},"https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb?hl=en-GB",[43],"install Axiom now",[11,144,145],{},"By the way, we give all new users 2 hours of runtime. This means you can build and run this bot a few times on us 🙂 ",[129,147,149],{"id":148},"set-up-your-google-sheet","Set up your Google Sheet",[11,151,152],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut 'sheet.new', presuming you already have an account. Name your sheet something like 'Instagram DM’ then add profile links.",[129,154,156],{"id":155},"launch-instagram-and-open-axiomai","Launch Instagram and open axiom.ai",[11,158,159],{},"First, open your Chrome browser and log into Instagram. Then launch Axiom and click the '+ New Automation' button. You'll now begin combining steps to create your Instagram automation.",[129,161,163],{"id":162},"click-add-the-first-step-to-start-or-why-not-use-a-insta-template","Click 'Add the first step' to start, or why not use a Insta template?",[11,165,166],{},"To build your bot from scratch, click on 'Add the first step'. This will open the Step Finder, so you can start adding steps to your bot.",[11,168,169,170,174],{},"Follow this link to use the ",[39,171,173],{"href":172},"\u002Fguides\u002Finstagram-dm-like","automate DMs template.",[175,176],"img",{"src":177,"alt":178},"\u002Fblog\u002Fadd-first-step.png","Add first step - build a bot to automate Instagram posting",[129,180,182],{"id":181},"_1-add-your-first-step-read-data-from-a-google-sheet","1. Add your first step, ‘Read data from a Google Sheet’",[11,184,185],{},"Using the Step Finder search for ‘Read data from a Google Sheet’ and click on it. The step will be added to Axiom for you to configure.",[187,188,189,193],"ol",{},[190,191,192],"li",{},"In the field called 'Spreadsheet', you can search for the Google Sheet you created by name. Once found, click on it to select.",[190,194,195],{},"For 'Sheet name' click on the drop-down and select the tab containing the Instagram profile links",[175,197],{"src":198,"alt":199},"\u002Fblog\u002Fgooglesheet-insta-dm.png","Read data from a Google Sheet to automate Instagram",[129,201,203],{"id":202},"_2-add-a-loop-through-data-step","2. Add a ‘Loop through data’ step",[11,205,206],{},"Click the 'Add a new step' button below the ‘read’ step. Using the Step Finder click on 'Loop through data' to add the step.",[175,208],{"src":209,"alt":210},"\u002Fblog\u002Floop-step-finder.png","Add a loop through data step from axiom.ai's step finder",[129,212,214],{"id":213},"_21-add-go-to-page-step","2.1. Add ‘Go to page’ step",[11,216,217,218,221,222,225,226,229],{},"Click the ",[49,219,220],{},"'Add sub-step'"," button ",[49,223,224],{},"inside the 'Loop through data’"," step. Using the Step Finder search for ",[49,227,228],{},"'Go to page'"," and click to add.",[187,231,232],{},[190,233,234,235,239],{},"Enter URL - Click 'Insert data', select ",[236,237,238],"span",{},"google-sheet-data"," choosing the column with the Instagram profile links",[175,241],{"src":242,"alt":243},"\u002Fblog\u002Fgo-to-page-loop.png","Add a go to page from axiom.ai's step finder",[129,245,247],{"id":246},"_22-add-get-data-from-bots-current-page-step","2.2 Add ‘Get data from bot's current page’ step",[11,249,217,250,221,252,225,254,229],{},[49,251,220],{},[49,253,224],{},[49,255,256],{},"'Get data from bot's current page'",[175,258],{"src":259,"alt":260},"\u002Fblog\u002Finsta-scrape-message.png","Using the selector tool on an Instagram profile page choose the column containg the header and posts",[187,262,263,266,269],{},[190,264,265],{},"On an Instagram profile page - Click 'Select' and highlight column with the header and post in it, see image above",[190,267,268],{},"Max Results - Set to one",[190,270,271],{},"Configure scraper - # of attempts when results not found set to one",[175,273],{"src":274,"alt":275},"\u002Fblog\u002Finsta-scrape-message-settings.png","setting up your get data step with axiom.ai sending DMs on Instagram",[11,277,278,279],{},"Tried the ",[39,280,281],{"href":172},"automate DMs template?",[129,283,285],{"id":284},"_23-add-an-if-condition-step","2.3 Add an ‘IF condition’ step",[11,287,217,288,221,290,225,292,229],{},[49,289,220],{},[49,291,224],{},[49,293,294],{},"'If condition'",[187,296,297,303,306],{},[190,298,299,300],{},"Set 'Data to check' - Select ",[236,301,302],{},"Scrape data",[190,304,305],{},"Condition to check - Using words enter 'Message' into the input field",[190,307,308],{},"Reverse condition - True",[129,310,312],{"id":311},"_231-add-a-click-element-step","2.3.1 Add a 'Click Element' step",[11,314,217,315,221,317,225,320,229],{},[49,316,220],{},[49,318,319],{},"inside the 'If Condition’",[49,321,322],{},"'Click Element'",[187,324,325],{},[190,326,327],{},"On an Instagram profile page - Click 'Select' and highlight the 'Message' button",[175,329],{"src":330,"alt":331},"\u002Fblog\u002Fmessage-button.png","Select the message button on the Instrgarm profile page",[129,333,335],{"id":334},"_232-add-a-wait-step","2.3.2 Add a 'Wait' step",[11,337,217,338,221,340,225,342,229],{},[49,339,220],{},[49,341,319],{},[49,343,344],{},"'Wait'",[187,346,347],{},[190,348,349],{},"Set a time in milliseconds - Enter 1000",[129,351,353],{"id":352},"_233-add-a-click-element-step","2.3.3 Add a 'Click Element' step",[11,355,217,356,221,358,225,360,362],{},[49,357,220],{},[49,359,319],{},[49,361,322],{}," and click to add. This step is to close the pop up that only appears when you run the automation.",[187,364,365,368,371,374,377],{},[190,366,367],{},"Click 'Select'",[190,369,370],{},"Next, click 'Custom' in the toolbar",[190,372,373],{},"Tick, 'Use element text instead of html'",[190,375,376],{},"Input 'Not Now' and press complete",[190,378,379],{},"Tick, Optional click",[175,381],{"src":382,"alt":331},"\u002Fblog\u002Fnot-now-click.png",[129,384,386],{"id":385},"_234-add-a-wait-step","2.3.4 Add a 'Wait' step",[11,388,217,389,221,391,225,393,229],{},[49,390,220],{},[49,392,319],{},[49,394,344],{},[187,396,397],{},[190,398,349],{},[129,400,402],{"id":401},"_235-add-a-enter-text-step","2.3.5 Add a 'Enter Text' step",[11,404,217,405,221,407,225,409,412],{},[49,406,220],{},[49,408,319],{},[49,410,411],{},"'Enter Text'"," and click to add. No need to select the input as the cursor is positioned in the input when the Instagram DM page loads.",[187,414,415],{},[190,416,417,418,420],{},"Text - Click 'Insert data' select ",[236,419,238],{}," choosing the column with the message you wish to send",[175,422],{"src":423,"alt":424},"\u002Fblog\u002Finsta-enter0text.png","Enter the message you wish the DM",[11,426,427,428],{},"Stuck? Have you tried the ",[39,429,173],{"href":172},[129,431,433],{"id":432},"_235-add-a-press-keys-step","2.3.5 Add a 'Press Key(s)' step",[11,435,217,436,221,438,225,440,229],{},[49,437,220],{},[49,439,319],{},[49,441,442],{},"'Press Key(s)'",[187,444,445],{},[190,446,447],{},"Key - Click 'Record' and press Return",[175,449],{"src":450,"alt":451},"\u002Fblog\u002Fkeypress-send-message.png","Record 'Enter' keypress to submit your Instagram DM",[129,453,455],{"id":454},"_24-add-a-delete-rows-from-a-google-sheet-step","2.4 Add a 'Delete rows from a Google Sheet' step",[11,457,217,458,221,461,225,464,229],{},[49,459,460],{},"'Add step'",[49,462,463],{},"inside the 'loop step’",[49,465,466],{},"'Delete rows from a Google Sheet'",[187,468,469,471],{},[190,470,192],{},[190,472,195],{},[175,474],{"src":475,"alt":476},"\u002Fblog\u002Fdelete-rows-insta.png","delete the row that has just been processed",[11,478,479,480],{},"Well done! The bot is ready to test ",[49,481,482],{},"👍",[63,484,486],{"id":485},"try-sending-a-dm-on-instagram-to-see-if-its-working-the-way-you-want","Try sending a DM on Instagram to see if it’s working the way you want",[11,488,489],{},"Before you do a test run, make sure you’ve disabled the sub-step ‘Key press’ to stop the DM’s from being sent. If not, do that now.",[11,491,492],{},"It's best practice to test every bot to check it’s production-ready. With the ‘Post’ button disabled, you can do a test run that will not send a post.",[11,494,495],{},"We recommend test running your bot with the desktop app, but you can also do it in the cloud.",[11,497,498],{},"Make sure that you confirm your message is successfully entered and the logic is working as you expect.",[11,500,501],{},"Go ahead and click ‘run’. Get ready for some magic.",[129,503,505],{"id":504},"fix-any-issues-with-your-automation","Fix any issues with your automation",[11,507,508,509,512],{},"If you experience any issue with the bot not clicking buttons, try re-selecting the button or text input or follow this link to use the ",[39,510,511],{"href":172},"New one-click setup automate DMs template.","To change the selection, move the cursor slowly over the object and re-select.",[11,514,515],{},"The 'Click' step also has a handy feature that allows you to select the button by the text, which can resolve many issues. Just click the “Use element text” button and see if that helps you out.",[11,517,518,519],{},"Don't forget we have excellent customer support. If you need help, get in touch. ",[39,520,522],{"href":521},"\u002Fcustomer-support","(\u002Fcustomer-support)",[63,524,526],{"id":525},"conclusion","Conclusion",[11,528,529],{},"You have learned how to use an Instagram direct message bot, sure, but you also have the knowledge to do so much more! Now that you have used an 'Interact' step, automated clicks and key presses, you can build a bot to automate virtually any web app. Remember those jumps steps too - with those in your pocket you’ll be a bot master in no time. Go you!",[531,532,534,535],"h4",{"id":533},"if-you-are-interested-in-automating-instagram-you-may-want-to-see-these-guides","If you are interested in automating Instagram you may want to see these ",[39,536,538],{"href":537},"\u002Fguides?search=instagram","guides.",{"title":15,"searchDepth":16,"depth":16,"links":540},[541,543,544,545,546,547,565,568],{"id":65,"depth":542,"text":66},2,{"id":78,"depth":542,"text":79},{"id":93,"depth":542,"text":94},{"id":103,"depth":542,"text":104},{"id":110,"depth":542,"text":111},{"id":126,"depth":542,"text":127,"children":548},[549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564],{"id":131,"depth":16,"text":132},{"id":148,"depth":16,"text":149},{"id":155,"depth":16,"text":156},{"id":162,"depth":16,"text":163},{"id":181,"depth":16,"text":182},{"id":202,"depth":16,"text":203},{"id":213,"depth":16,"text":214},{"id":246,"depth":16,"text":247},{"id":284,"depth":16,"text":285},{"id":311,"depth":16,"text":312},{"id":334,"depth":16,"text":335},{"id":352,"depth":16,"text":353},{"id":385,"depth":16,"text":386},{"id":401,"depth":16,"text":402},{"id":432,"depth":16,"text":433},{"id":454,"depth":16,"text":455},{"id":485,"depth":542,"text":486,"children":566},[567],{"id":504,"depth":16,"text":505},{"id":525,"depth":542,"text":526,"children":569},[570],{"id":533,"depth":571,"text":572},4,"If you are interested in automating Instagram you may want to see these guides.","2025-11-06","Learn how to automate Instagram DMs with a Google Sheet and a bot. Start from blank and make your own bot or use our one-click setup bot.",false,{"read":577,"type":578,"tool":579,"category":581,"tags":583,"reddit":586,"location":587,"featuredimg":588,"landingimg":589,"summary":590,"video":591,"metaTitle":592},"5 min read","no-code",[580],"No-code tool",[582],"Social media automation",[584,585],"dm","instagram","https:\u002F\u002Fwww.reddit.com\u002Fr\u002Faxiom_ai\u002Fcomments\u002F1dvz7ce\u002Fquickly_automate_instagram_dms_with_axiomais\u002F","London","\u002Fblog\u002Fzapier-axiom.ai.jpg","\u002Fblog\u002Finsta-dm-icon.jpg","Learn in minutes how to build a bot without code to automate sending Instagram direct messages.","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FXPxv5v8qapc?rel=0","How to automate Instagram DM with a bot? | Axiom Academy","\u002Fblog\u002Fhow-to-instagram-dm-with-a-bot",{"title":32,"description":574},"blog\u002Fhow-to-instagram-dm-with-a-bot","xY1Qygq2vcG9wpPN4HNFFebHE3BIS2OZcxM9sx3kTCk",{"id":598,"title":599,"author":23,"body":600,"date":573,"description":15,"draft":575,"extension":19,"meta":813,"navigation":24,"path":823,"seo":824,"stem":825,"__hash__":826},"blog\u002Fblog\u002Fnew-product-launch.md","New tool: run code in remote Chrome browsers, right from your IDE",{"type":8,"value":601,"toc":805},[602,604,607,616,620,624,627,630,634,637,641,644,647,695,699,707,759,773,777,780,783,786,790,798,801],[60,603],{},[11,605,606],{},"Are you a developer building automations, web scrapers or testing web apps? Would it help if you could launch your code across multiple Chrome browsers remotely?",[11,608,609,610,615],{},"After creating the best no-code browser automation tool, we want to do it again! This time, we're building a tool designed for devs. One that works with your stack, built from the ground up on our battle-tested infrastructure. The MVP is now ",[39,611,614],{"href":612,"rel":613},"https:\u002F\u002Fcode.axiom.ai\u002F",[43],"ready to use",". As we did with our no-code tool, we want your input to help shape it.",[175,617],{"src":618,"alt":619},"\u002Fblog\u002Fcode-app.webp","axiom.ai's new Code Dashboard web app",[63,621,623],{"id":622},"running-browser-automations-at-scale-is-hard","Running browser automations at scale is hard",[11,625,626],{},"You don't need us to tell you that running scripts at scale in the browser is hard. Bot blocking platforms like Heroku or Cloudflare exist to stop your web scraper in its tracks. Then come the memory issues. You can whizz through hundreds of Wikipedia pages, but hit a site full of animations and you'll max out Chrome's memory and crash your server in an instant.",[11,628,629],{},"The browser environment is still the wild west. Our goal is to tame it for developers and non-coders alike.",[63,631,633],{"id":632},"who-is-this-tool-for","Who is this tool for?",[11,635,636],{},"The tool is raw. We haven’t focused on packing it with features before shipping. If you’re a developer working in the browser, creating web automations, web scrapers, or testing apps, and you’re interested in using a tool that will be built closely with your feedback, it’s worth trying. If you’re looking for an endpoint to run code in a remote browser, this tool is for you.",[63,638,640],{"id":639},"is-the-tool-production-ready","Is the tool production ready?",[11,642,643],{},"Yes, the MVP is live, tested, and working. You can sign up for a free account and get 30 minutes of runtime to try the tool. Is it production ready? It’s early days, but yes. The infrastructure is battle tested on our No-Code Tool. Our support team is hands on and ready to help tailor the product to your use case and requirements.",[11,645,646],{},"The tool has shipped with this base set of features:",[648,649,650,669,682],"ul",{},[190,651,652,655],{},[49,653,654],{},"Code Dashboard",[648,656,657,660,663,666],{},[190,658,659],{},"Web app",[190,661,662],{},"User account",[190,664,665],{},"Live editor to run scripts and watch them execute in a browser",[190,667,668],{},"Run reports",[190,670,671,674],{},[49,672,673],{},"Infrastruture",[648,675,676,679],{},[190,677,678],{},"Private servers",[190,680,681],{},"Concurrency",[190,683,684,687],{},[49,685,686],{},"Api",[648,688,689,692],{},[190,690,691],{},"Trigger runs",[190,693,694],{},"Run status",[63,696,698],{"id":697},"how-to-use-the-new-tool","How to use the new tool",[11,700,701,702,706],{},"You can run your scripts from your IDE with just one line of code. You’ll need an account and an API key, which you can generate in the app. Existing Axiom users can try the ",[39,703,705],{"href":612,"rel":704},[43],"tool"," too.",[708,709,713],"pre",{"className":710,"code":711,"language":712,"meta":15,"style":15},"language-javascript shiki shiki-themes github-light-default github-dark-default","const browser = await puppeteer.connect({\n    browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=[HIDDEN_KEY]\"\n});\n","javascript",[714,715,716,745,754],"code",{"__ignoreMap":15},[236,717,720,724,728,731,734,738,742],{"class":718,"line":719},"line",1,[236,721,723],{"class":722},"sjeE4","const",[236,725,727],{"class":726},"sHrmB"," browser",[236,729,730],{"class":722}," =",[236,732,733],{"class":722}," await",[236,735,737],{"class":736},"s4rv2"," puppeteer.",[236,739,741],{"class":740},"sbjLL","connect",[236,743,744],{"class":736},"({\n",[236,746,747,750],{"class":718,"line":542},[236,748,749],{"class":736},"    browserWSEndpoint: ",[236,751,753],{"class":752},"sSVrQ","\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=[HIDDEN_KEY]\"\n",[236,755,756],{"class":718,"line":16},[236,757,758],{"class":736},"});\n",[11,760,761,762,767,768,13],{},"I’ve been experimenting with the tool myself, running simple bots to ",[39,763,766],{"href":764,"rel":765},"https:\u002F\u002Faxiom.ai\u002Fblog\u002Fcode-a-puppeteer-web-scraper",[43],"scrape data"," and ",[39,769,772],{"href":770,"rel":771},"https:\u002F\u002Faxiom.ai\u002Fblog\u002Fuse-puppeteer-to-submit-a-form",[43],"fill in forms",[63,774,776],{"id":775},"whats-next-api-mcp-or-ai","What’s next: API, MCP, or AI?",[11,778,779],{},"Over the coming weeks, we'll iterate quickly and ship new features across both our no-code and code tools. The first major release will be an API update that exposes our steps in the API, allowing them to be triggered directly.",[11,781,782],{},"We're also exploring how AI can help, experimenting with AI recovery for selectors and AI assisted bot building. We're continuing to optimise infrastructure, including rolling out our MCP server. Debugging is another big focus for us. How can we better understand and resolve the errors you encounter?",[11,784,785],{},"And of course, your input matters. We'll keep iterating with your feedback as we build.",[63,787,789],{"id":788},"wrapping-up-try-the-tool-tell-us-what-you-think","Wrapping up - Try the tool tell us what you think!",[11,791,792,793,797],{},"Try our ",[39,794,796],{"href":612,"rel":795},[43],"new tool",". All new users get 30 minutes of runtime. You can of course use our no-code tool with the same account. It’s raw but useable, and we’re actively developing it with your input, just as we did with our no-code tool.",[11,799,800],{},"We’re running an agile process that feeds your ideas directly into our idea board, where we scope and score them by effort and impact. Our approach is simple: build the simplest version first, then iterate. It’s a process that has served us well with our no-code users.",[802,803,804],"style",{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":15,"searchDepth":16,"depth":16,"links":806},[807,808,809,810,811,812],{"id":622,"depth":542,"text":623},{"id":632,"depth":542,"text":633},{"id":639,"depth":542,"text":640},{"id":697,"depth":542,"text":698},{"id":775,"depth":542,"text":776},{"id":788,"depth":542,"text":789},{"read":814,"tags":815,"category":818,"location":587,"featuredimg":820,"landingimg":821,"summary":822},"1 min read",[816,817],"automation","guest posts",[819,714],"browser automation","\u002Fblog\u002Fcloud-code-runner.webp","\u002Fblog\u002Fcloud-code-runner-sq.webp","Run code in remote Chrome browsers from your IDE, built on Axiom’s battle tested No-Code Tool.","\u002Fblog\u002Fnew-product-launch",{"title":599,"description":15},"blog\u002Fnew-product-launch","2lW-K2g09Dqrc4XyRp7XVDUEuyyPZ1DWWbdgTMVoga0",{"id":828,"title":829,"author":23,"body":830,"date":1972,"description":1973,"draft":575,"extension":19,"meta":1974,"navigation":24,"path":1982,"seo":1983,"stem":1984,"__hash__":1985},"blog\u002Fblog\u002Fuse-puppeteer-to-submit-a-form.md","Can I ( A no-coder) use Puppeteer to submit a form",{"type":8,"value":831,"toc":1953},[832,841,843,846,858,861,864,868,876,885,889,898,902,905,912,916,919,1072,1076,1079,1082,1086,1089,1095,1099,1106,1112,1115,1147,1157,1161,1167,1172,1174,1204,1210,1214,1220,1225,1227,1247,1250,1282,1286,1292,1297,1299,1319,1323,1329,1334,1336,1358,1367,1371,1374,1487,1491,1494,1520,1527,1764,1768,1771,1786,1789,1793,1797,1800,1907,1911,1919,1929,1938,1947,1950],[11,833,834,835,840],{},"I can ",[39,836,839],{"href":837,"rel":838},"https:\u002F\u002Faxiom.ai\u002Fblog\u002Fhow-to-automate-data-entry",[43],"automate data entry"," and form submission without writing a single line of code. I'm a no-code automation expert. I build workflows without touching JavaScript.",[60,842],{},[11,844,845],{},"This week, it’s time to shake things up. Axiom has just released a new tool that lets you run multiple Puppeteer scripts concurrently in Chrome browsers directly from the command line.",[11,847,848,849,853,854,857],{},"Now's the perfect time to level up and learn some Puppeteer. Following on from coding a ",[39,850,852],{"href":764,"rel":851},[43],"simple web scraper",", I'm now going to automate a web form with code. If you’re a Puppeteer expert, give our ",[39,855,796],{"href":612,"rel":856},[43]," a spin.",[11,859,860],{},"Why I’m not saying “use AI” when everyone else is hyping it: LLMs just aren’t suited to this. They’re costly, error-prone, and bad for the planet. Code or no-code is faster and cleaner. Use LLMs to learn, but not for repetitive tasks.",[11,862,863],{},"If you’re learning like me, Hi I’m Alex Barlow, co-founder of Axiom. Let’s dive in.",[63,865,867],{"id":866},"how-do-i-automate-forms-without-code","How do I automate forms without code?",[11,869,870,871,875],{},"I first select the source of my data, usually a Google Sheet or webhook. I look at the web form, then add the necessary steps in the ",[39,872,580],{"href":873,"rel":874},"https:\u002F\u002Faxiom.ai\u002Fno-code-builder",[43]," to create my workflow. Before I can test the bot, I need to select the elements and connect the data, and I'm done.",[11,877,878,879,884],{},"My no-code experience will be useful here. I’m betting that many of the same ",[39,880,883],{"href":881,"rel":882},"https:\u002F\u002Faxiom.ai\u002Fsteps",[43],"steps"," we have in Axiom map directly to methods in Puppeteer.",[63,886,888],{"id":887},"why-puppeeter-and-not-playwright","Why Puppeeter and not Playwright?",[11,890,891,892,897],{},"We’ve built a tool that runs code remotely in Chrome browsers using ",[39,893,896],{"href":894,"rel":895},"https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fdevtools\u002Fprotocol-monitor#:~:text=CDP%20commands%20directly.-,Overview,Inspect%20CDP%20messages",[43],"CDP"," a WebSocket-based API that enables programmatic interaction with Chrome and Chromium-based browsers, and I want to learn how to use it. I have extensive knowledge of browser automation, but I'm not familiar with coding bots. If I am to work with the team in developing the tool, I need to learn. The new tool can also run Playwright, but I am choosing Puppeteer becuase our no-code tool extends it.",[63,899,901],{"id":900},"tools-i-will-use-including-an-ai","Tools I will use, including an AI",[11,903,904],{},"I will be using an AI, probably ChatGPT or Claude, to help me learn how to script Puppeteer automations. AI is a great learning tool and helps me avoid bugging our CTO with stupid questions. I will also be using Cusor to script and run my automation.",[11,906,907,908],{},"Finally, I will be running the script with Axiom's new ",[39,909,911],{"href":612,"rel":910},[43],"endpoint for browser automation.",[63,913,915],{"id":914},"get-setting-up-with-axiom","Get setting up with Axiom",[11,917,918],{},"An Axiom account is required to run code in our cloud. It's free to try; all new accounts get 30 minutes of runtime. No credit card required. We do not share user information with third parties or send marketing emails.\nThis example code shows you how to connect to the service and open a window. I will use it as a starting point for coding my bot.",[708,920,924],{"className":921,"code":922,"language":923,"meta":15,"style":15},"language-js shiki shiki-themes github-light-default github-dark-default","const browser = await puppeteer.connect({\n        \u002F\u002F\u002F Insert my axiom API Key here\n    browserWSEndpoint: \" Insert Api key\"\n});\nconst page = await browser.newPage()\n\u002F\u002F\u002F Set window size\nawait page.setViewport({ width: 1960, height: 1080 });\n\u002F\u002F\u002F Insert URL of webform I wish to automate\nawait page.goto(\"URl\")\n\n\nawait page.close()\nawait browser.close()\n","js",[714,925,926,942,948,955,959,980,986,1013,1019,1038,1044,1049,1061],{"__ignoreMap":15},[236,927,928,930,932,934,936,938,940],{"class":718,"line":719},[236,929,723],{"class":722},[236,931,727],{"class":726},[236,933,730],{"class":722},[236,935,733],{"class":722},[236,937,737],{"class":736},[236,939,741],{"class":740},[236,941,744],{"class":736},[236,943,944],{"class":718,"line":542},[236,945,947],{"class":946},"sU953","        \u002F\u002F\u002F Insert my axiom API Key here\n",[236,949,950,952],{"class":718,"line":16},[236,951,749],{"class":736},[236,953,954],{"class":752},"\" Insert Api key\"\n",[236,956,957],{"class":718,"line":571},[236,958,758],{"class":736},[236,960,962,964,967,969,971,974,977],{"class":718,"line":961},5,[236,963,723],{"class":722},[236,965,966],{"class":726}," page",[236,968,730],{"class":722},[236,970,733],{"class":722},[236,972,973],{"class":736}," browser.",[236,975,976],{"class":740},"newPage",[236,978,979],{"class":736},"()\n",[236,981,983],{"class":718,"line":982},6,[236,984,985],{"class":946},"\u002F\u002F\u002F Set window size\n",[236,987,989,992,995,998,1001,1004,1007,1010],{"class":718,"line":988},7,[236,990,991],{"class":722},"await",[236,993,994],{"class":736}," page.",[236,996,997],{"class":740},"setViewport",[236,999,1000],{"class":736},"({ width: ",[236,1002,1003],{"class":726},"1960",[236,1005,1006],{"class":736},", height: ",[236,1008,1009],{"class":726},"1080",[236,1011,1012],{"class":736}," });\n",[236,1014,1016],{"class":718,"line":1015},8,[236,1017,1018],{"class":946},"\u002F\u002F\u002F Insert URL of webform I wish to automate\n",[236,1020,1022,1024,1026,1029,1032,1035],{"class":718,"line":1021},9,[236,1023,991],{"class":722},[236,1025,994],{"class":736},[236,1027,1028],{"class":740},"goto",[236,1030,1031],{"class":736},"(",[236,1033,1034],{"class":752},"\"URl\"",[236,1036,1037],{"class":736},")\n",[236,1039,1041],{"class":718,"line":1040},10,[236,1042,1043],{"emptyLinePlaceholder":24},"\n",[236,1045,1047],{"class":718,"line":1046},11,[236,1048,1043],{"emptyLinePlaceholder":24},[236,1050,1052,1054,1056,1059],{"class":718,"line":1051},12,[236,1053,991],{"class":722},[236,1055,994],{"class":736},[236,1057,1058],{"class":740},"close",[236,1060,979],{"class":736},[236,1062,1064,1066,1068,1070],{"class":718,"line":1063},13,[236,1065,991],{"class":722},[236,1067,973],{"class":736},[236,1069,1058],{"class":740},[236,1071,979],{"class":736},[63,1073,1075],{"id":1074},"what-puppeteer-commands-should-i-use","What puppeteer commands should I use?",[11,1077,1078],{},"Off the bat, I could be lazy and ask an LLM to write the code for me. But I want to learn. So instead, I’m using generative AI to research Puppeteer commands.",[11,1080,1081],{},"The first thing I learned was about Puppeteer's Page class and the methods it provides for interacting with an open browser tab, such as navigating to URLs, clicking elements, typing text, and taking screenshots — all the good stuff we browser automators like.",[63,1083,1085],{"id":1084},"what-does-await-mean","What does \"await\" mean?",[11,1087,1088],{},"In the course of my research, I learned that Puppeteer’s methods are asynchronous. That means they start an action and move on without waiting for it to finish. When we interact with a web page, we do things synchronously — we click, wait, then move to the next step. So imagine the chaos if a script tried to fill in every form field at once!",[11,1090,1091,1092,1094],{},"I found that these asynchronous methods return a promise — “I’ll let you know when this is done.” The ",[714,1093,991],{}," tells JavaScript to wait for that promise before running the next line. It stops the script from firing off everything in one mad rush, making the automation more human-like.",[129,1096,1098],{"id":1097},"how-to-input-text-into-a-field-using-puppeteer","How to input text into a field using puppeteer",[11,1100,1101,1102,1105],{},"To enter text into a field, I use the ",[714,1103,1104],{},"type"," method. This method works like saying:",[1107,1108,1109],"blockquote",{},[11,1110,1111],{},"“On this page (the current tab), type this text into the element that matches this selector.”",[11,1113,1114],{},"For example:",[708,1116,1118],{"className":921,"code":1117,"language":923,"meta":15,"style":15},"\u002F\u002F Types text into an input\nawait page.type('#username', 'myUser');\n",[714,1119,1120,1125],{"__ignoreMap":15},[236,1121,1122],{"class":718,"line":719},[236,1123,1124],{"class":946},"\u002F\u002F Types text into an input\n",[236,1126,1127,1129,1131,1133,1135,1138,1141,1144],{"class":718,"line":542},[236,1128,991],{"class":722},[236,1130,994],{"class":736},[236,1132,1104],{"class":740},[236,1134,1031],{"class":736},[236,1136,1137],{"class":752},"'#username'",[236,1139,1140],{"class":736},", ",[236,1142,1143],{"class":752},"'myUser'",[236,1145,1146],{"class":736},");\n",[11,1148,1149,1150,1153,1154,1156],{},"I also learnt you can use another method ",[714,1151,1152],{},"fill"," which is faster but ",[714,1155,1104],{}," is more human as it simulates key strokes.",[129,1158,1160],{"id":1159},"how-to-automate-a-sleect-list-using-puppeteer","How to automate a sleect list using puppeteer",[11,1162,1163,1164,1105],{},"To chose an option from a select list, I use the ",[714,1165,1166],{},"select",[1107,1168,1169],{},[11,1170,1171],{},"“On this page (the current tab), select X on the element that matches this selector.”",[11,1173,1114],{},[708,1175,1177],{"className":921,"code":1176,"language":923,"meta":15,"style":15},"\u002F\u002F Select an option by its value attribute\nawait page.select('#mySelect', 'optionValue');\n",[714,1178,1179,1184],{"__ignoreMap":15},[236,1180,1181],{"class":718,"line":719},[236,1182,1183],{"class":946},"\u002F\u002F Select an option by its value attribute\n",[236,1185,1186,1188,1190,1192,1194,1197,1199,1202],{"class":718,"line":542},[236,1187,991],{"class":722},[236,1189,994],{"class":736},[236,1191,1166],{"class":740},[236,1193,1031],{"class":736},[236,1195,1196],{"class":752},"'#mySelect'",[236,1198,1140],{"class":736},[236,1200,1201],{"class":752},"'optionValue'",[236,1203,1146],{"class":736},[11,1205,1206,1209],{},[714,1207,1208],{},"optionValue"," is th evalue you want to select.",[129,1211,1213],{"id":1212},"how-to-click-an-element-using-puppeteer","How to click an element using puppeteer",[11,1215,1216,1217,1105],{},"To click an element like a link, I use the ",[714,1218,1219],{},"click",[1107,1221,1222],{},[11,1223,1224],{},"“On this page (the current tab), select and click element that matches this selector.”",[11,1226,1114],{},[708,1228,1230],{"className":921,"code":1229,"language":923,"meta":15,"style":15},"await page.click('#loginButton');\n\n",[714,1231,1232],{"__ignoreMap":15},[236,1233,1234,1236,1238,1240,1242,1245],{"class":718,"line":719},[236,1235,991],{"class":722},[236,1237,994],{"class":736},[236,1239,1219],{"class":740},[236,1241,1031],{"class":736},[236,1243,1244],{"class":752},"'#loginButton'",[236,1246,1146],{"class":736},[11,1248,1249],{},"You could also try co-ordinates, see example:",[708,1251,1253],{"className":921,"code":1252,"language":923,"meta":15,"style":15},"await page.click('#loginButton', { offset: { x: 10, y: 5 } });\n",[714,1254,1255],{"__ignoreMap":15},[236,1256,1257,1259,1261,1263,1265,1267,1270,1273,1276,1279],{"class":718,"line":719},[236,1258,991],{"class":722},[236,1260,994],{"class":736},[236,1262,1219],{"class":740},[236,1264,1031],{"class":736},[236,1266,1244],{"class":752},[236,1268,1269],{"class":736},", { offset: { x: ",[236,1271,1272],{"class":726},"10",[236,1274,1275],{"class":736},", y: ",[236,1277,1278],{"class":726},"5",[236,1280,1281],{"class":736}," } });\n",[129,1283,1285],{"id":1284},"how-to-select-radio-button-using-puppeteer","How to select radio button using puppeteer",[11,1287,1288,1289,1291],{},"To click a radio, I use the ",[714,1290,1219],{}," method again. This method works like saying:",[1107,1293,1294],{},[11,1295,1296],{},"“On this page (the current tab), select and click radio that matches this selector.”",[11,1298,1114],{},[708,1300,1302],{"className":921,"code":1301,"language":923,"meta":15,"style":15},"await page.click('input[type=radio][value=cat]');\n",[714,1303,1304],{"__ignoreMap":15},[236,1305,1306,1308,1310,1312,1314,1317],{"class":718,"line":719},[236,1307,991],{"class":722},[236,1309,994],{"class":736},[236,1311,1219],{"class":740},[236,1313,1031],{"class":736},[236,1315,1316],{"class":752},"'input[type=radio][value=cat]'",[236,1318,1146],{"class":736},[129,1320,1322],{"id":1321},"last-but-not-least-how-to-use-a-keypress-to-automate-website-actions","Last but not least, How to use a keypress to automate website actions",[11,1324,1325,1326,1105],{},"To replicate keyboard actions, I can use the ",[714,1327,1328],{},"keypress",[1107,1330,1331],{},[11,1332,1333],{},"“On this page (the current tab), press this key.”",[11,1335,1114],{},[708,1337,1339],{"className":921,"code":1338,"language":923,"meta":15,"style":15},"await page.keyboard.press('Enter');\n",[714,1340,1341],{"__ignoreMap":15},[236,1342,1343,1345,1348,1351,1353,1356],{"class":718,"line":719},[236,1344,991],{"class":722},[236,1346,1347],{"class":736}," page.keyboard.",[236,1349,1350],{"class":740},"press",[236,1352,1031],{"class":736},[236,1354,1355],{"class":752},"'Enter'",[236,1357,1146],{"class":736},[11,1359,1360,1361,1366],{},"Typically, I use the no-code ",[39,1362,1365],{"href":1363,"rel":1364},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Fguides\u002Fgeneral\u002Fweb-actions\u002Fkeyboard-short-cuts",[43],"keypress step"," in Axiom to submit forms or tab between elements. I can, of course, do the same with code.",[63,1368,1370],{"id":1369},"coding-the-bot","Coding the bot",[11,1372,1373],{},"First up, I’ll insert my API key and the URL of the web form I’ll automate, in this case a demo page.",[708,1375,1377],{"className":921,"code":1376,"language":923,"meta":15,"style":15},"const browser = await puppeteer.connect({\n        \u002F\u002F\u002F Insert my axiom API Key here\n    browserWSEndpoint: \"eyJ1c2VyX2lkIjoxOTUzNzMsInRva2VuIjoiMTk1MzczNDZhMTA4OWIwYmQzZWRmNyJ9\"\n});\nconst page = await browser.newPage()\nawait page.setViewport({ width: 1960, height: 1080 });\n\u002F\u002F\u002F Insert URL of webform I wish to automate\nawait page.goto(\"https:\u002F\u002Faxiom.ai\u002Fdemo\u002Fwebform\u002F\")\n\nawait page.close()\nawait browser.close()\n",[714,1378,1379,1395,1399,1406,1410,1426,1444,1448,1463,1467,1477],{"__ignoreMap":15},[236,1380,1381,1383,1385,1387,1389,1391,1393],{"class":718,"line":719},[236,1382,723],{"class":722},[236,1384,727],{"class":726},[236,1386,730],{"class":722},[236,1388,733],{"class":722},[236,1390,737],{"class":736},[236,1392,741],{"class":740},[236,1394,744],{"class":736},[236,1396,1397],{"class":718,"line":542},[236,1398,947],{"class":946},[236,1400,1401,1403],{"class":718,"line":16},[236,1402,749],{"class":736},[236,1404,1405],{"class":752},"\"eyJ1c2VyX2lkIjoxOTUzNzMsInRva2VuIjoiMTk1MzczNDZhMTA4OWIwYmQzZWRmNyJ9\"\n",[236,1407,1408],{"class":718,"line":571},[236,1409,758],{"class":736},[236,1411,1412,1414,1416,1418,1420,1422,1424],{"class":718,"line":961},[236,1413,723],{"class":722},[236,1415,966],{"class":726},[236,1417,730],{"class":722},[236,1419,733],{"class":722},[236,1421,973],{"class":736},[236,1423,976],{"class":740},[236,1425,979],{"class":736},[236,1427,1428,1430,1432,1434,1436,1438,1440,1442],{"class":718,"line":982},[236,1429,991],{"class":722},[236,1431,994],{"class":736},[236,1433,997],{"class":740},[236,1435,1000],{"class":736},[236,1437,1003],{"class":726},[236,1439,1006],{"class":736},[236,1441,1009],{"class":726},[236,1443,1012],{"class":736},[236,1445,1446],{"class":718,"line":988},[236,1447,1018],{"class":946},[236,1449,1450,1452,1454,1456,1458,1461],{"class":718,"line":1015},[236,1451,991],{"class":722},[236,1453,994],{"class":736},[236,1455,1028],{"class":740},[236,1457,1031],{"class":736},[236,1459,1460],{"class":752},"\"https:\u002F\u002Faxiom.ai\u002Fdemo\u002Fwebform\u002F\"",[236,1462,1037],{"class":736},[236,1464,1465],{"class":718,"line":1021},[236,1466,1043],{"emptyLinePlaceholder":24},[236,1468,1469,1471,1473,1475],{"class":718,"line":1040},[236,1470,991],{"class":722},[236,1472,994],{"class":736},[236,1474,1058],{"class":740},[236,1476,979],{"class":736},[236,1478,1479,1481,1483,1485],{"class":718,"line":1046},[236,1480,991],{"class":722},[236,1482,973],{"class":736},[236,1484,1058],{"class":740},[236,1486,979],{"class":736},[63,1488,1490],{"id":1489},"selecting-puppeteer-methods-to-automate-the-form","Selecting Puppeteer methods to automate the form",[11,1492,1493],{},"Now into uncharted water I have done this without code using Axiom, just never with code. Looking at the form I see I will need:",[187,1495,1496,1502,1508,1514],{},[190,1497,1498,1499,1501],{},"The ",[714,1500,1104],{}," method to submit name and email",[190,1503,1498,1504,1507],{},[714,1505,1506],{},"Select"," method to select an option on \"How did you find us\" select list",[190,1509,1510,1511,1513],{},"A ",[714,1512,1219],{}," method to select a radio",[190,1515,1516,1517,1519],{},"Finally, A ",[714,1518,1219],{}," method to click submit",[11,1521,1522,1523,1526],{},"I add five lines of code. For each one, I also need a ",[714,1524,1525],{},"CSS selector",". To work out my selectors, I use Chrome Inspector, a tool I’m familiar with and use a lot when building no-code automations.",[708,1528,1530],{"className":921,"code":1529,"language":923,"meta":15,"style":15},"const browser = await puppeteer.connect({\n        \u002F\u002F\u002F Insert my axiom API Key here\n    browserWSEndpoint: \"eyJ1c2VyX2lkIjoxOTUzNzMsInRva2VuIjoiMTk1MzczNDZhMTA4OWIwYmQzZWRmNyJ9\"\n});\nconst page = await browser.newPage()\n\u002F\u002F\u002F Set window size\nawait page.setViewport({ width: 1960, height: 1080 });\n\u002F\u002F\u002F Insert URL of webform I wish to automate\nawait page.goto(\"https:\u002F\u002Faxiom.ai\u002Fdemo\u002Fwebform\u002F\")\n\u002F\u002F Enter name added css selector\nawait page.type('#name', 'myUser');\n\u002F\u002F Enter email added css selector\nawait page.type('#email', 'myUser');\n\u002F\u002F Select list added css selector and value\nawait page.select('#howFound', 'Referral');\n\u002F\u002F Radio added css selector\nawait page.click('#optInYes');\n\u002F\u002F Submit form added css selector\nawait page.click('.submit-btn');\n\nawait page.close()\nawait browser.close()\n",[714,1531,1532,1548,1552,1558,1562,1578,1582,1600,1604,1618,1623,1642,1647,1666,1672,1693,1699,1715,1721,1737,1742,1753],{"__ignoreMap":15},[236,1533,1534,1536,1538,1540,1542,1544,1546],{"class":718,"line":719},[236,1535,723],{"class":722},[236,1537,727],{"class":726},[236,1539,730],{"class":722},[236,1541,733],{"class":722},[236,1543,737],{"class":736},[236,1545,741],{"class":740},[236,1547,744],{"class":736},[236,1549,1550],{"class":718,"line":542},[236,1551,947],{"class":946},[236,1553,1554,1556],{"class":718,"line":16},[236,1555,749],{"class":736},[236,1557,1405],{"class":752},[236,1559,1560],{"class":718,"line":571},[236,1561,758],{"class":736},[236,1563,1564,1566,1568,1570,1572,1574,1576],{"class":718,"line":961},[236,1565,723],{"class":722},[236,1567,966],{"class":726},[236,1569,730],{"class":722},[236,1571,733],{"class":722},[236,1573,973],{"class":736},[236,1575,976],{"class":740},[236,1577,979],{"class":736},[236,1579,1580],{"class":718,"line":982},[236,1581,985],{"class":946},[236,1583,1584,1586,1588,1590,1592,1594,1596,1598],{"class":718,"line":988},[236,1585,991],{"class":722},[236,1587,994],{"class":736},[236,1589,997],{"class":740},[236,1591,1000],{"class":736},[236,1593,1003],{"class":726},[236,1595,1006],{"class":736},[236,1597,1009],{"class":726},[236,1599,1012],{"class":736},[236,1601,1602],{"class":718,"line":1015},[236,1603,1018],{"class":946},[236,1605,1606,1608,1610,1612,1614,1616],{"class":718,"line":1021},[236,1607,991],{"class":722},[236,1609,994],{"class":736},[236,1611,1028],{"class":740},[236,1613,1031],{"class":736},[236,1615,1460],{"class":752},[236,1617,1037],{"class":736},[236,1619,1620],{"class":718,"line":1040},[236,1621,1622],{"class":946},"\u002F\u002F Enter name added css selector\n",[236,1624,1625,1627,1629,1631,1633,1636,1638,1640],{"class":718,"line":1046},[236,1626,991],{"class":722},[236,1628,994],{"class":736},[236,1630,1104],{"class":740},[236,1632,1031],{"class":736},[236,1634,1635],{"class":752},"'#name'",[236,1637,1140],{"class":736},[236,1639,1143],{"class":752},[236,1641,1146],{"class":736},[236,1643,1644],{"class":718,"line":1051},[236,1645,1646],{"class":946},"\u002F\u002F Enter email added css selector\n",[236,1648,1649,1651,1653,1655,1657,1660,1662,1664],{"class":718,"line":1063},[236,1650,991],{"class":722},[236,1652,994],{"class":736},[236,1654,1104],{"class":740},[236,1656,1031],{"class":736},[236,1658,1659],{"class":752},"'#email'",[236,1661,1140],{"class":736},[236,1663,1143],{"class":752},[236,1665,1146],{"class":736},[236,1667,1669],{"class":718,"line":1668},14,[236,1670,1671],{"class":946},"\u002F\u002F Select list added css selector and value\n",[236,1673,1675,1677,1679,1681,1683,1686,1688,1691],{"class":718,"line":1674},15,[236,1676,991],{"class":722},[236,1678,994],{"class":736},[236,1680,1166],{"class":740},[236,1682,1031],{"class":736},[236,1684,1685],{"class":752},"'#howFound'",[236,1687,1140],{"class":736},[236,1689,1690],{"class":752},"'Referral'",[236,1692,1146],{"class":736},[236,1694,1696],{"class":718,"line":1695},16,[236,1697,1698],{"class":946},"\u002F\u002F Radio added css selector\n",[236,1700,1702,1704,1706,1708,1710,1713],{"class":718,"line":1701},17,[236,1703,991],{"class":722},[236,1705,994],{"class":736},[236,1707,1219],{"class":740},[236,1709,1031],{"class":736},[236,1711,1712],{"class":752},"'#optInYes'",[236,1714,1146],{"class":736},[236,1716,1718],{"class":718,"line":1717},18,[236,1719,1720],{"class":946},"\u002F\u002F Submit form added css selector\n",[236,1722,1724,1726,1728,1730,1732,1735],{"class":718,"line":1723},19,[236,1725,991],{"class":722},[236,1727,994],{"class":736},[236,1729,1219],{"class":740},[236,1731,1031],{"class":736},[236,1733,1734],{"class":752},"'.submit-btn'",[236,1736,1146],{"class":736},[236,1738,1740],{"class":718,"line":1739},20,[236,1741,1043],{"emptyLinePlaceholder":24},[236,1743,1745,1747,1749,1751],{"class":718,"line":1744},21,[236,1746,991],{"class":722},[236,1748,994],{"class":736},[236,1750,1058],{"class":740},[236,1752,979],{"class":736},[236,1754,1756,1758,1760,1762],{"class":718,"line":1755},22,[236,1757,991],{"class":722},[236,1759,973],{"class":736},[236,1761,1058],{"class":740},[236,1763,979],{"class":736},[63,1765,1767],{"id":1766},"testing-and-running-the-puppeteer-script","Testing and running the Puppeteer script",[11,1769,1770],{},"There are two ways to test my bot.",[187,1772,1773,1779],{},[190,1774,1775,1776,13],{},"Run the script from console or in cursor by simply entering ",[714,1777,1778],{},"node form-entry-bot.js",[190,1780,1781,1782,13],{},"Alternaticaley I can run the script inside the tools \"Live editor\" feature which is found in the ",[39,1783,1785],{"href":612,"rel":1784},[43],"code dashboard web app",[11,1787,1788],{},"Each method has pros and cons. From the command line, you can’t watch the run, but you do get feedback on the run state, errors, and other details. In the Live editor, a preview opens so you can watch the run — as shown in the screenshot below.",[175,1790],{"src":1791,"alt":1792},"\u002Fblog\u002Fpuppeteer-playground.webp","axiom.ai Live editor for running scripts",[63,1794,1796],{"id":1795},"minnor-tweak-to-the-code","Minnor tweak to the code",[11,1798,1799],{},"I tested the script in the desktop Live editor. The click on the submit button wasn’t visible on the page, so I added a line of code to scroll. The page also closed too quickly, so I added a wait to keep it open. Other than that, it worked perfectly.",[708,1801,1803],{"className":921,"code":1802,"language":923,"meta":15,"style":15},"await page.evaluate(() => {\n    document.querySelector('.submit-btn').scrollIntoView();\n});\n\u002F\u002F Submit form\nawait page.click('.submit-btn');\n\n\u002F\u002F Wait to see the result\nawait new Promise(resolve => setTimeout(resolve, 5000));\n",[714,1804,1805,1823,1844,1848,1853,1867,1871,1876],{"__ignoreMap":15},[236,1806,1807,1809,1811,1814,1817,1820],{"class":718,"line":719},[236,1808,991],{"class":722},[236,1810,994],{"class":736},[236,1812,1813],{"class":740},"evaluate",[236,1815,1816],{"class":736},"(() ",[236,1818,1819],{"class":722},"=>",[236,1821,1822],{"class":736}," {\n",[236,1824,1825,1828,1831,1833,1835,1838,1841],{"class":718,"line":542},[236,1826,1827],{"class":736},"    document.",[236,1829,1830],{"class":740},"querySelector",[236,1832,1031],{"class":736},[236,1834,1734],{"class":752},[236,1836,1837],{"class":736},").",[236,1839,1840],{"class":740},"scrollIntoView",[236,1842,1843],{"class":736},"();\n",[236,1845,1846],{"class":718,"line":16},[236,1847,758],{"class":736},[236,1849,1850],{"class":718,"line":571},[236,1851,1852],{"class":946},"\u002F\u002F Submit form\n",[236,1854,1855,1857,1859,1861,1863,1865],{"class":718,"line":961},[236,1856,991],{"class":722},[236,1858,994],{"class":736},[236,1860,1219],{"class":740},[236,1862,1031],{"class":736},[236,1864,1734],{"class":752},[236,1866,1146],{"class":736},[236,1868,1869],{"class":718,"line":982},[236,1870,1043],{"emptyLinePlaceholder":24},[236,1872,1873],{"class":718,"line":988},[236,1874,1875],{"class":946},"\u002F\u002F Wait to see the result\n",[236,1877,1878,1880,1883,1886,1888,1892,1895,1898,1901,1904],{"class":718,"line":1015},[236,1879,991],{"class":722},[236,1881,1882],{"class":722}," new",[236,1884,1885],{"class":726}," Promise",[236,1887,1031],{"class":736},[236,1889,1891],{"class":1890},"sTDnQ","resolve",[236,1893,1894],{"class":722}," =>",[236,1896,1897],{"class":740}," setTimeout",[236,1899,1900],{"class":736},"(resolve, ",[236,1902,1903],{"class":726},"5000",[236,1905,1906],{"class":736},"));\n",[63,1908,1910],{"id":1909},"wrapping-up-yes-a-no-coder-can-learn-puppeteer-and-automate-a-form-but-should-you","Wrapping up — yes, a no-coder can learn Puppeteer and automate a form, but should you?",[11,1912,1913,1914,1918],{},"I've been using Puppeteer for years without really understanding much about the underlying code through Axiom's ",[39,1915,1917],{"href":873,"rel":1916},[43],"no-code tool",". One customer even said it's 85% faster than writing your own Puppeteer script.",[11,1920,1921,1922,1925,1926,1928],{},"I've really enjoyed digging deeper into code, even though I've only scratched the surface. It's been good to learn about the ",[714,1923,1924],{},"page"," class and methods such as ",[714,1927,1219],{},". The process I went through, using AI for help, working in a tool like Cursor, and having an endpoint to test my scripts, made it easy to get up and running. No wrestling with NPM, which can be a real pain.",[11,1930,1931,1932,1934,1935,1937],{},"I also learned about ",[714,1933,991],{},", and that the ",[714,1936,1924],{}," methods in Puppeteer return a promise when they are completed.",[11,1939,1940,1941,1946],{},"As a no-coder, I can now ",[39,1942,1945],{"href":1943,"rel":1944},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Ftutorials\u002Fwebforms",[43],"automate forms"," with or without using Puppeteer. So which would I choose? I’ll be honest, I’d choose lazy every time. It's just quicker and easier to use the No-code tool. Even if I were a proficient coder, I'd still pick no-code. That said, I've really enjoyed learning more about how Puppeteer works, so I'll keep digging deeper and trying new things.",[11,1948,1949],{},"Next, I might learn how to loop methods with code, a feature I use in the no-code tool all the time. That's going to be fun 😃",[802,1951,1952],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}",{"title":15,"searchDepth":16,"depth":16,"links":1954},[1955,1956,1957,1958,1959,1960,1967,1968,1969,1970,1971],{"id":866,"depth":542,"text":867},{"id":887,"depth":542,"text":888},{"id":900,"depth":542,"text":901},{"id":914,"depth":542,"text":915},{"id":1074,"depth":542,"text":1075},{"id":1084,"depth":542,"text":1085,"children":1961},[1962,1963,1964,1965,1966],{"id":1097,"depth":16,"text":1098},{"id":1159,"depth":16,"text":1160},{"id":1212,"depth":16,"text":1213},{"id":1284,"depth":16,"text":1285},{"id":1321,"depth":16,"text":1322},{"id":1369,"depth":542,"text":1370},{"id":1489,"depth":542,"text":1490},{"id":1766,"depth":542,"text":1767},{"id":1795,"depth":542,"text":1796},{"id":1909,"depth":542,"text":1910},"2025-10-16","I can automate data entry and form submission without writing a single line of code. I'm a no-code automation expert. I build workflows without touching JavaScript.",{"read":577,"tags":1975,"category":1978,"location":587,"featuredimg":1979,"landingimg":1980,"summary":1981,"video":18},[1976,1977],"data entry","web form",[819],"\u002Fblog\u002Fform-flat-puppeteer.webp","\u002Fblog\u002Fform-flat-puppeteer-sq.webp","A no-coder’s guide to using Puppeteer to automate a web form, learn core methods like click, type, and select, and run scripts easily with Axiom’s new code dashboard.","\u002Fblog\u002Fuse-puppeteer-to-submit-a-form",{"title":829,"description":1973},"blog\u002Fuse-puppeteer-to-submit-a-form","alUVrX2Gr-KB0b4hMdgtjCUWlAkM9hffeMs6yjmz9lA",{"id":1987,"title":1988,"author":23,"body":1989,"date":2909,"description":2910,"draft":575,"extension":19,"meta":2911,"navigation":24,"path":2926,"seo":2927,"stem":2928,"__hash__":2929},"blog\u002Fblog\u002Finput-fields.md","Master selecting form input fields with CSS for automation",{"type":8,"value":1990,"toc":2894},[1991,1999,2007,2015,2018,2021,2025,2028,2031,2187,2205,2290,2293,2308,2312,2315,2326,2329,2333,2336,2344,2348,2366,2369,2387,2391,2394,2458,2465,2468,2472,2475,2482,2486,2489,2603,2606,2639,2646,2650,2653,2656,2659,2673,2676,2681,2684,2687,2691,2694,2697,2704,2768,2771,2776,2780,2787,2843,2846,2849,2854,2857,2860,2865,2875,2879,2882,2885,2888,2891],[11,1992,1993,1994,1998],{},"Knowing how to cherry-pick the correct selector for targeting form input elements will make your life easier when automating forms. If you want to learn how, read on. For transparency, I use axiom.ai, a ",[39,1995,1997],{"href":1996},"\u002Fno-code-builder","no-code browser automation tool",". However, this guide is relevant for people using other tools or coding solutions. The tool may change, but the selectors remain the same.",[11,2000,2001,2002,2006],{},"When I create bots to automate form filling in the browser, I add Enter text steps, select the input fields using our ",[39,2003,2005],{"href":2004},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool","no-code selector tool",", and set the data I want to pass into the field. It's straightforward; selecting an element requires just pointing and clicking. I repeat this process for each input in the form. However, sometimes, the selectors generated by axiom.ai do not work. When I run a test, I might see an error like \"Step 4: element not found\"—this means axiom.ai couldn't find the element on the webpage.",[11,2008,2009,2010,2014],{},"To solve this problem, I can reselect the element or try a custom selector. I always try the former first, then proceed to the latter. Now, if you're a no-coder or a developer, you may not be familiar with CSS selectors. Read our general ",[39,2011,2013],{"href":2012},"\u002Fbest-custom-css-selectors-for-web-scraping","CSS selector guide here",". This guide will teach anyone how to quickly extract a custom selector from the HTML of a form input element.",[11,2016,2017],{},"I will walk you through real-world scenarios using custom selectors, explain how I created them, and share my go-to selectors for form inputs.",[11,2019,2020],{},"I'm Alex Barlow, co-founder of axiom.ai; let's dive in. By the end of this article, you'll be able to formulate a correct custom selector faster than an AI could.",[63,2022,2024],{"id":2023},"anatomy-of-the-input-field-type","Anatomy of the input field type",[11,2026,2027],{},"Having a basic understanding of the anatomy of an Input field helps us understand how to identify custom selectors.",[11,2029,2030],{},"Here is a search input field taken from the BBC website:",[708,2032,2037],{"className":2033,"code":2034,"language":2035,"meta":2036,"style":15},"language-html shiki shiki-themes github-light-default github-dark-default","\u003Cinput aria-activedescendant=\"\" aria-autocomplete=\"list\" aria-controls=\"suggestions\" aria-expanded=\"false\" aria-haspopup=\"listbox\" autocomplete=\"off\" id=\"searchInput\" name=\"q\" placeholder=\"Search the BBC\" role=\"combobox\" class=\"ssrcss-199fsd8-StyledInput e1ld3nu72\" value=\"\">\u003Cdiv pseudo=\"-webkit-input-placeholder\" id=\"placeholder\" style=\"display: block !important;\">Search the BBC\u003C\u002Fdiv>\u003C\u002Finput>\n","html","HTML",[714,2038,2039],{"__ignoreMap":15},[236,2040,2041,2044,2048,2051,2054,2057,2060,2062,2065,2068,2070,2073,2076,2078,2081,2084,2086,2089,2092,2094,2097,2100,2102,2105,2108,2110,2113,2116,2118,2121,2124,2126,2129,2132,2134,2137,2140,2142,2144,2147,2150,2153,2155,2158,2160,2162,2165,2168,2170,2173,2176,2178,2181,2184],{"class":718,"line":719},[236,2042,2043],{"class":736},"\u003C",[236,2045,2047],{"class":2046},"sjgCt","input",[236,2049,2050],{"class":726}," aria-activedescendant",[236,2052,2053],{"class":736},"=",[236,2055,2056],{"class":752},"\"\"",[236,2058,2059],{"class":726}," aria-autocomplete",[236,2061,2053],{"class":736},[236,2063,2064],{"class":752},"\"list\"",[236,2066,2067],{"class":726}," aria-controls",[236,2069,2053],{"class":736},[236,2071,2072],{"class":752},"\"suggestions\"",[236,2074,2075],{"class":726}," aria-expanded",[236,2077,2053],{"class":736},[236,2079,2080],{"class":752},"\"false\"",[236,2082,2083],{"class":726}," aria-haspopup",[236,2085,2053],{"class":736},[236,2087,2088],{"class":752},"\"listbox\"",[236,2090,2091],{"class":726}," autocomplete",[236,2093,2053],{"class":736},[236,2095,2096],{"class":752},"\"off\"",[236,2098,2099],{"class":726}," id",[236,2101,2053],{"class":736},[236,2103,2104],{"class":752},"\"searchInput\"",[236,2106,2107],{"class":726}," name",[236,2109,2053],{"class":736},[236,2111,2112],{"class":752},"\"q\"",[236,2114,2115],{"class":726}," placeholder",[236,2117,2053],{"class":736},[236,2119,2120],{"class":752},"\"Search the BBC\"",[236,2122,2123],{"class":726}," role",[236,2125,2053],{"class":736},[236,2127,2128],{"class":752},"\"combobox\"",[236,2130,2131],{"class":726}," class",[236,2133,2053],{"class":736},[236,2135,2136],{"class":752},"\"ssrcss-199fsd8-StyledInput e1ld3nu72\"",[236,2138,2139],{"class":726}," value",[236,2141,2053],{"class":736},[236,2143,2056],{"class":752},[236,2145,2146],{"class":736},">\u003C",[236,2148,2149],{"class":2046},"div",[236,2151,2152],{"class":726}," pseudo",[236,2154,2053],{"class":736},[236,2156,2157],{"class":752},"\"-webkit-input-placeholder\"",[236,2159,2099],{"class":726},[236,2161,2053],{"class":736},[236,2163,2164],{"class":752},"\"placeholder\"",[236,2166,2167],{"class":726}," style",[236,2169,2053],{"class":736},[236,2171,2172],{"class":752},"\"display: block !important;\"",[236,2174,2175],{"class":736},">Search the BBC\u003C\u002F",[236,2177,2149],{"class":2046},[236,2179,2180],{"class":736},">\u003C\u002F",[236,2182,2047],{"class":2183},"sZcZs",[236,2185,2186],{"class":736},">\n",[11,2188,2189,2190,2193,2194,2196,2197,2200,2201,2204],{},"Breaking it down, we are looking for the opening tag of the",[714,2191,2192],{},"\u003Cinput>"," field. The tag contains attributes after ",[714,2195,2047],{}," and before ",[714,2198,2199],{},">",". For example,",[714,2202,2203],{},"aria-controls=\"suggestions\""," is an attribute. We use the attribute to create our custom selectors.",[708,2206,2208],{"className":2033,"code":2207,"language":2035,"meta":2036,"style":15},"\u003Cinput aria-activedescendant=\"\" aria-autocomplete=\"list\" aria-controls=\"suggestions\" aria-expanded=\"false\" aria-haspopup=\"listbox\" autocomplete=\"off\" id=\"searchInput\" name=\"q\" placeholder=\"Search the BBC\" role=\"combobox\" class=\"ssrcss-199fsd8-StyledInput e1ld3nu72\" value=\"\">\n",[714,2209,2210],{"__ignoreMap":15},[236,2211,2212,2214,2216,2218,2220,2222,2224,2226,2228,2230,2232,2234,2236,2238,2240,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284,2286,2288],{"class":718,"line":719},[236,2213,2043],{"class":736},[236,2215,2047],{"class":2046},[236,2217,2050],{"class":726},[236,2219,2053],{"class":736},[236,2221,2056],{"class":752},[236,2223,2059],{"class":726},[236,2225,2053],{"class":736},[236,2227,2064],{"class":752},[236,2229,2067],{"class":726},[236,2231,2053],{"class":736},[236,2233,2072],{"class":752},[236,2235,2075],{"class":726},[236,2237,2053],{"class":736},[236,2239,2080],{"class":752},[236,2241,2083],{"class":726},[236,2243,2053],{"class":736},[236,2245,2088],{"class":752},[236,2247,2091],{"class":726},[236,2249,2053],{"class":736},[236,2251,2096],{"class":752},[236,2253,2099],{"class":726},[236,2255,2053],{"class":736},[236,2257,2104],{"class":752},[236,2259,2107],{"class":726},[236,2261,2053],{"class":736},[236,2263,2112],{"class":752},[236,2265,2115],{"class":726},[236,2267,2053],{"class":736},[236,2269,2120],{"class":752},[236,2271,2123],{"class":726},[236,2273,2053],{"class":736},[236,2275,2128],{"class":752},[236,2277,2131],{"class":726},[236,2279,2053],{"class":736},[236,2281,2136],{"class":752},[236,2283,2139],{"class":726},[236,2285,2053],{"class":736},[236,2287,2056],{"class":752},[236,2289,2186],{"class":736},[11,2291,2292],{},"The CSS selectors we can abstract and find helpful in this example are:",[187,2294,2295,2297,2303],{},[190,2296,2047],{},[190,2298,2299,2300],{},"#searchInput or ",[236,2301,2302],{},"id=\"searchInput\"",[190,2304,2305],{},[236,2306,2307],{},"placeholder=\"Search the BBC\"",[63,2309,2311],{"id":2310},"how-to-use-chrome-inspector-to-inspect-input-fields","How to use Chrome Inspector to inspect input fields",[11,2313,2314],{},"To create custom CSS selectors, we need to inspect the code. Chrome provides a built-in tool that makes this easy: Chrome DevTools. Here’s how to use it:",[187,2316,2317,2320,2323],{},[190,2318,2319],{},"Open Chrome Inspector - Right-click on the element you want to inspect and select \"Inspect\" from the menu. This will open Chrome DevTools, with the element’s code highlighted.",[190,2321,2322],{},"Select the Inspector Tool - If DevTools is already open, click the cursor icon in the top-left corner of the panel. This tool allows you to hover over elements on the page to inspect them.",[190,2324,2325],{},"Find the Code - Hover over an input field (or any element) to see its structure. Click on it to freeze the selection in DevTools. The corresponding HTML and CSS will appear in the Elements tab, where you can copy the element’s selector or make edits in the Styles panel.",[11,2327,2328],{},"You can find the opening tag and identify its attributes on any webpage.",[63,2330,2332],{"id":2331},"when-you-may-need-to-use-a-custom-selector-in-axiomai","When you may need to use a custom selector in axiom.ai",[11,2334,2335],{},"I do test runs when automating forms, observing the bot every 4-5 steps added. I do this to check for errors. The error I look for is \"Element not found.\" This means the element has not been found on the page. If I see the element on the page during the run, I then know it's an issue with the CSS sector being used to locate that element.",[11,2337,2338,2339,2343],{},"I will then reselect and run again. If that fails, I fall back to a ",[39,2340,2342],{"href":2341},"\u002Fblog\u002Fbest-custom-css-selectors-for-web-scraping","custom CSS selector",". Now, no worries if you're a new user and stuck at that point. Keep reading, as I will teach you.",[63,2345,2347],{"id":2346},"how-to-use-a-custom-selector-in-axiomai","How to use a custom selector in axiom.ai",[11,2349,2350,2351,2355,2356,2360,2361,2365],{},"Now, in axiom.ai, we have a no-code selector tool with advanced algorithms that automatically determine selectors for you 99% of the time. You can point and click to select elements. We offer a ",[39,2352,2354],{"href":2353},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fsingle","Single-selector tool"," for interacting with elements and a ",[39,2357,2359],{"href":2358},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fmulti","Multi-selector tool"," for ",[39,2362,2364],{"href":2363},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data","scraping data",". Custom selectors can be used with both tools and in both cases, you can select elements by pointing and clicking.",[11,2367,2368],{},"How to use a custom selector in the single selector tool:",[187,2370,2371,2374,2377,2380],{},[190,2372,2373],{},"Click Select to open the no-code selector tool.",[190,2375,2376],{},"Click Custom, then enter your selector in the text field.",[190,2378,2379],{},"If the selector finds the element, it will be highlighted.",[190,2381,2382,2383,2386],{},"Use Chrome Inspector to check if the class ",[714,2384,2385],{},"axiom-selected"," has been applied to the selected element.",[63,2388,2390],{"id":2389},"do-not-use-these-types-of-selectors","Do not use these types of selectors",[11,2392,2393],{},"Notably, there are CSS selectors you should avoid.",[708,2395,2397],{"className":2033,"code":2396,"language":2035,"meta":2036,"style":15},"\u003Cinput aria-label=\"Search input\" autocapitalize=\"none\" class=\"x1lugfcp x1hmx34t x1lq5wgf xgqcy7u x30kzoy x9jhf4c x972fbf xcfux6l x1qhh985 xm0m39n x9f619 x5n08af xl565be x5yr21d x1a2a7pz xyqdw3p x1pi30zi xg8j3zb x1swvt13 x1yc453h xh8yej3 xhtitgo xs3hnx8 x1dbmdqj xoy4bel x7xwk5j\" dir=\"\" placeholder=\"Search\" type=\"text\" value=\"\">\n",[714,2398,2399],{"__ignoreMap":15},[236,2400,2401,2403,2405,2408,2410,2413,2416,2418,2421,2423,2425,2428,2431,2433,2435,2437,2439,2442,2445,2447,2450,2452,2454,2456],{"class":718,"line":719},[236,2402,2043],{"class":736},[236,2404,2047],{"class":2046},[236,2406,2407],{"class":726}," aria-label",[236,2409,2053],{"class":736},[236,2411,2412],{"class":752},"\"Search input\"",[236,2414,2415],{"class":726}," autocapitalize",[236,2417,2053],{"class":736},[236,2419,2420],{"class":752},"\"none\"",[236,2422,2131],{"class":726},[236,2424,2053],{"class":736},[236,2426,2427],{"class":752},"\"x1lugfcp x1hmx34t x1lq5wgf xgqcy7u x30kzoy x9jhf4c x972fbf xcfux6l x1qhh985 xm0m39n x9f619 x5n08af xl565be x5yr21d x1a2a7pz xyqdw3p x1pi30zi xg8j3zb x1swvt13 x1yc453h xh8yej3 xhtitgo xs3hnx8 x1dbmdqj xoy4bel x7xwk5j\"",[236,2429,2430],{"class":726}," dir",[236,2432,2053],{"class":736},[236,2434,2056],{"class":752},[236,2436,2115],{"class":726},[236,2438,2053],{"class":736},[236,2440,2441],{"class":752},"\"Search\"",[236,2443,2444],{"class":726}," type",[236,2446,2053],{"class":736},[236,2448,2449],{"class":752},"\"text\"",[236,2451,2139],{"class":726},[236,2453,2053],{"class":736},[236,2455,2056],{"class":752},[236,2457,2186],{"class":736},[11,2459,2460,2461,2464],{},"In this example, you can see what appear to be random combinations of numbers and letters in the class tag, for example, ",[714,2462,2463],{},"xs3hnx8",". These are obfuscated CSS classes, meaning they change and will differ each time the bot runs.",[11,2466,2467],{},"As a rule of thumb, I avoid using classes unless they are clearly unique and relevant to the input, such as 'search-field`.",[63,2469,2471],{"id":2470},"how-i-formulate-custom-css-selectors","How I formulate custom css selectors",[11,2473,2474],{},"First, I create a unique selector using attributes from the input field. I use the Chrome inspector to compare other inputs and identify unique attributes. This approach works well, but what if there isn't a unique selector?",[11,2476,2477,2478,13],{},"In that case, I work backwards from the input field up the DOM Tree. All elements are connected, just like a family tree. I look at the parent elements of my input field and identify unique selectors on them to create a ",[39,2479,2481],{"href":2480},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fcustom-css-selectors","custom selector",[63,2483,2485],{"id":2484},"first-try-to-identify-a-unique-selector","First, try to identify a unique selector",[11,2487,2488],{},"Inspect your input field and examine the attributes.",[708,2490,2491],{"className":2033,"code":2034,"language":2035,"meta":2036,"style":15},[714,2492,2493],{"__ignoreMap":15},[236,2494,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541,2543,2545,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599,2601],{"class":718,"line":719},[236,2496,2043],{"class":736},[236,2498,2047],{"class":2046},[236,2500,2050],{"class":726},[236,2502,2053],{"class":736},[236,2504,2056],{"class":752},[236,2506,2059],{"class":726},[236,2508,2053],{"class":736},[236,2510,2064],{"class":752},[236,2512,2067],{"class":726},[236,2514,2053],{"class":736},[236,2516,2072],{"class":752},[236,2518,2075],{"class":726},[236,2520,2053],{"class":736},[236,2522,2080],{"class":752},[236,2524,2083],{"class":726},[236,2526,2053],{"class":736},[236,2528,2088],{"class":752},[236,2530,2091],{"class":726},[236,2532,2053],{"class":736},[236,2534,2096],{"class":752},[236,2536,2099],{"class":726},[236,2538,2053],{"class":736},[236,2540,2104],{"class":752},[236,2542,2107],{"class":726},[236,2544,2053],{"class":736},[236,2546,2112],{"class":752},[236,2548,2115],{"class":726},[236,2550,2053],{"class":736},[236,2552,2120],{"class":752},[236,2554,2123],{"class":726},[236,2556,2053],{"class":736},[236,2558,2128],{"class":752},[236,2560,2131],{"class":726},[236,2562,2053],{"class":736},[236,2564,2136],{"class":752},[236,2566,2139],{"class":726},[236,2568,2053],{"class":736},[236,2570,2056],{"class":752},[236,2572,2146],{"class":736},[236,2574,2149],{"class":2046},[236,2576,2152],{"class":726},[236,2578,2053],{"class":736},[236,2580,2157],{"class":752},[236,2582,2099],{"class":726},[236,2584,2053],{"class":736},[236,2586,2164],{"class":752},[236,2588,2167],{"class":726},[236,2590,2053],{"class":736},[236,2592,2172],{"class":752},[236,2594,2175],{"class":736},[236,2596,2149],{"class":2046},[236,2598,2180],{"class":736},[236,2600,2047],{"class":2183},[236,2602,2186],{"class":736},[11,2604,2605],{},"Inspect your input field and examine its attributes.",[187,2607,2608,2622,2633],{},[190,2609,2610,2611,2614,2615,2618,2619,13],{},"First, I look for an ",[714,2612,2613],{},"id="," attribute. The ",[714,2616,2617],{},"id"," tag is unique to the element nine times out of ten. I can use it like this: ",[714,2620,2621],{},"#searchInput",[190,2623,2624,2625,2628,2629,2632],{},"Next, I check the ",[714,2626,2627],{},"placeholder"," attribute. The text that appears inside an input field is often unique. I can use it like this: ",[714,2630,2631],{},"[placeholder=\"Search the BBC\"]"," (inside square brackets).",[190,2634,2635,2636,13],{},"You may want to try a combination of attributes: ",[714,2637,2638],{},"[id=\"searchInput\"][placeholder=\"Search the BBC\"]",[11,2640,2641,2642,2645],{},"I would not use these classes: ",[714,2643,2644],{},"class=\"ssrcss-199fsd8-StyledInput e1ld3nu72\"",". They are obfuscated and will likely change each time the page loads.",[63,2647,2649],{"id":2648},"if-required-traverse-the-dom-to-find-a-unique-combination","If required, traverse the DOM to find a unique combination",[11,2651,2652],{},"If you cannot find a unique selector, we go back up the tree using the Inspector tool.",[11,2654,2655],{},"What does that mean? Simply put, it means inspecting other elements that wrap around the input. We identify attributes on those elements that can be combined to construct a unique selector.",[11,2657,2658],{},"It's important to note that the input must be a child of the element you've traversed, or the selector will not work. Being a child means the input is nested inside another element, creating a selector hierarchy in the DOM tree that we can leverage.",[11,2660,2661,2662,2665,2666,2669,2670,13],{},"For example, I inspect an input and extract this attribute:   ",[714,2663,2664],{},"[\"aria-label=\"To recipients\"]",";  I observe that this attribute also appears on other inputs and is not unique. So, I traverse the DOM further. I identify a parent element in which the input is nested in a ",[714,2667,2668],{},"form"," with the attribute ",[714,2671,2672],{},"method=\"POST\"",[11,2674,2675],{},"If I combine what I have observed, I can create a unique selector. This would be my selector:",[11,2677,2678],{},[714,2679,2680],{},"form[method=\"POST] [\"aria-label=\"To recipients\"]",[11,2682,2683],{},"First, I add the parent element and its attribute selector. Then, after a space, I add the input attribute.",[11,2685,2686],{},"Creating combinations like this using hierarchy allows you to quickly construct unique selectors for most elements.",[63,2688,2690],{"id":2689},"real-world-examples","Real-world examples",[11,2692,2693],{},"Here are some real-world examples where I've had to use a custom selector.",[129,2695,2696],{"id":585},"Instagram",[11,2698,2699,2700,2703],{},"This is a comment box on an Instagram post that opens in a dialog. Inspecting the element, I found a unique attribute I could use. However, I observed multiple comment boxes loaded on the page, and my supposed unique attribute  ",[714,2701,2702],{},"[aria-label=\"Add a comment…\"]"," was not unique, as it appeared in multiple comment boxes.",[708,2705,2707],{"className":2033,"code":2706,"language":2035,"meta":2036,"style":15},"\u003Ctextarea aria-label=\"Add a comment…\" placeholder=\"Add a comment…\" autocomplete=\"off\" autocorrect=\"off\" class=\"x1i0vuye xvbhtw8 x1ejq31n xd10rxx x1sy0etr x17r0tee x5n08af x78zum5 x1iyjqo2 x1qlqyl8 x1d6elog xlk1fp6 x1a2a7pz xexx8yu x4uap5 x18d9i69 xkhd6sd xtt52l0 xnalus7 xs3hnx8 x1bq4at4 xaqnwrm\" dir=\"\" style=\"height: 18px !important;\">\u003C\u002Ftextarea>\n",[714,2708,2709],{"__ignoreMap":15},[236,2710,2711,2713,2716,2718,2720,2723,2725,2727,2729,2731,2733,2735,2738,2740,2742,2744,2746,2749,2751,2753,2755,2757,2759,2762,2764,2766],{"class":718,"line":719},[236,2712,2043],{"class":736},[236,2714,2715],{"class":2046},"textarea",[236,2717,2407],{"class":726},[236,2719,2053],{"class":736},[236,2721,2722],{"class":752},"\"Add a comment…\"",[236,2724,2115],{"class":726},[236,2726,2053],{"class":736},[236,2728,2722],{"class":752},[236,2730,2091],{"class":726},[236,2732,2053],{"class":736},[236,2734,2096],{"class":752},[236,2736,2737],{"class":726}," autocorrect",[236,2739,2053],{"class":736},[236,2741,2096],{"class":752},[236,2743,2131],{"class":726},[236,2745,2053],{"class":736},[236,2747,2748],{"class":752},"\"x1i0vuye xvbhtw8 x1ejq31n xd10rxx x1sy0etr x17r0tee x5n08af x78zum5 x1iyjqo2 x1qlqyl8 x1d6elog xlk1fp6 x1a2a7pz xexx8yu x4uap5 x18d9i69 xkhd6sd xtt52l0 xnalus7 xs3hnx8 x1bq4at4 xaqnwrm\"",[236,2750,2430],{"class":726},[236,2752,2053],{"class":736},[236,2754,2056],{"class":752},[236,2756,2167],{"class":726},[236,2758,2053],{"class":736},[236,2760,2761],{"class":752},"\"height: 18px !important;\"",[236,2763,2180],{"class":736},[236,2765,2715],{"class":2046},[236,2767,2186],{"class":736},[11,2769,2770],{},"The solution was to traverse the DOM. I observed that the input was inside a dialog pop-up, which made it unique. So, I formulated this selector using the grandparent element's attribute:",[11,2772,2773],{},[714,2774,2775],{},"[role=\"dialog\"] [aria-label=\"Add a comment…\"]",[129,2777,2779],{"id":2778},"cerebro","Cerebro",[11,2781,2782,2783,2786],{},"In Cerebro's filters, I observed that the filter inputs had no specific attributes I could target. For example, the ",[714,2784,2785],{},"placeholder=\" min\""," attribute was repeated eight times, making it unreliable for selection.",[708,2788,2790],{"className":2033,"code":2789,"language":2035,"meta":2036,"style":15},"\u003Cinput data-testid=\"wordcount\" type=\"number\" placeholder=\"Min\" min=\"0\" class=\"sc-hIPBNq sc-jnbAOD eYtKDj\" value=\"\">\n",[714,2791,2792],{"__ignoreMap":15},[236,2793,2794,2796,2798,2801,2803,2806,2808,2810,2813,2815,2817,2820,2823,2825,2828,2830,2832,2835,2837,2839,2841],{"class":718,"line":719},[236,2795,2043],{"class":736},[236,2797,2047],{"class":2046},[236,2799,2800],{"class":726}," data-testid",[236,2802,2053],{"class":736},[236,2804,2805],{"class":752},"\"wordcount\"",[236,2807,2444],{"class":726},[236,2809,2053],{"class":736},[236,2811,2812],{"class":752},"\"number\"",[236,2814,2115],{"class":726},[236,2816,2053],{"class":736},[236,2818,2819],{"class":752},"\"Min\"",[236,2821,2822],{"class":726}," min",[236,2824,2053],{"class":736},[236,2826,2827],{"class":752},"\"0\"",[236,2829,2131],{"class":726},[236,2831,2053],{"class":736},[236,2833,2834],{"class":752},"\"sc-hIPBNq sc-jnbAOD eYtKDj\"",[236,2836,2139],{"class":726},[236,2838,2053],{"class":736},[236,2840,2056],{"class":752},[236,2842,2186],{"class":736},[11,2844,2845],{},"Of course, the solution was to traverse the DOM and inspect the parent elements using Chrome Inspector. However, I could still not use unique attributes. Instead, I needed to rely on hierarchy, which is how the elements are ordered.",[11,2847,2848],{},"First, I found the form ID:",[11,2850,2851],{},[714,2852,2853],{},"id=\"CerebroFilterContent\"",[11,2855,2856],{},"This gave me a starting point. Then, I observed that the children of this element were structured to organize the form inputs. This meant I could use the child relationship to target the correct input.",[11,2858,2859],{},"My selector looked like this:",[11,2861,2862],{},[714,2863,2864],{},"#CerebroFilterContent div:nth-child(2) input[placeholder=\"min\"]",[11,2866,2867,2868,2871,2872,13],{},"This selector targets the second child div within ",[714,2869,2870],{},"#CerebroFilterContent"," and selects the input with the attribute ",[714,2873,2874],{},"placeholder=\"Min\"",[63,2876,2878],{"id":2877},"wrapping-up","Wrapping up",[11,2880,2881],{},"Creating custom CSS selectors might seem daunting if you're new to automation. But with some practice, you'll quickly get the hang of it.",[11,2883,2884],{},"By learning to inspect elements in Chrome DevTools, identify valuable attributes, and avoid unreliable selectors, you're building skills to make your automation more reliable. axiom.ai's no-code selector tool does most of the work, but knowing how to find the correct selector gives you confidence and control when things don't go as expected.",[11,2886,2887],{},"Don't worry about getting it perfect the first time. Try inspecting an input field, test different selectors, and see what works. The more you practice, the easier it becomes.",[11,2889,2890],{},"If you get stuck, we are, of course, here to help. Reach out via Reddit with questions or support for subscribers.",[802,2892,2893],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sZcZs, html code.shiki .sZcZs{--shiki-default:#82071E;--shiki-default-font-style:italic;--shiki-dark:#FFA198;--shiki-dark-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":15,"searchDepth":16,"depth":16,"links":2895},[2896,2897,2898,2899,2900,2901,2902,2903,2904,2908],{"id":2023,"depth":542,"text":2024},{"id":2310,"depth":542,"text":2311},{"id":2331,"depth":542,"text":2332},{"id":2346,"depth":542,"text":2347},{"id":2389,"depth":542,"text":2390},{"id":2470,"depth":542,"text":2471},{"id":2484,"depth":542,"text":2485},{"id":2648,"depth":542,"text":2649},{"id":2689,"depth":542,"text":2690,"children":2905},[2906,2907],{"id":585,"depth":16,"text":2696},{"id":2778,"depth":16,"text":2779},{"id":2877,"depth":542,"text":2878},"2025-03-19","Learn how to create custom selectors to target inputs",{"read":2912,"type":578,"tool":2913,"category":2914,"tags":2916,"location":587,"featuredimg":2921,"landingimg":2922,"content_type":2923,"layout":2924,"summary":2910,"video":18,"metaTitle":2925},"17 min read",[580],[2915],"Form automation",[2047,2917,2918,2919,2920],"input field","text fields","forms","css selectors","\u002Fform-input-master-post.webp","\u002Fform-input-master-sq.webp","blog","Guide","Custom selectors for input fields.","\u002Fblog\u002Finput-fields",{"title":1988,"description":2910},"blog\u002Finput-fields","TaT_GpoOkV9BcyP9_jR5LeqWocTxUQHfgHJQNvlQ1tk",{"id":2931,"title":2932,"author":23,"body":2933,"date":3585,"description":3586,"draft":575,"extension":19,"meta":3587,"navigation":24,"path":3599,"seo":3600,"stem":3601,"__hash__":3602},"blog\u002Fblog\u002Fextract-selectors-chagtgpt.md","Can ChatGPT help me extract CSS selectors?",{"type":8,"value":2934,"toc":3568},[2935,2943,2946,2949,2952,2955,2958,2961,2965,2971,2979,3034,3037,3040,3044,3047,3050,3054,3057,3086,3093,3097,3100,3103,3106,3109,3112,3166,3169,3172,3176,3179,3181,3184,3187,3190,3193,3291,3294,3303,3310,3314,3317,3367,3373,3376,3379,3393,3396,3400,3403,3406,3409,3412,3416,3540,3543,3547,3550,3553,3556,3559,3562,3565],[11,2936,2937,2938,2942],{},"I want to test if ",[39,2939,2941],{"href":2940},"\u002Fchatgpt","ChatGPT"," can extract CSS selectors from HTML. When I first tried this, it wasn't possible, but with the new models, it might be. Let's find out. How much prompt crafting will it take?",[11,2944,2945],{},"When scraping the web or automating a browser, I sometimes need to create a custom CSS selector to locate an element on the page. I usually use Google Chrome's inspector to examine the code and identify a unique selector—a process that takes just a few minutes.",[11,2947,2948],{},"I'm excited to see how ChatGPT performs. How detailed will my prompts need to be? Will ChatGPT understand how to create a unique selector while avoiding pitfalls like obfuscated CSS classes?",[11,2950,2951],{},"I'm going to test this with real-world selector challenges I've encountered. I'll start with a simple prompt: can ChatGPT solve the problem without guidance?",[11,2953,2954],{},"For clarity, I don't just want ChatGPT to generate a CSS selector—I want it to be unique to the element. I'm curious to see how ChatGPT achieves that and what the results will be.",[11,2956,2957],{},"Does ChatGPT understand the hierarchy of selectors?\nWill it be able to leverage other types of selectors?\nWill ChatGPT know what I mean by a unique selector?\nI'm Alex Barlow, co-founder of Axiom. Let's dive in.",[11,2959,2960],{},"The first model I'll test is GPT-4-turbo-03-mini, as it allows me to paste a full page of HTML into the web UI. However, my gut tells me the reasoning could be total overkill, leading to funky results.",[63,2962,2964],{"id":2963},"how-i-will-conduct-my-css-experiments-with-ai-and-chatgpt","How I will conduct my CSS experiments with AI and ChatGPT",[11,2966,2967,2968,2970],{},"I aim to determine whether ChatGPT can generate a unique ",[39,2969,1525],{"href":2341}," for an element within an HTML page. I will be testing ChatGPT and a few of its recent models. I will provide:",[187,2972,2973,2976],{},[190,2974,2975],{},"The entire HTML of the page.",[190,2977,2978],{},"I want a unique css selector to locate the element shown below.",[708,2980,2982],{"className":2033,"code":2981,"language":2035,"meta":15,"style":15},"\u003Cinput data-testid=\"wordcount\" type=\"number\" placeholder=\"Max\" min=\"0\" class=\"sc-csKJxZ sc-dsAqUS dQSMvU\" value=\"\">\u003C\u002Finput>\n",[714,2983,2984],{"__ignoreMap":15},[236,2985,2986,2988,2990,2992,2994,2996,2998,3000,3002,3004,3006,3009,3011,3013,3015,3017,3019,3022,3024,3026,3028,3030,3032],{"class":718,"line":719},[236,2987,2043],{"class":736},[236,2989,2047],{"class":2046},[236,2991,2800],{"class":726},[236,2993,2053],{"class":736},[236,2995,2805],{"class":752},[236,2997,2444],{"class":726},[236,2999,2053],{"class":736},[236,3001,2812],{"class":752},[236,3003,2115],{"class":726},[236,3005,2053],{"class":736},[236,3007,3008],{"class":752},"\"Max\"",[236,3010,2822],{"class":726},[236,3012,2053],{"class":736},[236,3014,2827],{"class":752},[236,3016,2131],{"class":726},[236,3018,2053],{"class":736},[236,3020,3021],{"class":752},"\"sc-csKJxZ sc-dsAqUS dQSMvU\"",[236,3023,2139],{"class":726},[236,3025,2053],{"class":736},[236,3027,2056],{"class":752},[236,3029,2180],{"class":736},[236,3031,2047],{"class":2183},[236,3033,2186],{"class":736},[11,3035,3036],{},"I will not share the full HTML of the page here; it's a whole page of code, and including it would not be practical. As for my prompts, I'll keep them simple to see how well AI can handle the task with minimal instruction.",[11,3038,3039],{},"I will also avoid including ChatGPT's response word-for-word in the post; I fear that would make the longest blog post in the world.",[63,3041,3043],{"id":3042},"experiment-1-minimal-guidance","Experiment 1: Minimal guidance",[11,3045,3046],{},"We want AI to perform tasks without needing a long list of instructions. For my first experiment, I kept it simple with a short prompt.",[11,3048,3049],{},":: prompt ChatGPT Prompt\nCan you find a unique CSS selector for this element (I inserted the elements HTML)\nFrom this HTML (I inserted the HTML)\n::",[129,3051,3053],{"id":3052},"the-result","The result",[11,3055,3056],{},"Well, first off, it didn't produce a unique selector. Instead, the response was a lengthy explanation covering CSS selectors, JavaScript, and XPath. None of which I asked for. After nudging it, ChatGPT quickly generated a selector for me:",[708,3058,3062],{"className":3059,"code":3060,"language":3061,"meta":15,"style":15},"language-CSS shiki shiki-themes github-light-default github-dark-default","\u002F* This is the unique selector recommended by ChatGPT *\u002F\ninput[data-testid=\"wordcount\"]\n","CSS",[714,3063,3064,3069],{"__ignoreMap":15},[236,3065,3066],{"class":718,"line":719},[236,3067,3068],{"class":946},"\u002F* This is the unique selector recommended by ChatGPT *\u002F\n",[236,3070,3071,3073,3076,3079,3081,3083],{"class":718,"line":542},[236,3072,2047],{"class":2046},[236,3074,3075],{"class":736},"[",[236,3077,3078],{"class":726},"data-testid",[236,3080,2053],{"class":722},[236,3082,2805],{"class":752},[236,3084,3085],{"class":736},"]\n",[11,3087,3088,3089,3092],{},"ChatGPT claimed the selector was unique. However, after inspecting the HTML, I discovered there were two inputs with that selector: `input",[236,3090,3091],{},"data-testid=\"wordcount\"",". Additionally, I would avoid using the data-testid attribute as it originates from testing code and could be removed.",[63,3094,3096],{"id":3095},"experiment-2-minimal-guidance-with-some-instruction","Experiment 2: Minimal guidance with some instruction",[11,3098,3099],{},"I Make minimal changes to the prompt. Keep in mind that this is a short task, and AI must be worth it. I don't want to spend hours prompt writing.",[11,3101,3102],{},":: prompt ChatGPT Prompt",[11,3104,3105],{},"Can you find a unique CSS selector for this element (Element HTML)\nFrom this HTML (I insert the HTML).",[11,3107,3108],{},"I want a unique selector without using data-testid=\"wordcount\" or any other data-testid attributes.\n::",[129,3110,3053],{"id":3111},"the-result-1",[708,3113,3115],{"className":3059,"code":3114,"language":3061,"meta":15,"style":15},"\u002F* Option one - element with 3 attributes *\u002F\ninput[type=\"number\"][placeholder=\"Min\"][min=\"0\"]\n\u002F* Option one - 3 css classes *\u002F\ninput.sc-csKJxZ.sc-dsAqUS.dQSMvU\n",[714,3116,3117,3122,3154,3159],{"__ignoreMap":15},[236,3118,3119],{"class":718,"line":719},[236,3120,3121],{"class":946},"\u002F* Option one - element with 3 attributes *\u002F\n",[236,3123,3124,3126,3128,3130,3132,3134,3137,3139,3141,3143,3145,3148,3150,3152],{"class":718,"line":542},[236,3125,2047],{"class":2046},[236,3127,3075],{"class":736},[236,3129,1104],{"class":726},[236,3131,2053],{"class":722},[236,3133,2812],{"class":752},[236,3135,3136],{"class":736},"][",[236,3138,2627],{"class":726},[236,3140,2053],{"class":722},[236,3142,2819],{"class":752},[236,3144,3136],{"class":736},[236,3146,3147],{"class":726},"min",[236,3149,2053],{"class":722},[236,3151,2827],{"class":752},[236,3153,3085],{"class":736},[236,3155,3156],{"class":718,"line":16},[236,3157,3158],{"class":946},"\u002F* Option one - 3 css classes *\u002F\n",[236,3160,3161,3163],{"class":718,"line":571},[236,3162,2047],{"class":2046},[236,3164,3165],{"class":726},".sc-csKJxZ.sc-dsAqUS.dQSMvU\n",[11,3167,3168],{},"ChatGPT states, \"Either approach will give you a unique CSS selector without relying on data-testid attributes.\"",[11,3170,3171],{},"When manually checking the HTML, I found that the first solution was not unique because other inputs shared the exact attributes. The second suggestion used obfuscated CSS classes that could change periodically, causing the selector to break. I do not recommend doing that! I will make sure to mention this explicitly in my following prompt.",[63,3173,3175],{"id":3174},"experiment-3-expanding-the-prompt-using-the-console-to-validate-results","Experiment 3:  Expanding the prompt using the console to validate results",[3177,3178],"hr",{},[11,3180,3102],{},[11,3182,3183],{},"Can you find a unique CSS selector for this element (Element HTML)\nFrom this HTML (I inserted the HTML).",[11,3185,3186],{},"I want a unique selector without using data-testid=\"wordcount\" or any other data-testid attributes. In addition to not use CSS classes when obviously obfuscated.\n::",[129,3188,3053],{"id":3189},"the-result-2",[11,3191,3192],{},"ChatGPT turned its attention to using absolute paths, which is excellent. I recommend this approach when solving selector riddles. Nice work! Or was it?",[708,3194,3198],{"className":3195,"code":3196,"language":3197,"meta":15,"style":15},"language-css shiki shiki-themes github-light-default github-dark-default","\u002F* This is a single-line comment *\u002F\n#container form input[type=\"number\"]:nth-of-type(2)\n\u002F* This is a single-line comment *\u002F\nhtml > body > div:nth-child(1) > form:nth-child(1) > input:nth-of-type(2)\n","css",[714,3199,3200,3205,3237,3241],{"__ignoreMap":15},[236,3201,3202],{"class":718,"line":719},[236,3203,3204],{"class":946},"\u002F* This is a single-line comment *\u002F\n",[236,3206,3207,3210,3213,3216,3218,3220,3222,3224,3227,3230,3232,3235],{"class":718,"line":542},[236,3208,3209],{"class":726},"#container",[236,3211,3212],{"class":2046}," form",[236,3214,3215],{"class":2046}," input",[236,3217,3075],{"class":736},[236,3219,1104],{"class":726},[236,3221,2053],{"class":722},[236,3223,2812],{"class":752},[236,3225,3226],{"class":736},"]",[236,3228,3229],{"class":726},":nth-of-type",[236,3231,1031],{"class":736},[236,3233,3234],{"class":726},"2",[236,3236,1037],{"class":736},[236,3238,3239],{"class":718,"line":16},[236,3240,3204],{"class":946},[236,3242,3243,3245,3248,3251,3253,3256,3259,3261,3264,3267,3269,3271,3273,3275,3277,3279,3281,3283,3285,3287,3289],{"class":718,"line":571},[236,3244,2035],{"class":2046},[236,3246,3247],{"class":722}," >",[236,3249,3250],{"class":2046}," body",[236,3252,3247],{"class":722},[236,3254,3255],{"class":2046}," div",[236,3257,3258],{"class":726},":nth-child",[236,3260,1031],{"class":736},[236,3262,3263],{"class":726},"1",[236,3265,3266],{"class":736},") ",[236,3268,2199],{"class":722},[236,3270,3212],{"class":2046},[236,3272,3258],{"class":726},[236,3274,1031],{"class":736},[236,3276,3263],{"class":726},[236,3278,3266],{"class":736},[236,3280,2199],{"class":722},[236,3282,3215],{"class":2046},[236,3284,3229],{"class":726},[236,3286,1031],{"class":736},[236,3288,3234],{"class":726},[236,3290,1037],{"class":736},[11,3292,3293],{},"I was excited by the results, so I didn't just manually check them—I validated them using the Console in Chrome Tools:",[708,3295,3297],{"className":2033,"code":3296,"language":2035,"meta":923,"style":15},"document.querySelector('html > body > div:nth-child(1) > form:nth-child(1) > input:nth-of-type(2)')\n",[714,3298,3299],{"__ignoreMap":15},[236,3300,3301],{"class":718,"line":719},[236,3302,3296],{"class":736},[11,3304,3305,3306,3309],{},"When I checked in the console, the selectors failed validation. When I checked the HTML, they were completely incorrect. The selector ",[714,3307,3308],{},"form input[type=\"number\"]:nth-of-type(2)"," was misusing nth-of-type, and it wasn't even close to accurate. Something had gone astray, or some AI.",[63,3311,3313],{"id":3312},"a-dead-end","A dead end",[11,3315,3316],{},"I started to wonder why the selectors were so inaccurate. The structure didn't match the HTML at all. But why? I asked the AI to recheck the HTML. After restructuring the prompt several times and providing both the element and HTML snippet again, the AI obliged and returned a few results.",[708,3318,3320],{"className":3195,"code":3319,"language":3197,"meta":15,"style":15},"form#myForm > div:nth-child(2) > div:nth-child(1) > input[placeholder=\"Max\"]\n",[714,3321,3322],{"__ignoreMap":15},[236,3323,3324,3326,3329,3331,3333,3335,3337,3339,3341,3343,3345,3347,3349,3351,3353,3355,3357,3359,3361,3363,3365],{"class":718,"line":719},[236,3325,2668],{"class":2046},[236,3327,3328],{"class":726},"#myForm",[236,3330,3247],{"class":722},[236,3332,3255],{"class":2046},[236,3334,3258],{"class":726},[236,3336,1031],{"class":736},[236,3338,3234],{"class":726},[236,3340,3266],{"class":736},[236,3342,2199],{"class":722},[236,3344,3255],{"class":2046},[236,3346,3258],{"class":726},[236,3348,1031],{"class":736},[236,3350,3263],{"class":726},[236,3352,3266],{"class":736},[236,3354,2199],{"class":722},[236,3356,3215],{"class":2046},[236,3358,3075],{"class":736},[236,3360,2627],{"class":726},[236,3362,2053],{"class":722},[236,3364,3008],{"class":752},[236,3366,3085],{"class":736},[11,3368,3369,3370,3372],{},"However, it used this ID selector: ",[714,3371,3328],{},". The issue was that this ID wasn't part of the HTML I provided. I asked ChatGPT to show me the HTML it used to generate the selector. It obliged, revealing it wasn't using the HTML snippet I gave it—it had invented its example form. I'd reached a dead end; the AI was confused and hallucinating.",[11,3374,3375],{},"That's enough—time to start again in a fresh window.",[11,3377,3378],{},"It kept forgetting the HTML snippet I shared.",[187,3380,3381,3384,3390],{},[190,3382,3383],{},"It started using its own basic form example.",[190,3385,3386,3387,3389],{},"It invented an ID (",[714,3388,3328],{},") that didn’t exist.",[190,3391,3392],{},"Its reasoning meant every prompt adjustment caused it to reevaluate moving further away from the solution.",[11,3394,3395],{},"The reasoning model was completely the wrong choice. It tends to go off the rails, making leaps when I needed incremental improvements.",[63,3397,3399],{"id":3398},"experiment-5-one-last-go-with-chatgpt-40-model","Experiment 5: One last go with ChatGPT 4.0 model",[11,3401,3402],{},"I didn't use this model first because of its character limit—I can't share the entire HTML page with the AI to work out its solution fully. Starting from scratch:",[11,3404,3405],{},":: prompt ChatGPT prompt\nConstruct a unique CSS selector:",[11,3407,3408],{},"Start with the Form ID in the HTML form element containing the input.\nUse document hierarchy from the form to the input, applying nth-child for each div.",[11,3410,3411],{},"For the input element, use an attribute selector.\nDo not use classes or attributes starting with data-test.\n::",[129,3413,3415],{"id":3414},"result","Result",[708,3417,3419],{"className":3195,"code":3418,"language":3197,"meta":15,"style":15},"\u002F* This is a single-line comment *\u002F\n#CerebroFilter > div > div:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(2) > input[type=\"number\"][placeholder=\"Max\"]\n\u002F* This is a single-line comment *\u002F\n#CerebroFilter input[placeholder=\"Max\"]\n\u002F* This is a single-line comment *\u002F\n#CerebroFilter input[placeholder=\"Max\"][type=\"number\"]\n",[714,3420,3421,3425,3492,3496,3512,3516],{"__ignoreMap":15},[236,3422,3423],{"class":718,"line":719},[236,3424,3204],{"class":946},[236,3426,3427,3430,3432,3434,3436,3438,3440,3442,3444,3446,3448,3450,3452,3454,3456,3458,3460,3462,3464,3466,3468,3470,3472,3474,3476,3478,3480,3482,3484,3486,3488,3490],{"class":718,"line":542},[236,3428,3429],{"class":726},"#CerebroFilter",[236,3431,3247],{"class":722},[236,3433,3255],{"class":2046},[236,3435,3247],{"class":722},[236,3437,3255],{"class":2046},[236,3439,3229],{"class":726},[236,3441,1031],{"class":736},[236,3443,3234],{"class":726},[236,3445,3266],{"class":736},[236,3447,2199],{"class":722},[236,3449,3255],{"class":2046},[236,3451,3229],{"class":726},[236,3453,1031],{"class":736},[236,3455,3263],{"class":726},[236,3457,3266],{"class":736},[236,3459,2199],{"class":722},[236,3461,3255],{"class":2046},[236,3463,3229],{"class":726},[236,3465,1031],{"class":736},[236,3467,3234],{"class":726},[236,3469,3266],{"class":736},[236,3471,2199],{"class":722},[236,3473,3215],{"class":2046},[236,3475,3075],{"class":736},[236,3477,1104],{"class":726},[236,3479,2053],{"class":722},[236,3481,2812],{"class":752},[236,3483,3136],{"class":736},[236,3485,2627],{"class":726},[236,3487,2053],{"class":722},[236,3489,3008],{"class":752},[236,3491,3085],{"class":736},[236,3493,3494],{"class":718,"line":16},[236,3495,3204],{"class":946},[236,3497,3498,3500,3502,3504,3506,3508,3510],{"class":718,"line":571},[236,3499,3429],{"class":726},[236,3501,3215],{"class":2046},[236,3503,3075],{"class":736},[236,3505,2627],{"class":726},[236,3507,2053],{"class":722},[236,3509,3008],{"class":752},[236,3511,3085],{"class":736},[236,3513,3514],{"class":718,"line":961},[236,3515,3204],{"class":946},[236,3517,3518,3520,3522,3524,3526,3528,3530,3532,3534,3536,3538],{"class":718,"line":982},[236,3519,3429],{"class":726},[236,3521,3215],{"class":2046},[236,3523,3075],{"class":736},[236,3525,2627],{"class":726},[236,3527,2053],{"class":722},[236,3529,3008],{"class":752},[236,3531,3136],{"class":736},[236,3533,1104],{"class":726},[236,3535,2053],{"class":722},[236,3537,2812],{"class":752},[236,3539,3085],{"class":736},[11,3541,3542],{},"This time, the model is faster, and unlike the reasoning models, it extracts the correct form ID without an issue. But again, the selectors are not unique.",[63,3544,3546],{"id":3545},"wrapping-up-is-it-worth-using-ai-to-find-css-selectors","Wrapping up: Is it worth using AI to find CSS selectors?",[11,3548,3549],{},"My experiments showed that ChatGPT can quickly generate CSS selectors but struggles to produce unique ones. Early attempts resulted in selectors that weren't unique or depended on unstable attributes, such as testing-specific or obfuscated CSS classes.",[11,3551,3552],{},"When I added more instruction to the prompts, the results improved but required manual validation. More detailed prompts led to increasingly complex and incorrect selectors. Additionally, the model forgot the provided HTML context and created selectors based on imagined code structures.",[11,3554,3555],{},"Switching to the GPT-4.0 model showed better initial results. It successfully identified correct form IDs and structured the selectors logically. Yet even this improvement didn't fully guarantee unique selectors without manual verification.",[11,3557,3558],{},"The experiment wasn't a great success. It wasn't better than a human, so we're not likely to be replaced anytime soon. However, it has got me excited. With further prompt crafting, it could work well.",[11,3560,3561],{},"We plan to explore using AI to fix broken selectors in axiom.ai, which could be a fantastic application of ChatGPT or similar models. It certainly showed enough promise to warrant further exploration.",[11,3563,3564],{},"However, we must remember that if the AI starts inventing HTML forms, it could confuse users. So we'll approach this cautiously—with a healthy pinch of salt.",[802,3566,3567],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sZcZs, html code.shiki .sZcZs{--shiki-default:#82071E;--shiki-default-font-style:italic;--shiki-dark:#FFA198;--shiki-dark-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}",{"title":15,"searchDepth":16,"depth":16,"links":3569},[3570,3571,3574,3577,3580,3581,3584],{"id":2963,"depth":542,"text":2964},{"id":3042,"depth":542,"text":3043,"children":3572},[3573],{"id":3052,"depth":16,"text":3053},{"id":3095,"depth":542,"text":3096,"children":3575},[3576],{"id":3111,"depth":16,"text":3053},{"id":3174,"depth":542,"text":3175,"children":3578},[3579],{"id":3189,"depth":16,"text":3053},{"id":3312,"depth":542,"text":3313},{"id":3398,"depth":542,"text":3399,"children":3582},[3583],{"id":3414,"depth":16,"text":3415},{"id":3545,"depth":542,"text":3546},"2025-03-18","Explore how to utilise AI to extract CSS selectors",{"read":3588,"type":578,"tool":3589,"category":3590,"tags":3592,"featuredimg":3595,"landingimg":3596,"summary":3597,"video":18,"metaTitle":3598},"12 min read",[580],[3591],"Data extraction",[3593,2941,3594],"css selector","attribute selectors","\u002Fchat-gpt-css-selector-post-bocx.webp","\u002Fchat-gpt-css-selector-sq.webp","We test if ChatGPT can be used to generate unique CSS selectors","Extracting CSS selectors with AI","\u002Fblog\u002Fextract-selectors-chagtgpt",{"title":2932,"description":3586},"blog\u002Fextract-selectors-chagtgpt","kNY7BATVAkD0lfu4PSSz1sVylGSLxxCJNWaKXmn_8WI",{"id":3604,"title":3605,"author":23,"body":3606,"date":4747,"description":3610,"draft":575,"extension":19,"meta":4748,"navigation":24,"path":4758,"seo":4759,"stem":4760,"__hash__":4761},"blog\u002Fblog\u002Fblocking-resources.md","Speed up web scraping by blocking unnecessary resources",{"type":8,"value":3607,"toc":4723},[3608,3611,3614,3617,3625,3628,3631,3639,3642,3650,3654,3657,3700,3704,3707,3710,3760,3769,3773,3776,3779,3787,3791,3794,3803,3811,3814,3817,3821,3824,3827,3834,3837,3841,3844,3848,3851,3862,3869,3873,3876,3880,3886,3896,3899,3908,3923,3957,3961,3975,3979,3982,3985,4031,4034,4038,4045,4170,4174,4177,4180,4229,4232,4236,4239,4291,4294,4298,4396,4400,4403,4406,4508,4512,4515,4518,4529,4675,4679,4682,4688,4695,4698,4709,4712,4720],[11,3609,3610],{},"When scraping a website, you might wonder if blocking resources could speed things up. Running your scraper in headless mode skips rendering visual elements like CSS, images, and animations, making scraping faster. However, there's a catch: headless mode often triggers anti-bot measures like Cloudflare or CAPTCHAs, which can stop your scraper in its tracks.",[60,3612],{"alt":3613},"speed up web scraping by blocking resources",[11,3615,3616],{},"The idea of blocking resources is still valuable. You reduce bandwidth usage and improve loading times by skipping unnecessary assets such as images, videos, or ads. But is there a way to achieve this without relying solely on headless mode? Thankfully, yes!",[11,3618,3619,3620,3624],{},"With axiom.ai, you can use the ",[39,3621,3623],{"href":3622},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-javascript","JavaScript step"," to run JS directly in the browser or app. Puppeteer is a built-in dependency, meaning you can leverage its library of functions to optimize and control the browser.",[11,3626,3627],{},"As a no-coder, I had never tried blocking resources, let alone with code. However, with modern generative AI tools, no-coders like me can now generate working code, boosting our skills while having fun. So, I'm going to give it a go!",[11,3629,3630],{},"In this guide, I'll explore:",[187,3632,3633,3636],{},[190,3634,3635],{},"Using simple JavaScript and Puppeteer commands.",[190,3637,3638],{},"Blocking specific resources like images, videos, and JavaScript.",[11,3640,3641],{},"The goal? To learn handy new techniques to speed up web scraping while keeping it simple. We want to use as few lines of code as possible, so it's easy for no-coders like myself to copy and paste.",[11,3643,3644,3645,3649],{},"Have I used ",[39,3646,3648],{"href":3647},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fpuppeteer","Puppeteer"," before? Nope, never!",[63,3651,3653],{"id":3652},"what-resources-should-you-intercept","What resources should you intercept?",[11,3655,3656],{},"To speed up your scraping, consider intercepting the following resources. Videos and adverts are often the most significant contributors to slower performance and tracking apps.",[187,3658,3659,3665,3671,3677,3682,3688,3694],{},[190,3660,3661,3664],{},[49,3662,3663],{},"Videos",": These are bandwidth-heavy and often unnecessary for scraping.",[190,3666,3667,3670],{},[49,3668,3669],{},"Adverts",": Advertisements slow down loading times and unnecessarily consume resources.",[190,3672,3673,3676],{},[49,3674,3675],{},"Images",": Images can be blocked if you need text-based content.",[190,3678,3679,3681],{},[49,3680,3061],{},": You don’t need stylesheets for data scraping, but can you block them without causing issues?",[190,3683,3684,3687],{},[49,3685,3686],{},"Third-party tracking apps",": Analytics and tracking scripts can be safely blocked.",[190,3689,3690,3693],{},[49,3691,3692],{},"JavaScript",": Disabling JavaScript sometimes improves speed, but beware, many sites rely on JavaScript for core functionality.",[190,3695,3696,3699],{},[49,3697,3698],{},"Fonts",": Custom fonts add unnecessary weight to page loads and can be safely blocked.",[63,3701,3703],{"id":3702},"how-do-you-identify-resources-to-block","How do you identify resources to block?",[11,3705,3706],{},"There are a few methods and tools you can use to identify which resources to block. To keep it simple use Chrome DevTools to examine resource paths such as headers, image URLs, and scripts.",[11,3708,3709],{},"To get started:",[187,3711,3712,3732,3744,3752],{},[190,3713,3714,3715],{},"Open Chrome DevTools:\n",[648,3716,3717],{},[190,3718,3719,3720,3723,3724,3727,3728,3731],{},"Right-click on the webpage and select ",[49,3721,3722],{},"Inspect",", or use the shortcut ",[714,3725,3726],{},"Ctrl + Shift + I"," (Windows\u002FLinux) or ",[714,3729,3730],{},"Cmd + Option + I"," (Mac).",[190,3733,3734,3735,3738,3739],{},"Navigate to the ",[49,3736,3737],{},"Network"," tab:\n",[648,3740,3741],{},[190,3742,3743],{},"This will show all the resources the browser is loading, including images, CSS, JavaScript, and third-party scripts.",[190,3745,3746,3747],{},"Filter by resource type:\n",[648,3748,3749],{},[190,3750,3751],{},"Use the filter options (e.g., \"Images,\" \"Scripts,\" \"Media\") to find the specific assets you might want to block.",[190,3753,3754,3755],{},"Analyze resource sizes:\n",[648,3756,3757],{},[190,3758,3759],{},"Check the \"Size\" column to identify large files like videos or unnecessary scripts that might slow down your scraper.",[11,3761,3762,3763,3768],{},"If you're new to ",[39,3764,3767],{"href":3765,"rel":3766},"https:\u002F\u002Fsupport.google.com\u002Fcampaignmanager\u002Fanswer\u002F2828688?hl=en",[43],"Chrome DevTools",", plenty of tutorials are available online to help you get familiar with its features.",[63,3770,3772],{"id":3771},"can-i-break-something","Can I break something?",[11,3774,3775],{},"Yes, blocking certain resources can break a website's functionality. For example, blocking critical dependencies like JavaScript files or APIs can prevent the site from working properly. This could result in incomplete or missing data during scraping.",[11,3777,3778],{},"To avoid this, test your setup carefully:",[187,3780,3781,3784],{},[190,3782,3783],{},"Start by blocking non-essential resources like images, videos, and ads.",[190,3785,3786],{},"Gradually experiment with blocking more resources like CSS or JavaScript, ensuring the website still loads the content you need.",[63,3788,3790],{"id":3789},"first-i-will-try-standard-javascript","First I will try standard Javascript",[11,3792,3793],{},"I already knew I could hide elements by applying a CSS class with JavaScript. For example, with a single line of code like this, I can hide the header of a website:",[708,3795,3797],{"className":921,"code":3796,"language":923,"meta":15,"style":15},"document.getElementById('header-content').style.display = 'none';\n",[714,3798,3799],{"__ignoreMap":15},[236,3800,3801],{"class":718,"line":719},[236,3802,3796],{},[11,3804,3805,3806,3810],{},"First, I tried using this simple ",[39,3807,3809],{"href":3808},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript","JavaScript snippet"," to hide images, videos, and other elements. Now, a coder would have told me straight would not work! They would be right. There was no difference in the page load speed; why? The code was applied after the page load and not before.",[11,3812,3813],{},"To speed up scraping, I need to intercept resources before loading them. I initially hoped a line of JavaScript could achieve this, but it cannot. After asking ChatGPT some questions, it was clear I would need an additional JavaScript library to do what I wanted.",[11,3815,3816],{},"Thankfully, all is not lost; axiom.ai includes Puppeteer as a dependency, with which I can now do some neat tricks.",[63,3818,3820],{"id":3819},"why-we-will-use-puppetter","Why we will use Puppetter",[11,3822,3823],{},"We will use Puppeteer because axiom.ai already has the library installed. This lets us call Puppeteer functions directly in the JavaScript step without manually loading it, making it easier to get started.",[11,3825,3826],{},"Before writing this blog, I knew Puppeteer could intercept page requests, but I didn’t know how. I had never written any Puppeteer code before.",[11,3828,3829,3830,3833],{},"No problem! A quick chat with ChatGPT introduced me to the ",[714,3831,3832],{},"setRequestInterception"," method. This Puppeteer method intercepts network requests, giving us control over how resources like images, videos, and scripts load.",[11,3835,3836],{},"With this method, I can block unnecessary resources with just a few lines of code before they load. That’s exactly what I need to speed up my scraping workflow!",[63,3838,3840],{"id":3839},"how-to-get-started-and-replicate-these-experiments","How to get started and replicate these experiments",[11,3842,3843],{},"I tested all my Puppeteer scripts by quickly building a simple bot to check if they worked. When blocking images, I could see the site load without them when I clicked Run. To keep things simple, I judged success by observing whether the page loaded faster. If I saw a noticeable difference, I knew it was worth implementing.",[129,3845,3847],{"id":3846},"steps-to-test-your-setup","Steps to test your setup:",[11,3849,3850],{},"From the dashboard, click \"New Automation\".",[187,3852,3853,3856,3859],{},[190,3854,3855],{},"Use the step finder to add the \"JavaScript\" step. Since we're using Puppeteer functions, set this step to \"Run in App\".",[190,3857,3858],{},"Add the \"Go to Page\" step and enter a URL.",[190,3860,3861],{},"Finally, add a \"Wait\" step with a 5-second delay to prevent the bot from shutting down too quickly.",[11,3863,3864,3865,3868],{},"You can apply the JavaScript step using the code below to any of your ",[39,3866,3867],{"href":2363},"web scrapers"," built in axiom.ai.",[63,3870,3872],{"id":3871},"brief-explanation-of-what-the-code-does","Brief explanation of what the code does",[11,3874,3875],{},"Let’s break down the code block below to understand each part. You’ll notice a clear pattern, and I’ll walk you through its purpose step by step.",[129,3877,3879],{"id":3878},"code-explanation","Code explanation",[11,3881,3882,3883,3885],{},"This line calls the Puppeteer function ",[714,3884,3832],{}," and prepares the bot to intercept page requests.",[708,3887,3890],{"className":921,"code":3888,"language":923,"meta":3889,"style":15},"await page.setRequestInterception(true);\n","Block image puppeter",[714,3891,3892],{"__ignoreMap":15},[236,3893,3894],{"class":718,"line":719},[236,3895,3888],{},[11,3897,3898],{},"Next, this line listens for page requests as the page loads. Puppeteer triggers the function for each request the webpage makes.",[708,3900,3902],{"className":921,"code":3901,"language":923,"meta":3889,"style":15},"page.on('request', request => {\n",[714,3903,3904],{"__ignoreMap":15},[236,3905,3906],{"class":718,"line":719},[236,3907,3901],{},[11,3909,3910,3911,3914,3915,3918,3919,3922],{},"Here, we determine which requests to block and which to allow. In this example, we block all image requests by checking the ",[714,3912,3913],{},"resourceType",". If the request is an image, we call ",[714,3916,3917],{},"request.abort()"," to block it. Otherwise, we call ",[714,3920,3921],{},"request.continue()"," to let it proceed.",[708,3924,3926],{"className":921,"code":3925,"language":923,"meta":3889,"style":15},"\n  if (request.resourceType() === 'image') {\n    request.abort();\n  } else {\n    request.continue();\n  }\n",[714,3927,3928,3932,3937,3942,3947,3952],{"__ignoreMap":15},[236,3929,3930],{"class":718,"line":719},[236,3931,1043],{"emptyLinePlaceholder":24},[236,3933,3934],{"class":718,"line":542},[236,3935,3936],{},"  if (request.resourceType() === 'image') {\n",[236,3938,3939],{"class":718,"line":16},[236,3940,3941],{},"    request.abort();\n",[236,3943,3944],{"class":718,"line":571},[236,3945,3946],{},"  } else {\n",[236,3948,3949],{"class":718,"line":961},[236,3950,3951],{},"    request.continue();\n",[236,3953,3954],{"class":718,"line":982},[236,3955,3956],{},"  }\n",[129,3958,3960],{"id":3959},"what-this-code-does-overall","What this code does overall",[648,3962,3963,3966,3969,3972],{},[190,3964,3965],{},"Intercepts every network request as the page loads.",[190,3967,3968],{},"Checks the type of each requested resource (e.g., images, scripts, CSS).",[190,3970,3971],{},"Blocks images to reduce bandwidth usage and speed up page loading.",[190,3973,3974],{},"Allows all other resource types to load as usual.",[63,3976,3978],{"id":3977},"how-to-intercept-and-block-images-from-loading","How to intercept and block images from loading",[11,3980,3981],{},"First, I experimented with blocking images to see if it made a noticeable difference in load speed.",[11,3983,3984],{},"I tested a simple block of code that prevents all images from loading. I inserted the code into my JavaScript step and clicked Run. When the page loaded, no images appeared.",[708,3986,3988],{"className":921,"code":3987,"language":923,"meta":3889,"style":15},"await page.setRequestInterception(true);\n\n\u002F\u002F Block all image requests\npage.on('request', request => {\n  if (request.resourceType() === 'image') {\n    request.abort();\n  } else {\n    request.continue();\n  }\n});\n",[714,3989,3990,3994,3998,4003,4007,4011,4015,4019,4023,4027],{"__ignoreMap":15},[236,3991,3992],{"class":718,"line":719},[236,3993,3888],{},[236,3995,3996],{"class":718,"line":542},[236,3997,1043],{"emptyLinePlaceholder":24},[236,3999,4000],{"class":718,"line":16},[236,4001,4002],{},"\u002F\u002F Block all image requests\n",[236,4004,4005],{"class":718,"line":571},[236,4006,3901],{},[236,4008,4009],{"class":718,"line":961},[236,4010,3936],{},[236,4012,4013],{"class":718,"line":982},[236,4014,3941],{},[236,4016,4017],{"class":718,"line":988},[236,4018,3946],{},[236,4020,4021],{"class":718,"line":1015},[236,4022,3951],{},[236,4024,4025],{"class":718,"line":1021},[236,4026,3956],{},[236,4028,4029],{"class":718,"line":1040},[236,4030,758],{},[11,4032,4033],{},"This simple test confirmed that blocking images significantly reduces the page's visual load. While I didn’t measure exact speed improvements, the difference was immediately noticeable.",[129,4035,4037],{"id":4036},"block-all-images-by-multiple-domain","Block all images by multiple domain",[11,4039,4040,4041,4044],{},"I refined my code to allow blocking images by domain. You can copy and paste this code into a JavaScript step, replacing ",[49,4042,4043],{},"\"Insert domain\""," with your desired domain.",[708,4046,4048],{"className":921,"code":4047,"language":923,"meta":3889,"style":15},"\u002F\u002F Enable request interception\nawait page.setRequestInterception(true);\n\n\u002F\u002F Define the domains from which to block all image requests\nconst blockedImageDomains = [\n  'jlr.scene7.com',\n  'anotherdomain.com',\n  'yetanotherdomain.com',\n  \u002F\u002F Add more domains as needed\n];\n\n\u002F\u002F Block all image requests from the specified domains\npage.on('request', request => {\n  const requestUrl = request.url();\n  const urlHostname = new URL(requestUrl).hostname;\n\n  if (\n    request.resourceType() === 'image' &&\n    blockedImageDomains.includes(urlHostname)\n  ) {\n    request.abort(); \u002F\u002F Block the image request\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n\n",[714,4049,4050,4055,4059,4063,4068,4073,4078,4083,4088,4093,4098,4102,4107,4111,4116,4121,4125,4130,4135,4140,4145,4150,4154,4160,4165],{"__ignoreMap":15},[236,4051,4052],{"class":718,"line":719},[236,4053,4054],{},"\u002F\u002F Enable request interception\n",[236,4056,4057],{"class":718,"line":542},[236,4058,3888],{},[236,4060,4061],{"class":718,"line":16},[236,4062,1043],{"emptyLinePlaceholder":24},[236,4064,4065],{"class":718,"line":571},[236,4066,4067],{},"\u002F\u002F Define the domains from which to block all image requests\n",[236,4069,4070],{"class":718,"line":961},[236,4071,4072],{},"const blockedImageDomains = [\n",[236,4074,4075],{"class":718,"line":982},[236,4076,4077],{},"  'jlr.scene7.com',\n",[236,4079,4080],{"class":718,"line":988},[236,4081,4082],{},"  'anotherdomain.com',\n",[236,4084,4085],{"class":718,"line":1015},[236,4086,4087],{},"  'yetanotherdomain.com',\n",[236,4089,4090],{"class":718,"line":1021},[236,4091,4092],{},"  \u002F\u002F Add more domains as needed\n",[236,4094,4095],{"class":718,"line":1040},[236,4096,4097],{},"];\n",[236,4099,4100],{"class":718,"line":1046},[236,4101,1043],{"emptyLinePlaceholder":24},[236,4103,4104],{"class":718,"line":1051},[236,4105,4106],{},"\u002F\u002F Block all image requests from the specified domains\n",[236,4108,4109],{"class":718,"line":1063},[236,4110,3901],{},[236,4112,4113],{"class":718,"line":1668},[236,4114,4115],{},"  const requestUrl = request.url();\n",[236,4117,4118],{"class":718,"line":1674},[236,4119,4120],{},"  const urlHostname = new URL(requestUrl).hostname;\n",[236,4122,4123],{"class":718,"line":1695},[236,4124,1043],{"emptyLinePlaceholder":24},[236,4126,4127],{"class":718,"line":1701},[236,4128,4129],{},"  if (\n",[236,4131,4132],{"class":718,"line":1717},[236,4133,4134],{},"    request.resourceType() === 'image' &&\n",[236,4136,4137],{"class":718,"line":1723},[236,4138,4139],{},"    blockedImageDomains.includes(urlHostname)\n",[236,4141,4142],{"class":718,"line":1739},[236,4143,4144],{},"  ) {\n",[236,4146,4147],{"class":718,"line":1744},[236,4148,4149],{},"    request.abort(); \u002F\u002F Block the image request\n",[236,4151,4152],{"class":718,"line":1755},[236,4153,3946],{},[236,4155,4157],{"class":718,"line":4156},23,[236,4158,4159],{},"    request.continue(); \u002F\u002F Allow all other requests\n",[236,4161,4163],{"class":718,"line":4162},24,[236,4164,3956],{},[236,4166,4168],{"class":718,"line":4167},25,[236,4169,758],{},[63,4171,4173],{"id":4172},"how-to-block-all-videos","How to block all videos",[11,4175,4176],{},"Websites increasingly feature video content. While streaming services and faster broadband have improved load speeds, videos can still slow down page loading.",[11,4178,4179],{},"To block video content, I modified my code by changing the resource type from image to media. Here’s the updated snippet:",[708,4181,4184],{"className":921,"code":4182,"language":923,"meta":4183,"style":15},"await page.setRequestInterception(true);\n\n\u002F\u002F Block all video (media) requests\npage.on('request', request => {\n  if (request.resourceType() === 'media') {\n    request.abort(); \u002F\u002F Block video\u002Faudio requests\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n","Block",[714,4185,4186,4190,4194,4199,4203,4208,4213,4217,4221,4225],{"__ignoreMap":15},[236,4187,4188],{"class":718,"line":719},[236,4189,3888],{},[236,4191,4192],{"class":718,"line":542},[236,4193,1043],{"emptyLinePlaceholder":24},[236,4195,4196],{"class":718,"line":16},[236,4197,4198],{},"\u002F\u002F Block all video (media) requests\n",[236,4200,4201],{"class":718,"line":571},[236,4202,3901],{},[236,4204,4205],{"class":718,"line":961},[236,4206,4207],{},"  if (request.resourceType() === 'media') {\n",[236,4209,4210],{"class":718,"line":982},[236,4211,4212],{},"    request.abort(); \u002F\u002F Block video\u002Faudio requests\n",[236,4214,4215],{"class":718,"line":988},[236,4216,3946],{},[236,4218,4219],{"class":718,"line":1015},[236,4220,4159],{},[236,4222,4223],{"class":718,"line":1021},[236,4224,3956],{},[236,4226,4227],{"class":718,"line":1040},[236,4228,758],{},[11,4230,4231],{},"This adjustment prevents videos from loading, which can significantly reduce a webpage’s load time. The change is simple and can be easily applied in a JavaScript step.",[63,4233,4235],{"id":4234},"how-to-block-css-stylesheets","How to block CSS stylesheets",[11,4237,4238],{},"Next, I experimented with blocking CSS to see if it could speed up load times. Below, I’m sharing two scripts: one blocks all CSS, and the other targets specific stylesheets by URL.",[708,4240,4242],{"className":921,"code":4241,"language":923,"meta":4183,"style":15},"\nawait page.setRequestInterception(true);\n\n\u002F\u002F Block all CSS (stylesheet) requests\npage.on('request', request => {\n  if (request.resourceType() === 'stylesheet') {\n    request.abort(); \u002F\u002F Block CSS requests\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n",[714,4243,4244,4248,4252,4256,4261,4265,4270,4275,4279,4283,4287],{"__ignoreMap":15},[236,4245,4246],{"class":718,"line":719},[236,4247,1043],{"emptyLinePlaceholder":24},[236,4249,4250],{"class":718,"line":542},[236,4251,3888],{},[236,4253,4254],{"class":718,"line":16},[236,4255,1043],{"emptyLinePlaceholder":24},[236,4257,4258],{"class":718,"line":571},[236,4259,4260],{},"\u002F\u002F Block all CSS (stylesheet) requests\n",[236,4262,4263],{"class":718,"line":961},[236,4264,3901],{},[236,4266,4267],{"class":718,"line":982},[236,4268,4269],{},"  if (request.resourceType() === 'stylesheet') {\n",[236,4271,4272],{"class":718,"line":988},[236,4273,4274],{},"    request.abort(); \u002F\u002F Block CSS requests\n",[236,4276,4277],{"class":718,"line":1015},[236,4278,3946],{},[236,4280,4281],{"class":718,"line":1021},[236,4282,4159],{},[236,4284,4285],{"class":718,"line":1040},[236,4286,3956],{},[236,4288,4289],{"class":718,"line":1046},[236,4290,758],{},[11,4292,4293],{},"Blocking CSS can sometimes improve load speed, especially when stylesheets are large or externally hosted. However, be cautious blocking essential CSS may break the webpage layout, making it harder to scrape structured content. I recommend blocking only external stylesheets related to the main web application you’re scraping. Use the code below to do this.",[129,4295,4297],{"id":4296},"how-to-block-css-style-sheets-by-url","How to block CSS style sheets by url",[708,4299,4301],{"className":921,"code":4300,"language":923,"meta":4183,"style":15},"\nawait page.setRequestInterception(true);\n\n\u002F\u002F Define the URLs of stylesheets to block\nconst blockedStylesheetUrls = [\n  'https:\u002F\u002Fexample.com\u002Fstyles\u002Fblocked-style.css',\n  'https:\u002F\u002Fanotherdomain.com\u002Fcss\u002Funwanted.css',\n  \u002F\u002F Add more stylesheet URLs as needed\n];\n\n\u002F\u002F Block specific stylesheet requests\npage.on('request', request => {\n  if (\n    request.resourceType() === 'stylesheet' &&\n    blockedStylesheetUrls.includes(request.url())\n  ) {\n    request.abort(); \u002F\u002F Block the stylesheet\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n",[714,4302,4303,4307,4311,4315,4320,4325,4330,4335,4340,4344,4348,4353,4357,4361,4366,4371,4375,4380,4384,4388,4392],{"__ignoreMap":15},[236,4304,4305],{"class":718,"line":719},[236,4306,1043],{"emptyLinePlaceholder":24},[236,4308,4309],{"class":718,"line":542},[236,4310,3888],{},[236,4312,4313],{"class":718,"line":16},[236,4314,1043],{"emptyLinePlaceholder":24},[236,4316,4317],{"class":718,"line":571},[236,4318,4319],{},"\u002F\u002F Define the URLs of stylesheets to block\n",[236,4321,4322],{"class":718,"line":961},[236,4323,4324],{},"const blockedStylesheetUrls = [\n",[236,4326,4327],{"class":718,"line":982},[236,4328,4329],{},"  'https:\u002F\u002Fexample.com\u002Fstyles\u002Fblocked-style.css',\n",[236,4331,4332],{"class":718,"line":988},[236,4333,4334],{},"  'https:\u002F\u002Fanotherdomain.com\u002Fcss\u002Funwanted.css',\n",[236,4336,4337],{"class":718,"line":1015},[236,4338,4339],{},"  \u002F\u002F Add more stylesheet URLs as needed\n",[236,4341,4342],{"class":718,"line":1021},[236,4343,4097],{},[236,4345,4346],{"class":718,"line":1040},[236,4347,1043],{"emptyLinePlaceholder":24},[236,4349,4350],{"class":718,"line":1046},[236,4351,4352],{},"\u002F\u002F Block specific stylesheet requests\n",[236,4354,4355],{"class":718,"line":1051},[236,4356,3901],{},[236,4358,4359],{"class":718,"line":1063},[236,4360,4129],{},[236,4362,4363],{"class":718,"line":1668},[236,4364,4365],{},"    request.resourceType() === 'stylesheet' &&\n",[236,4367,4368],{"class":718,"line":1674},[236,4369,4370],{},"    blockedStylesheetUrls.includes(request.url())\n",[236,4372,4373],{"class":718,"line":1695},[236,4374,4144],{},[236,4376,4377],{"class":718,"line":1701},[236,4378,4379],{},"    request.abort(); \u002F\u002F Block the stylesheet\n",[236,4381,4382],{"class":718,"line":1717},[236,4383,3946],{},[236,4385,4386],{"class":718,"line":1723},[236,4387,4159],{},[236,4389,4390],{"class":718,"line":1739},[236,4391,3956],{},[236,4393,4394],{"class":718,"line":1744},[236,4395,758],{},[63,4397,4399],{"id":4398},"my-final-experiment-blocking-third-party-apps-and-javascript-files","My final experiment blocking third-party apps and JavaScript files",[11,4401,4402],{},"For my final experiment, I blocked third-party apps and JavaScript files. These resources often track data or power ads, and they can significantly slow down page load times.",[11,4404,4405],{},"This script blocks requests to third-party domains by filtering the URLs of the source files.",[708,4407,4409],{"className":921,"code":4408,"language":923,"meta":4183,"style":15},"\n\u002F\u002F Enable request interception\nawait page.setRequestInterception(true);\n\n\u002F\u002F Define the URLs of JavaScript files to block\nconst blockedScriptUrls = [\n  'https:\u002F\u002Fexample.com\u002Fscripts\u002Funwanted-script.js',\n  'https:\u002F\u002Fanotherdomain.com\u002Fjs\u002Ftracking.js',\n  \u002F\u002F Add more script URLs as needed\n];\n\n\u002F\u002F Block specific JavaScript requests\npage.on('request', request => {\n  if (\n    request.resourceType() === 'script' &&\n    blockedScriptUrls.includes(request.url())\n  ) {\n    request.abort(); \u002F\u002F Block the JavaScript file\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n",[714,4410,4411,4415,4419,4423,4427,4432,4437,4442,4447,4452,4456,4460,4465,4469,4473,4478,4483,4487,4492,4496,4500,4504],{"__ignoreMap":15},[236,4412,4413],{"class":718,"line":719},[236,4414,1043],{"emptyLinePlaceholder":24},[236,4416,4417],{"class":718,"line":542},[236,4418,4054],{},[236,4420,4421],{"class":718,"line":16},[236,4422,3888],{},[236,4424,4425],{"class":718,"line":571},[236,4426,1043],{"emptyLinePlaceholder":24},[236,4428,4429],{"class":718,"line":961},[236,4430,4431],{},"\u002F\u002F Define the URLs of JavaScript files to block\n",[236,4433,4434],{"class":718,"line":982},[236,4435,4436],{},"const blockedScriptUrls = [\n",[236,4438,4439],{"class":718,"line":988},[236,4440,4441],{},"  'https:\u002F\u002Fexample.com\u002Fscripts\u002Funwanted-script.js',\n",[236,4443,4444],{"class":718,"line":1015},[236,4445,4446],{},"  'https:\u002F\u002Fanotherdomain.com\u002Fjs\u002Ftracking.js',\n",[236,4448,4449],{"class":718,"line":1021},[236,4450,4451],{},"  \u002F\u002F Add more script URLs as needed\n",[236,4453,4454],{"class":718,"line":1040},[236,4455,4097],{},[236,4457,4458],{"class":718,"line":1046},[236,4459,1043],{"emptyLinePlaceholder":24},[236,4461,4462],{"class":718,"line":1051},[236,4463,4464],{},"\u002F\u002F Block specific JavaScript requests\n",[236,4466,4467],{"class":718,"line":1063},[236,4468,3901],{},[236,4470,4471],{"class":718,"line":1668},[236,4472,4129],{},[236,4474,4475],{"class":718,"line":1674},[236,4476,4477],{},"    request.resourceType() === 'script' &&\n",[236,4479,4480],{"class":718,"line":1695},[236,4481,4482],{},"    blockedScriptUrls.includes(request.url())\n",[236,4484,4485],{"class":718,"line":1701},[236,4486,4144],{},[236,4488,4489],{"class":718,"line":1717},[236,4490,4491],{},"    request.abort(); \u002F\u002F Block the JavaScript file\n",[236,4493,4494],{"class":718,"line":1723},[236,4495,3946],{},[236,4497,4498],{"class":718,"line":1739},[236,4499,4159],{},[236,4501,4502],{"class":718,"line":1744},[236,4503,3956],{},[236,4505,4506],{"class":718,"line":1755},[236,4507,758],{},[63,4509,4511],{"id":4510},"a-combined-script-for-blocking-images-videos-and-urls","A combined script for blocking images, videos, and URLs",[11,4513,4514],{},"Here’s a script that combines all the functionality from the previous examples. With this single script, you can efficiently block images, videos, and specific URLs.",[11,4516,4517],{},"If you’re not a developer, don’t worry—it’s simple to use:",[187,4519,4520,4523,4526],{},[190,4521,4522],{},"Copy the code into a JavaScript step and set it to Run in App.",[190,4524,4525],{},"To block additional domains, add them to the blockedDomains array.",[190,4527,4528],{},"By default, the script blocks images and media.",[708,4530,4532],{"className":921,"code":4531,"language":923,"meta":4183,"style":15},"\n\u002F\u002F Define third-party script domains to block\nconst blockedScriptDomains = new Set([\n  'thirdparty.com',\n  'anotherdomain.net',\n  'yetanotherapp.org',\n  \u002F\u002F Add more domains as needed\n]);\n\npage.on('request', request => {\n  const requestUrl = request.url().toLowerCase();\n  const resourceType = request.resourceType();\n  let hostname = '';\n\n  try {\n    hostname = new URL(requestUrl).hostname;\n  } catch {\n    \u002F\u002F If URL parsing fails, proceed without blocking\n  }\n\n  if (\n    resourceType === 'image' ||\n    resourceType === 'media' ||\n    (resourceType === 'script' && blockedScriptDomains.has(hostname))\n  ) {\n    request.abort();\n  } else {\n    request.continue();\n  }\n});\n",[714,4533,4534,4538,4543,4548,4553,4558,4563,4567,4572,4576,4580,4585,4590,4595,4599,4604,4609,4614,4619,4623,4627,4631,4636,4641,4646,4650,4655,4660,4665,4670],{"__ignoreMap":15},[236,4535,4536],{"class":718,"line":719},[236,4537,1043],{"emptyLinePlaceholder":24},[236,4539,4540],{"class":718,"line":542},[236,4541,4542],{},"\u002F\u002F Define third-party script domains to block\n",[236,4544,4545],{"class":718,"line":16},[236,4546,4547],{},"const blockedScriptDomains = new Set([\n",[236,4549,4550],{"class":718,"line":571},[236,4551,4552],{},"  'thirdparty.com',\n",[236,4554,4555],{"class":718,"line":961},[236,4556,4557],{},"  'anotherdomain.net',\n",[236,4559,4560],{"class":718,"line":982},[236,4561,4562],{},"  'yetanotherapp.org',\n",[236,4564,4565],{"class":718,"line":988},[236,4566,4092],{},[236,4568,4569],{"class":718,"line":1015},[236,4570,4571],{},"]);\n",[236,4573,4574],{"class":718,"line":1021},[236,4575,1043],{"emptyLinePlaceholder":24},[236,4577,4578],{"class":718,"line":1040},[236,4579,3901],{},[236,4581,4582],{"class":718,"line":1046},[236,4583,4584],{},"  const requestUrl = request.url().toLowerCase();\n",[236,4586,4587],{"class":718,"line":1051},[236,4588,4589],{},"  const resourceType = request.resourceType();\n",[236,4591,4592],{"class":718,"line":1063},[236,4593,4594],{},"  let hostname = '';\n",[236,4596,4597],{"class":718,"line":1668},[236,4598,1043],{"emptyLinePlaceholder":24},[236,4600,4601],{"class":718,"line":1674},[236,4602,4603],{},"  try {\n",[236,4605,4606],{"class":718,"line":1695},[236,4607,4608],{},"    hostname = new URL(requestUrl).hostname;\n",[236,4610,4611],{"class":718,"line":1701},[236,4612,4613],{},"  } catch {\n",[236,4615,4616],{"class":718,"line":1717},[236,4617,4618],{},"    \u002F\u002F If URL parsing fails, proceed without blocking\n",[236,4620,4621],{"class":718,"line":1723},[236,4622,3956],{},[236,4624,4625],{"class":718,"line":1739},[236,4626,1043],{"emptyLinePlaceholder":24},[236,4628,4629],{"class":718,"line":1744},[236,4630,4129],{},[236,4632,4633],{"class":718,"line":1755},[236,4634,4635],{},"    resourceType === 'image' ||\n",[236,4637,4638],{"class":718,"line":4156},[236,4639,4640],{},"    resourceType === 'media' ||\n",[236,4642,4643],{"class":718,"line":4162},[236,4644,4645],{},"    (resourceType === 'script' && blockedScriptDomains.has(hostname))\n",[236,4647,4648],{"class":718,"line":4167},[236,4649,4144],{},[236,4651,4653],{"class":718,"line":4652},26,[236,4654,3941],{},[236,4656,4658],{"class":718,"line":4657},27,[236,4659,3946],{},[236,4661,4663],{"class":718,"line":4662},28,[236,4664,3951],{},[236,4666,4668],{"class":718,"line":4667},29,[236,4669,3956],{},[236,4671,4673],{"class":718,"line":4672},30,[236,4674,758],{},[63,4676,4678],{"id":4677},"wrapping-up-is-writing-a-few-lines-of-code-worth-it","Wrapping up – is writing a few lines of code worth it?",[11,4680,4681],{},"To intercept requests and block resources, we use Puppeteer because it includes a built-in function for request interception. Fortunately, Puppeteer is part of axiom.ai, making the process simple and accessible.",[11,4683,4684,4685],{},"When blocking resources, it’s important to consider the potential impact. Blocking certain elements might break the website you’re trying to scrape. However, blocking images, videos, third-party apps, and fonts is usually safe and can significantly speed up ",[39,4686,4687],{"href":2363},"web scraping.",[11,4689,4690,4691,4694],{},"I should also mention ChatGPT. Without it, learning this would have been harder and taken much longer. ChatGPT truly makes coding accessible to no-coders. It’s especially helpful in breaking down and explaining what each part of the code does. We also intergrate ",[39,4692,2941],{"href":4693},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fchatgpt"," into axiom.ai.",[11,4696,4697],{},"Final thoughts:",[187,4699,4700,4703,4706],{},[190,4701,4702],{},"Can a no-coder use Puppeteer for this? Yes! Even without coding experience, you can use simple Puppeteer scripts to enhance your scraping workflow.",[190,4704,4705],{},"Have I improved my skills? Absolutely, this process has been a great learning experience.",[190,4707,4708],{},"Can any no-coder do this without ChatGPT? Yes, it’s surprisingly simple when broken down step by step.",[11,4710,4711],{},"One question I’m still pondering: What happens if the site loads too quickly? Could that trigger anti-bot measures? Web scraping isn’t always straightforward, so I’ll need to consider this when building my next scraper. But I’m definitely using this new method I’ve learned!",[11,4713,4714,4715,4719],{},"FYI in a future ",[39,4716,4718],{"href":4717},"\u002Fdocs\u002Fno-code-tool\u002Frelease-notes","release"," of the axiom.ai [No-code tool](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder,we're adding a settings feature to block resources.",[802,4721,4722],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":15,"searchDepth":16,"depth":16,"links":4724},[4725,4726,4727,4728,4729,4730,4733,4737,4740,4741,4744,4745,4746],{"id":3652,"depth":542,"text":3653},{"id":3702,"depth":542,"text":3703},{"id":3771,"depth":542,"text":3772},{"id":3789,"depth":542,"text":3790},{"id":3819,"depth":542,"text":3820},{"id":3839,"depth":542,"text":3840,"children":4731},[4732],{"id":3846,"depth":16,"text":3847},{"id":3871,"depth":542,"text":3872,"children":4734},[4735,4736],{"id":3878,"depth":16,"text":3879},{"id":3959,"depth":16,"text":3960},{"id":3977,"depth":542,"text":3978,"children":4738},[4739],{"id":4036,"depth":16,"text":4037},{"id":4172,"depth":542,"text":4173},{"id":4234,"depth":542,"text":4235,"children":4742},[4743],{"id":4296,"depth":16,"text":4297},{"id":4398,"depth":542,"text":4399},{"id":4510,"depth":542,"text":4511},{"id":4677,"depth":542,"text":4678},"2025-02-03",{"read":4749,"type":714,"tool":4750,"category":4751,"tags":4753,"location":587,"featuredimg":4755,"landingimg":4756,"summary":4757},"10 min read",[580],[4752],"Web scraping",[4754],"resource blocking","\u002Fblog\u002Fblog-speed-up-long.webp","\u002Fblog\u002Fblog-speed-up-sq.webp","Learn how to use a few lines of code to block resources to speed up your web scraping tasks.","\u002Fblog\u002Fblocking-resources",{"title":3605,"description":3610},"blog\u002Fblocking-resources","hORBD-gsI93UJCP-K5WM9RvtgywJ0WZYzKXlcpuOznA",{"id":4763,"title":4764,"author":23,"body":4765,"date":5341,"description":4769,"draft":575,"extension":19,"meta":5342,"navigation":24,"path":5353,"seo":5354,"stem":5355,"__hash__":5356},"blog\u002Fblog\u002Fno-code-web-scraping.md","Build a web scraper without writing a single line of code",{"type":8,"value":4766,"toc":5322},[4767,4770,4773,4776,4779,4782,4785,4823,4826,4829,4832,4835,4867,4870,4874,4877,4897,4900,4904,4907,4910,4913,4916,4920,4923,4960,4964,4967,5005,5009,5012,5044,5047,5050,5053,5061,5092,5096,5100,5103,5111,5115,5119,5122,5128,5132,5136,5139,5144,5148,5152,5159,5162,5169,5191,5194,5197,5237,5241,5244,5273,5275,5278,5281,5295,5298,5304,5307,5309],[11,4768,4769],{},"Tools like Python, Selenium, or Puppeteer are the go-to options for developers looking to scrape data from websites. But what if you're not a coder? Building a web scraper is a tad daunting. Thankfully, the no-code scraper market has evolved dramatically, offering powerful tools to create scrapers without writing a single line of code.",[60,4771],{"alt":4772},"Build a web scraper with a single loine of code",[11,4774,4775],{},"You can now bypass bot detection, scale your scrapers using concurrency, and achieve results comparable to those created with traditional coding. These advancements make no-code tools an increasingly viable option, even for developers who might typically favor coding their web scrapers.",[11,4777,4778],{},"This guide is for both non-technical users and developers. We'll explore the everyday challenges of web scraping, why no-code tools are gaining the edge, and which tools can help you create web scrapers quickly.",[11,4780,4781],{},"If you want to learn more, I will also demonstrate how to create a variety of scrapers for different use cases using axiom.ai, a no-code tool that allows you to combine steps to create custom web scrapers in seconds.",[11,4783,4784],{},"Here's a quick overview of what we'll cover and the scrapers we'll build.",[187,4786,4787,4793,4799,4805,4811,4817],{},[190,4788,4789],{},[39,4790,4792],{"href":4791},"#what-are-the-challenges-of-web-scraping","What are the challenges of web scraping?",[190,4794,4795],{},[39,4796,4798],{"href":4797},"#why-no-code-tools-now-have-the-edge","Why no-code now has the edge?",[190,4800,4801],{},[39,4802,4804],{"href":4803},"#how-to-pick-the-best-tool-for-web-scraping","How do you pick the best tool for web scraping?",[190,4806,4807],{},[39,4808,4810],{"href":4809},"#how-to-make-no-code-web-scrapers-with-axiom-ai","How to make no-code web scrapers with axiom.ai",[190,4812,4813],{},[39,4814,4816],{"href":4815},"#running-your-web-scrapers","Running your web scrapers",[190,4818,4819],{},[39,4820,4822],{"href":4821},"#bot-blocking","Bot blocking",[11,4824,4825],{},"I'm Alex, co-founder of axiom.ai - let's dive in!",[63,4827,4792],{"id":4828},"what-are-the-challenges-of-web-scraping",[11,4830,4831],{},"Having all your data neatly extracted and in your Google Sheet feels great. But getting there can be a tricky process. Many websites block or confuse scrapers, making data extraction challenging.",[11,4833,4834],{},"Here are some of the most common challenges I encounter:",[648,4836,4837,4843,4849,4855,4861],{},[190,4838,4839,4842],{},[49,4840,4841],{},"Varying page templates:"," Pages within the same site can have different structures, requiring custom logic for each one.",[190,4844,4845,4848],{},[49,4846,4847],{},"CSS class obfuscation:"," Dynamic and unpredictable class names make locating elements harder.",[190,4850,4851,4854],{},[49,4852,4853],{},"Missing elements:"," Content might only load after user interactions or be hidden entirely from scrapers.",[190,4856,4857,4860],{},[49,4858,4859],{},"Anti-bot measures:"," Tools like Cloudflare and other CAPTCHA systems actively block automated access.",[190,4862,4863,4866],{},[49,4864,4865],{},"CDNs:"," Distributed networks and throttling mechanisms limit the rate of data extraction.",[11,4868,4869],{},"For coders, these issues mean hours spent debugging, writing exception-specific logic, and integrating tools like Puppeteer Stealth. It's an ongoing arms race to outsmart anti-scraping measures, requiring bucketloads of patience and persistence.",[63,4871,4873],{"id":4872},"why-no-code-tools-now-have-the-edge","Why no-code tools now have the edge",[11,4875,4876],{},"Web scraping has traditionally been the domain of coders, but that's no longer the case. No-code tools have matured, making it possible to assemble web scrapers using intuitive user interfaces quickly. These tools also offer advanced features like bot evasion with straightforward configuration. You can even run your scrapers on your desktop or in the cloud without setting up a server—no more \"PIP Install.\" Just click run.",[648,4878,4879,4885,4891],{},[190,4880,4881,4884],{},[49,4882,4883],{},"Easy assembly."," No-code tools now allow anyone to assemble simple or complex scrapers in minutes. You get all the functionality of programming languages but in a simplified, user-friendly format.",[190,4886,4887,4890],{},[49,4888,4889],{},"Powerful configuration."," No-code tools have leveled up. They now provide advanced options to optimize scrapers, including proxy usage and built-in anti-bot measures like Cloudflare evasion.",[190,4892,4893,4896],{},[49,4894,4895],{},"Effortless scalability."," Concurrency features let you deploy an entire army of scrapers. Managing a stack to run your scrapers on—well, that's now done for you. All you need to do is click run.",[11,4898,4899],{},"Does coding a web scraper and setting up your own server still make sense? No-code solutions offer a faster, simpler, and more efficient alternative, even for the most dedicated developers.",[63,4901,4903],{"id":4902},"how-to-pick-the-best-tool-for-web-scraping","How to pick the best tool for web scraping",[11,4905,4906],{},"When selecting a no-code web scraping tool, the complexity of your task should be your top consideration. If you only need to extract small amounts of data from straightforward or formulaic web pages, an AI-powered scraper or a tool with pre-built templates is likely sufficient.",[11,4908,4909],{},"However, not all web scraping tasks are that simple. For more complex use cases, such as automating browser interactions to access dynamic or hard-to-reach data, you'll need a tool that offers the flexibility to build custom scrapers.",[11,4911,4912],{},"For large-scale scraping projects involving hundreds of thousands or even millions of pages, enterprise-level solutions are often necessary to handle the scale.",[11,4914,4915],{},"To make choosing simpler, I've grouped web scraping tools into three main categories:",[129,4917,4919],{"id":4918},"_1-aitemplate-scraper-tools","1. AI\u002FTemplate scraper tools",[11,4921,4922],{},"These tools are ideal for quick scraping tasks. They rely on pre-built templates or AI-driven automation to scrape pre-defined data, like profile data.",[648,4924,4925,4931,4937,4954],{},[190,4926,4927,4930],{},[49,4928,4929],{},"Best For:"," Beginners, non-technical users, and those with straightforward needs.",[190,4932,4933,4936],{},[49,4934,4935],{},"Advantages:"," Fast setup, minimal learning curve.",[190,4938,4939,4942,4943,4948,4949],{},[49,4940,4941],{},"Examples:"," ",[39,4944,4947],{"href":4945,"rel":4946},"https:\u002F\u002Fwww.bardeen.ai\u002F",[43],"Bardeen.ai",",",[39,4950,4953],{"href":4951,"rel":4952},"https:\u002F\u002Fwww.getmagical.com\u002F",[43],"Magic",[190,4955,4956,4959],{},[49,4957,4958],{},"Limitations:"," Limited customization is less suited for dynamic or complex websites.",[129,4961,4963],{"id":4962},"_2-no-code-web-scrapers-with-builders","2. No-code web scrapers with builders",[11,4965,4966],{},"No-code tool tools allow you to configure custom scraping workflows, giving you more control. You can visually select elements on a page, define rules, handle pagination, and even integrate with APIs or automation platforms such as Zapier and Make.",[648,4968,4969,4974,4979,5000],{},[190,4970,4971,4973],{},[49,4972,4929],{}," Users with moderate to advanced requirements who need more flexibility.",[190,4975,4976,4978],{},[49,4977,4935],{}," Customization options, ability to handle dynamic content, tools for proxy management and anti-bot measures.",[190,4980,4981,4983,4984,1140,4989,4994,4995,13],{},[49,4982,4941],{}," Tools like ",[39,4985,4988],{"href":4986,"rel":4987},"https:\u002F\u002Faxiom.ai",[43],"axiom.ai",[39,4990,4993],{"href":4991,"rel":4992},"https:\u002F\u002Fwww.parsehub.com\u002F",[43],"ParseHub",", or ",[39,4996,4999],{"href":4997,"rel":4998},"https:\u002F\u002Fwww.octoparse.com\u002F",[43],"Octoparse",[190,5001,5002,5004],{},[49,5003,4958],{}," Slightly steeper learning curve than AI\u002Ftemplate tools.",[129,5006,5008],{"id":5007},"_3-enterprise-web-scraping-solutions","3. Enterprise web scraping solutions",[11,5010,5011],{},"Enterprise-grade tools handle large-scale, complex scraping projects and offer advanced features like data normalization, machine learning, and real-time integration with databases or analytics platforms.",[648,5013,5014,5019,5024,5039],{},[190,5015,5016,5018],{},[49,5017,4929],{}," Businesses or teams with significant data needs and technical expertise.",[190,5020,5021,5023],{},[49,5022,4935],{}," Scalability, robust anti-bot systems, and dedicated support.",[190,5025,5026,4983,5028,5033,5034],{},[49,5027,4941],{},[39,5029,5032],{"href":5030,"rel":5031},"https:\u002F\u002Fbrightdata.com\u002F",[43],"Bright Data"," or ",[39,5035,5038],{"href":5036,"rel":5037},"https:\u002F\u002Foxylabs.io\u002F",[43],"Oxylabs",[190,5040,5041,5043],{},[49,5042,4958],{}," Expensive and may require technical assistance to manage effectively.",[63,5045,4810],{"id":5046},"how-to-make-no-code-web-scrapers-with-axiomai",[11,5048,5049],{},"Let’s keep this simple so you can get started quickly; I will assume you have axiom.ai installed already.",[11,5051,5052],{},"I'll walk you through design patterns for common use cases. You can quickly replicate them using the step finder in the builder and customize them to suit your needs.",[11,5054,5055,5056,5060],{},"For an even easier setup, I’ll include links to ",[39,5057,5059],{"href":5058},"\u002Fguides\u002F","templates",". Once your scraper is ready, just click run to get started.",[187,5062,5063,5069,5076,5079,5086],{},[190,5064,5065,5066,13],{},"How to get started ",[39,5067,5068],{"href":2363},"web scraping",[190,5070,5071,5072,5075],{},"How to use the ",[39,5073,5074],{"href":2358},"selector tool"," to choose an element to scrape.",[190,5077,5078],{},"How to use the [No-code tool](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder.",[190,5080,5081,5082,13],{},"How to ",[39,5083,5085],{"href":5084},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fpass","pass data between steps",[190,5087,5081,5088,13],{},[39,5089,5091],{"href":5090},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Frun","run your web scrapers",[129,5093,5095],{"id":5094},"_1-scrape-links-from-a-listing-page","1. Scrape links from a listing page",[175,5097],{"src":5098,"alt":5099},"\u002Fblog\u002Ftest-get-links.png","axiom.ai design pattern for scraping links from listing pages",[11,5101,5102],{},"Create your first no-code web scraper in just a few seconds! This scraper will extract a list of links and save them to a Google Sheet. Open axiom.ai's [no-code bot builder](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder, then add the steps visualized above, replicating and configuring them as you go.",[11,5104,5105,5106,5110],{},"If you feel like cheating, we have a ",[39,5107,5109],{"href":5108},"\u002Fguides\u002Fscrape-links-from-a-website","template"," you can try.",[129,5112,5114],{"id":5113},"_2-loop-through-urls-scraping-web-pages","2. Loop through URLs, scraping web pages",[175,5116],{"src":5117,"alt":5118},"\u002Fblog\u002Fpage-scraper.webp","axiom.ai design pattern for scraping web pages",[11,5120,5121],{},"An everyday use case is looping through a list of URLs in a Google Sheet, scraping data from the pages, and writing it to a Google Sheet. To do this, add and configure the steps illustrated above. This scraper is best suited to webpages that share a standard template with structured data, like product pages in an e-commerce store.",[11,5123,5124,5125,5127],{},"Give the ",[39,5126,5109],{"href":5108}," a try.",[129,5129,5131],{"id":5130},"_3-loop-through-urls-scraping-web-pages-using-ai-to-extract-unstructured-data","3. Loop through URLs, scraping web pages using AI to extract unstructured data.",[175,5133],{"src":5134,"alt":5135},"\u002Fblog\u002Fai-scraper.webp","axiom.ai design pattern for scraping unstructured data",[11,5137,5138],{},"This is a web scraper design pattern for extracting unstructured data. It will loop through URLs, scrape the body, and then use ChatGPT to extract the data you specify. This scraper works great when page layouts vary or when scraping multiple websites. You will need your own ChatGPT account and API key.",[11,5140,5141,5142,13],{},"To set this template up, you will need to scrape the \"body\" text or HTML. Use the options found in the step \"Page HTML\" or \"Page text .\" Alternatively, try the ",[39,5143,5109],{"href":5108},[129,5145,5147],{"id":5146},"_4-extract-and-download-files","4. Extract and download files",[175,5149],{"src":5150,"alt":5151},"\u002Fblog\u002Ftemplate-file-downloader.webp","axiom.ai design pattern for downloading files",[11,5153,5154,5155,13],{},"Another common use case for web scraping is extracting files. This design template shows how you can use a bot to download files to a specified folder on your computer. You can try the template ",[39,5156,5158],{"href":5157},"\u002Fguides\u002Fhow-to-automate-file-downloads","here",[63,5160,4816],{"id":5161},"running-your-web-scrapers",[11,5163,5164,5165,5168],{},"When you build your scraper with axiom.ai, the infrastructure is fully set up and managed for you. It's as simple as clicking run! You can ",[39,5166,5167],{"href":5090},"run"," your bots on the desktop, in the cloud, or on your own VPS.",[11,5170,5171,5172,5176,5177,5181,5182,5186,5187,5190],{},"Depending on your ",[39,5173,5175],{"href":5174},"\u002Fpricing","subscription",", you can also run ",[39,5178,5180],{"href":5179},"\u002Fdocs\u002Ftutorials\u002Fadvanced-running-methods","multiple bots"," in the cloud and ",[39,5183,5185],{"href":5184},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fautomation","schedule"," them on your desktop, VPS, or cloud setup. If you need custom infrastructure solutions, feel free to contact our ",[39,5188,5189],{"href":521},"support team"," with your requirements.",[63,5192,4822],{"id":5193},"bot-blocking",[11,5195,5196],{},"One of the most frustrating parts of web scraping is spending time building and perfecting your scraper, only to have it blocked by anti-bot measures. The website may stop loading and display a turnstile or CAPTCHA request instead. Thankfully, there are simple steps you can take to bypass these obstacles.",[187,5198,5199,5206,5214,5222,5230],{},[190,5200,5201,5202,13],{},"Try this if you encounter turnstile blocking by ",[39,5203,5205],{"href":5204},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fbypass-bot-detection#select-the-method-to-bypass-bot-blocking","Cloudflare",[190,5207,5208,5209,5213],{},"Integrate with the ",[39,5210,5212],{"href":5211},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002F2captcha","2Captcha"," service if you hit the traditional captcha.",[190,5215,5216,5217,5221],{},"Turn on ",[39,5218,5220],{"href":5219},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fstore-cookies","cookie sharing"," to share your session in the cloud.",[190,5223,5224,5225,5229],{},"For ",[39,5226,5228],{"href":5227},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fprofile","Chrome Profile"," sharing, try this.",[190,5231,5232,5233,13],{},"Try this to add your custom ",[39,5234,5236],{"href":5235},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fproxy","Proxies",[63,5238,5240],{"id":5239},"other-useful-features","Other useful features",[11,5242,5243],{},"axiom.ai offers a host of other features worth exploring. If you want to dive deeper into no-code web scraping and master axiom.ai, these resources might be helpful:",[187,5245,5246,5252,5259,5266],{},[190,5247,5248,5251],{},[39,5249,5250],{"href":2480},"Custom CSS Selectors",": Learn how to target specific elements on a page for precise scraping.",[190,5253,5254,5258],{},[39,5255,5257],{"href":5256},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data\u002Fconfiguring-your-scraper#number-of-attempts-when-results-not-found","Optimizing Scraper Speed",": Tips to make your scrapers faster and more efficient.",[190,5260,5261,5265],{},[39,5262,5264],{"href":5263},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Floop","Learn to Loop",": Master looping through lists or multiple pages for larger-scale scraping.",[190,5267,5268,5272],{},[39,5269,5271],{"href":5270},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic","Using logic",": Master using logic in your no-code web scrapers.",[63,5274,2878],{"id":2877},[11,5276,5277],{},"Web scraping has evolved from a developer-exclusive skill to something anyone can do with no-code tools like axiom.ai. These tools also tackle the complex problems in web scraping, like bot detection and scalability, while simplifying setup and customization.",[11,5279,5280],{},"We covered:",[648,5282,5283,5286,5289,5292],{},[190,5284,5285],{},"The everyday challenges of web scraping.",[190,5287,5288],{},"How no-code tools now rival coded solutions",[190,5290,5291],{},"Practical design patterns and templates for tasks such as extracting links, looping through URLs, handling unstructured data, and downloading files.",[190,5293,5294],{},"Advanced features like bot-blocking and custom infrastructure options.",[11,5296,5297],{},"Have all the challenges been solved? Not yet. However, no-code tools have sped up the process, making web scraping easier. Whether handling small datasets or tackling large-scale projects, axiom.ai provides everything you need, but like anything new, there's a learning curve.",[11,5299,5300,5301,13],{},"Please share your input if you are a power scraper, coder or no-coder. Above all, we value our users and do our utmost to build the features you need. Please share features or feedback that can ",[39,5302,5303],{"href":521},"help shape axiom.ai",[5305,5306],"br",{},[3177,5308],{},[11,5310,5311,5313],{},[5305,5312],{},[5314,5315,5316,5317,13],"em",{},"Have you any tips and tricks you've learned while using axiom.ai to help others? We would love to hear from you over in our ",[39,5318,5321],{"href":5319,"rel":5320},"https:\u002F\u002Freddit.com\u002Fr\u002Faxiom_ai",[43],"community",{"title":15,"searchDepth":16,"depth":16,"links":5323},[5324,5325,5326,5331,5337,5338,5339,5340],{"id":4828,"depth":542,"text":4792},{"id":4872,"depth":542,"text":4873},{"id":4902,"depth":542,"text":4903,"children":5327},[5328,5329,5330],{"id":4918,"depth":16,"text":4919},{"id":4962,"depth":16,"text":4963},{"id":5007,"depth":16,"text":5008},{"id":5046,"depth":542,"text":4810,"children":5332},[5333,5334,5335,5336],{"id":5094,"depth":16,"text":5095},{"id":5113,"depth":16,"text":5114},{"id":5130,"depth":16,"text":5131},{"id":5146,"depth":16,"text":5147},{"id":5161,"depth":542,"text":4816},{"id":5193,"depth":542,"text":4822},{"id":5239,"depth":542,"text":5240},{"id":2877,"depth":542,"text":2878},"2025-01-09",{"read":5343,"type":578,"tool":5344,"category":5345,"tags":5346,"location":587,"featuredimg":5350,"landingimg":5351,"summary":5352},"4 min read",[580],[4752],[5347,3197,5348,5349],"scraper","bot blocking","scalability","\u002Fblog\u002Fno-code-web-scraping.webp","\u002Fblog\u002Fno-code-web-scraping-sq.webp","Discover why no-code tools are the smarter choice for web scraping and learn step-by-step how to create your own no-code web scraper effortlessly.","\u002Fblog\u002Fno-code-web-scraping",{"title":4764,"description":4769},"blog\u002Fno-code-web-scraping","LDAdnjW45gsCZUrsWTQwN_taps2imtpfxDAcE6Lyf2w",{"id":5358,"title":5359,"author":23,"body":5360,"date":5782,"description":5783,"draft":575,"extension":19,"meta":5784,"navigation":24,"path":5796,"seo":5797,"stem":5798,"__hash__":5799},"blog\u002Fblog\u002Fui-automation.md","Is UI Automation just about testing or is there more to it?",{"type":8,"value":5361,"toc":5757},[5362,5365,5368,5371,5374,5378,5381,5384,5388,5391,5394,5397,5401,5404,5408,5411,5415,5418,5422,5425,5434,5437,5441,5445,5459,5464,5475,5483,5486,5490,5494,5505,5509,5520,5528,5531,5535,5539,5549,5553,5562,5566,5569,5575,5578,5582,5586,5600,5604,5612,5620,5623,5627,5631,5648,5652,5663,5671,5674,5678,5682,5697,5701,5711,5713,5717,5720,5743,5747,5750,5754],[11,5363,5364],{},"UI Automation is used to test website applications to ensure that when we come to use the software, it is working correctly and will perform the tasks we carry out via pointing and clicking.",[11,5366,5367],{},"But did you know those same principles and ideas can be used not just to test if a user interface is working, but also to automate the processes you do via the UI?",[60,5369],{"alt":5370},"How to automate the ui in chrome",[11,5372,5373],{},"UI automation can be used to test apps, but it can also be an alternative to API automation. In fact, you can use UI automation to automate your repetitive work on the desktop or in the browser via the UI. In this article, we will explore what UI automation is, the types of automation, and the different ui automation tools we can use.",[63,5375,5377],{"id":5376},"what-is-ui-automation","What is UI Automation",[11,5379,5380],{},"Web UI automation involves automating interactions with the graphical user interface (GUI) of an application on a website or desktop. That's right—UI automation uses software to replicate the clicks and interactions we perform, just like we would. Why would we want to do this? Originally, its primary use was to test applications to ensure that new features worked correctly, safeguarding against the release of bad code that could negatively affect a business.",[11,5382,5383],{},"While humans can perform these tests, using software is quicker and more efficient. For decades, software has been used to test and ensure the quality of applications. Innovators like axiom.ai realized that if bots could replicate our actions for testing, they could also be used to automate repetitive tasks. The apple had fallen from the tree: UI automation could free us from boring, repetitive tasks.",[63,5385,5387],{"id":5386},"what-can-you-use-ui-automation-for","What Can You Use UI Automation For?",[11,5389,5390],{},"So we know what UI automation is, but what cool things can we do with it? If you want to test an application or website, UI automation can be used to replicate human interactions. For example, you could build an automation to buy a product and check out on an e-commerce website. This is great for being able to test and ensure your checkout process is working.",[11,5392,5393],{},"But UI automation, as I mentioned, can do so much more. When used to automate work in the browser, the possibilities are almost endless. If an app has a UI, it can be automated, meaning we can virtually automate any task, whether it be in an app like a tax software or a social media platform. If there is a button or a series of actions you repeat, it's very likely you can automate your UI to do it for you.",[11,5395,5396],{},"And we have done just that. We have created UI automations to send DMs on Instagram, update shipping information in a logistics application, enter data into a CRM, and even to create websites in Webflow.",[63,5398,5400],{"id":5399},"how-to-go-about-ui-automation","How to go about UI automation",[11,5402,5403],{},"Like most things their is more than one way to do something UI automation is no different. The log and short of it is either you can learn to code and create UI automations programmatically or you can use Tools to create your automations. I would recommend choosing a tool over coding UI automations. Why simple because its quicker and easier to do at scale. Why build from scratch when someones made a tool to do the job. Sorry but I like being lazy.",[63,5405,5407],{"id":5406},"what-ui-automation-languages-are-there","What UI Automation languages are there?",[11,5409,5410],{},"If you are interest in coding an automation then you will not go wrong learning on of these automation first languages. There so many great online tutorials now and even chatGPT to help you learn. If you are determined to learn language which is not a bad thing I would go for Python, its a popular language and is not just used for automation.",[63,5412,5414],{"id":5413},"how-to-approach-ui-automation","How to Approach UI Automation",[11,5416,5417],{},"Like most things, there is more than one way to do UI automation. The long and short of it is that you can either learn to code and create UI automations programmatically or you can use tools to create your automations. I would recommend choosing a tool over coding UI automations. Why? Simply because it's quicker and easier to do at scale. Why build from scratch when someone has already made a tool to do the job? Sorry, but I like being lazy.",[63,5419,5421],{"id":5420},"what-ui-automation-languages-are-there-1","What UI Automation Languages Are There?",[11,5423,5424],{},"If you are interested in coding an automation, you can't go wrong learning one of these automation-first languages. There are so many great online tutorials now, and even ChatGPT can help you learn. If you are determined to learn a language, which is not a bad thing, I would go for Python. It's a popular language and is used for much more than just automation.",[129,5426,5428,5429],{"id":5427},"ui-automation-python","UI automation ",[39,5430,5433],{"href":5431,"rel":5432},"https:\u002F\u002Fwww.python.org",[43],"Python",[11,5435,5436],{},"Python is a versatile and popular programming language widely used for automation, web development, data analysis, and more. It boasts a clean syntax and an extensive library ecosystem, making it an excellent choice for both beginners and experienced developers.",[175,5438],{"src":5439,"alt":5440},"\u002Fblog\u002Fui-automation-python.png","ui automation programming language python",[11,5442,5443],{},[49,5444,4935],{},[648,5446,5447,5450,5453,5456],{},[190,5448,5449],{},"Easy to learn and use, with a clean and readable syntax",[190,5451,5452],{},"Extensive library support, including libraries specifically for UI automation like Selenium, PyAutoGUI, and BeautifulSoup",[190,5454,5455],{},"Strong community support and abundant resources for learning and troubleshooting",[190,5457,5458],{},"Versatile, allowing you to use it for various tasks beyond automation, such as web development and data analysis",[11,5460,5461],{},[49,5462,5463],{},"Disadvantages:",[648,5465,5466,5469,5472],{},[190,5467,5468],{},"Performance may be slower compared to languages like C++ or Java",[190,5470,5471],{},"Requires programming knowledge to develop automation scripts",[190,5473,5474],{},"Depending on the complexity of the task, it may require more time to set up and maintain compared to using specialized UI automation tools",[63,5476,5428,5478],{"id":5477},"ui-automation-selenium",[39,5479,5482],{"href":5480,"rel":5481},"https:\u002F\u002Fwww.selenium.dev",[43],"Selenium",[11,5484,5485],{},"Selenium is an open-source project encompassing various tools and libraries designed for automating web browsers. It features a playback tool that facilitates the creation of functional tests compatible with the majority of contemporary web browsers.",[175,5487],{"src":5488,"alt":5489},"\u002Fblog\u002Fui-automation-selenium.png","ui automation programming language selenium",[11,5491,5492],{},[49,5493,4935],{},[648,5495,5496,5499,5502],{},[190,5497,5498],{},"You can both write automated tests and automate web-based tasks",[190,5500,5501],{},"Open source license",[190,5503,5504],{},"Compatible with most browsers",[11,5506,5507],{},[49,5508,5463],{},[648,5510,5511,5514,5517],{},[190,5512,5513],{},"Big learning curve",[190,5515,5516],{},"Requires programming knowledge to develop automation or tests",[190,5518,5519],{},"Scripts may need updates following changes in the UI",[63,5521,5428,5523,5527],{"id":5522},"ui-automation-puppeteer-by-google",[39,5524,3648],{"href":5525,"rel":5526},"https:\u002F\u002Fpptr.dev",[43]," by Google",[11,5529,5530],{},"Puppeteer is software made by Google. It provides an API that allows developers to manipulate Chrome or Chromium browsers through the user interface by leveraging the DevTools Protocol. With Puppeteer, developers can script UI interactions within the browser, including button clicks, form submissions, and page navigation.",[175,5532],{"src":5533,"alt":5534},"\u002Fblog\u002Fui-automation-puppeteer.png","ui automation programming language puppeteer",[11,5536,5537],{},[49,5538,4935],{},[648,5540,5541,5543,5546],{},[190,5542,5498],{},[190,5544,5545],{},"Offers a well-documented and user-friendly API",[190,5547,5548],{},"Compatible with operating systems such as Windows, macOS, and Linux",[11,5550,5551],{},[49,5552,5463],{},[648,5554,5555,5558,5560],{},[190,5556,5557],{},"Limited to only Chrome or Chromium browsers",[190,5559,5516],{},[190,5561,5519],{},[63,5563,5565],{"id":5564},"what-ui-automation-tools-are-there","What UI Automation tools are there",[11,5567,5568],{},"If you are interested in UI automation but cannot code, take a look at these tools.",[63,5570,5428,5572],{"id":5571},"ui-automation-axiomai",[39,5573,4988],{"href":4986,"rel":5574},[43],[11,5576,5577],{},"axiom.ai is a no-code automation tool designed to automate repetitive tasks in web applications. It provides an intuitive interface that allows users to create automation workflows without writing any code. This makes it accessible to both technical and non-technical users.",[175,5579],{"src":5580,"alt":5581},"\u002Fblog\u002Frpa-tool-axiom.ai.jpg","ui automation tool axiom.ai",[11,5583,5584],{},[49,5585,4935],{},[648,5587,5588,5591,5594,5597],{},[190,5589,5590],{},"No coding required, making it accessible for non-developers",[190,5592,5593],{},"User-friendly interface with drag-and-drop functionality",[190,5595,5596],{},"Can automate a wide range of web-based tasks",[190,5598,5599],{},"Regular updates and support from the development team",[11,5601,5602],{},[49,5603,5463],{},[648,5605,5606,5609],{},[190,5607,5608],{},"No support or desktop applications",[190,5610,5611],{},"Learning curve for users unfamiliar with automation tools like Zapier",[63,5613,5428,5615],{"id":5614},"ui-automation-leapwork",[39,5616,5619],{"href":5617,"rel":5618},"https:\u002F\u002Fwww.leapwork.com",[43],"Leapwork",[11,5621,5622],{},"Leapwork is a no-code automation platform designed to make it easy for businesses to automate repetitive tasks and test applications without the need for programming skills. With its visual interface, users can create automation flows using a drag-and-drop approach, making automation accessible to both technical and non-technical users.",[175,5624],{"src":5625,"alt":5626},"\u002Fblog\u002Fleapworks.png","ui automation leapworks",[11,5628,5629],{},[49,5630,4935],{},[648,5632,5633,5636,5639,5642,5645],{},[190,5634,5635],{},"No coding required, making it accessible to non-developers",[190,5637,5638],{},"User-friendly visual interface with drag-and-drop functionality",[190,5640,5641],{},"Supports a wide range of applications and platforms, including web, desktop, and SAP",[190,5643,5644],{},"Comprehensive documentation and support resources",[190,5646,5647],{},"Integrates with various CI\u002FCD tools, making it suitable for DevOps workflows",[11,5649,5650],{},[49,5651,5463],{},[648,5653,5654,5657,5660],{},[190,5655,5656],{},"May have a learning curve for users unfamiliar with automation tools",[190,5658,5659],{},"Customization options might be limited compared to traditional coding solutions",[190,5661,5662],{},"Can be costly for smaller businesses or individual users",[63,5664,5428,5666],{"id":5665},"ui-automation-uipath",[39,5667,5670],{"href":5668,"rel":5669},"https:\u002F\u002Fwww.uipath.com",[43],"UiPath",[11,5672,5673],{},"UiPath is a leading Robotic Process Automation (RPA) tool that enables businesses to automate repetitive tasks and processes. It provides a comprehensive platform with a visual interface that allows users to design automation workflows without writing any code, making it accessible for both technical and non-technical users.",[175,5675],{"src":5676,"alt":5677},"\u002Fblog\u002Fuipath.jpg","rpa tool UIpath",[11,5679,5680],{},[49,5681,4935],{},[648,5683,5684,5686,5688,5691,5694],{},[190,5685,5635],{},[190,5687,5593],{},[190,5689,5690],{},"Extensive library of pre-built automation activities",[190,5692,5693],{},"Strong community support and extensive documentation",[190,5695,5696],{},"Integrates with various applications and systems, including ERP, CRM, and custom applications",[11,5698,5699],{},[49,5700,5463],{},[648,5702,5703,5706,5709],{},[190,5704,5705],{},"Can be costly, especially for smaller businesses or individual users",[190,5707,5708],{},"May have a learning curve for users unfamiliar with RPA tools",[190,5710,5659],{},[11,5712,5568],{},[63,5714,5716],{"id":5715},"how-to-pick-a-tool-to-start-learning-ui-automation","How to pick a tool to start learning UI automation",[11,5718,5719],{},"There are some key factors to help you decide which tool to start learning for UI automation. So you do not get bogged down in ui automation challenges.",[187,5721,5722,5725,5728,5731,5734,5737,5740],{},[190,5723,5724],{},"Ease of use: What skill level does the tool require?",[190,5726,5727],{},"Programming: Do you want to learn a programming language or use a no-code tool?",[190,5729,5730],{},"Requirements: Do you need desktop or browser automation?",[190,5732,5733],{},"Documentation: Are there resources to learn from?",[190,5735,5736],{},"Pricing: Cost can be a big factor; enterprise tools often have hefty license fees.",[190,5738,5739],{},"Support: Do they support their customers well?",[190,5741,5742],{},"Reviews: What do their customer reviews say?",[63,5744,5746],{"id":5745},"ui-automation-or-api-automation","UI automation or API automation",[11,5748,5749],{},"One final thing to consider is if the task you wish to automate can be done with API automation. API automation can be more dependable than UI automation. However, not all tasks can be automated with an API, and that is the sweet spot for UI automation.",[63,5751,5753],{"id":5752},"wrapping-up-learning-ui-automation","Wrapping up learning UI automation.",[11,5755,5756],{},"There are a variety of ways to automate the UI, with programming languages such as Python or Puppeteer. There are tools that allow you to automate the UI without coding a single line, and there are tools for individuals or enterprise-scale businesses. The sweet spot for UI automation is automating tasks that API automation cannot. If you are looking to get into UI automation, perhaps just experiment before committing. In that case, it's worth looking at no-code solutions.",{"title":15,"searchDepth":16,"depth":16,"links":5758},[5759,5760,5761,5762,5763,5764,5768,5770,5772,5773,5775,5777,5779,5780,5781],{"id":5376,"depth":542,"text":5377},{"id":5386,"depth":542,"text":5387},{"id":5399,"depth":542,"text":5400},{"id":5406,"depth":542,"text":5407},{"id":5413,"depth":542,"text":5414},{"id":5420,"depth":542,"text":5421,"children":5765},[5766],{"id":5427,"depth":16,"text":5767},"UI automation Python",{"id":5477,"depth":542,"text":5769},"UI automation Selenium",{"id":5522,"depth":542,"text":5771},"UI automation Puppeteer by Google",{"id":5564,"depth":542,"text":5565},{"id":5571,"depth":542,"text":5774},"UI automation axiom.ai",{"id":5614,"depth":542,"text":5776},"UI automation Leapwork",{"id":5665,"depth":542,"text":5778},"UI automation UiPath",{"id":5715,"depth":542,"text":5716},{"id":5745,"depth":542,"text":5746},{"id":5752,"depth":542,"text":5753},"2024-05-19","UI automation can be used to test apps, but it can also be to automate tasks in those apps.",{"read":5343,"type":578,"tool":5785,"category":5786,"tags":5788,"location":587,"featuredimg":5792,"landingimg":5793,"summary":5794,"video":18,"metaTitle":5795},[580],[5787],"Browser automation",[816,5789,5790,5791],"clicks","downloads","text inputs","\u002Fblog\u002Fui-test-blog-post.jpg","\u002Fblog\u002Fui-test-blog-sq.jpg","Learn about how UI automation can be used to automate tasks and testing.","UI automation tools for testing and tasks","\u002Fblog\u002Fui-automation",{"title":5359,"description":5783},"blog\u002Fui-automation","qrHZ9hO5nyYAGY1DLZZvlXWuhyrGXJMyyg3SNR5YBg4",{"id":5801,"title":5802,"author":23,"body":5803,"date":6049,"description":6050,"draft":575,"extension":19,"meta":6051,"navigation":24,"path":6063,"seo":6064,"stem":6065,"__hash__":6066},"blog\u002Fblog\u002Fauto-clicker.md","How to make an auto clicker bot in minutes without code",{"type":8,"value":5804,"toc":6029},[5805,5808,5811,5815,5818,5822,5825,5829,5832,5836,5839,5843,5847,5850,5854,5869,5873,5877,5907,5911,5915,5925,5928,5931,5935,5942,5946,5950,5954,5976,5980,5983,5987,5998,6002,6017,6019,6022,6026],[11,5806,5807],{},"Frequent mouse clicks can be frustrating; automation is the solution. What if you could create auto-clicker bots in minutes without any coding and fully customize them to your needs? You could build auto-clickers suitable for any browser activity using our chrome extension.",[60,5809],{"alt":5810},"how to make an auto clicker with axiom.ai",[63,5812,5814],{"id":5813},"what-are-auto-clicker-bots","What are auto clicker bots",[11,5816,5817],{},"Auto clicker bots are software designed to automate clicking actions on a website. These bots simulate mouse clicks at a set interval or in response to certain conditions. They are handy for repetitive tasks where manual clicking is time-consuming.",[63,5819,5821],{"id":5820},"how-do-these-bots-work","How do these bots work",[11,5823,5824],{},"The bots operate by launching a Chrome browser window, loading a specified URL, and interacting with the webpage according to your defined steps.",[63,5826,5828],{"id":5827},"can-anyone-make-a-bot-to-automate-mouse-clicks","Can anyone make a bot to automate mouse clicks",[11,5830,5831],{},"axiom.ai's no-code bot-building tool enables anyone to automate browser actions easily. Users create combinations of steps to replicate the actions they wish to automate. It's as straightforward as point and click. No coding skills are required.",[63,5833,5835],{"id":5834},"what-else-could-i-do-with-a-bot","What else could I do with a bot",[11,5837,5838],{},"Bots can automate a wide range of tasks beyond simple button clicks. For instance, they can fill out web forms, interact with elements on a webpage, and send direct messages.",[63,5840,5842],{"id":5841},"how-to-make-a-basic-auto-clicker-bot","How to make a basic auto clicker bot",[129,5844,5846],{"id":5845},"_1-install-axiom","1. Install Axiom",[11,5848,5849],{},"To install Axiom and create an account, visit our Chrome Store page*.* While you're there, consider checking out some of our reviews. FYI, all new accounts receive 120 minutes of free runtime, with no credit card required at signup.",[129,5851,5853],{"id":5852},"_2-start-from-blank-to-make-your-autoclicker","2. Start from blank to make your autoclicker",[11,5855,5856,5857,5860,5861,5864,5865,5868],{},"To start creating your first autoclicker bot on axiom.ai, ",[5314,5858,5859],{},"start from blank by clicking on"," '",[49,5862,5863],{},"New Automation'"," in the top right corner of the axiom.ai dashboard. Next, click ",[49,5866,5867],{},"'Add First Step'."," This action will open the step finder, where you'll add the steps needed to build your auto-clicker bot.",[175,5870],{"alt":5871,"src":5872},"axiom.ai making an auto-clicker with steps","\u002Fblog\u002Fautoclicker-blank.png",[129,5874,5876],{"id":5875},"_3-add-a-goto-page-step","3. Add a goto page step",[11,5878,5879,5880,5883,5884,5886,5887,5883,5890,5883,5893,5896,5897,5900,5901,5903,5904],{},"To begin building your autoclicker bot, add your first step by ",[5314,5881,5882],{},"selecting the"," ",[49,5885,228],{}," step. You can do this by ",[5314,5888,5889],{},"entering",[49,5891,5892],{},"'Go to'",[5314,5894,5895],{},"into the step finder search field"," or scrolling down to click ",[49,5898,5899],{},"'Interact'."," Select ",[49,5902,228],{}," to add it as your first step. Once added, enter the page URL where you want to automate mouse clicks in the ",[49,5905,5906],{},"'Enter URL field'.",[175,5908],{"src":5909,"alt":5910},"\u002Fblog\u002Fadd-go-to-page-clicker.png","axiom.ai add go to page step",[129,5912,5914],{"id":5913},"_4-add-a-click-element-step","4. Add a click element step",[11,5916,5917,5918,5920,5921,5924],{},"Next, in the builder, click ",[49,5919,460],{},"; the step finder will appear. Now, search for the 'Click element' step and add it to the bot you are making. Inside the step, click ",[49,5922,5923],{},"'Select'",", then point and click on the element you wish to click.",[175,5926],{"alt":5871,"src":5927},"\u002Fblog\u002Fauto-clicker-page-click.png",[11,5929,5930],{},"That is your basic bot. When you run it, the bot will open a page and click a button.",[129,5932,5934],{"id":5933},"_5-test-your-basic-bot","5. Test your basic bot",[11,5936,5937,5938,5941],{},"Assuming you have the desktop app installed, click run and select ",[49,5939,5940],{},"'Run w\u002F desktop app'."," You should see the bot opening a window and clicking the selected button. If the bot closes the window too quickly, add a 'Wait' step when testing at the end.",[63,5943,5945],{"id":5944},"how-to-enhance-your-bot","How to enhance your  bot",[129,5947,5949],{"id":5948},"_1-jump-step","1. Jump step",[175,5951],{"alt":5952,"src":5953},"axiom.ai adding a jump step step","\u002Fblog\u002Fauto-clicker-jump-step.png",[11,5955,5956,5957,5960,5961,5963,5964,5967,5968,5971,5972,5975],{},"If you want to click a button multiple times, add a ",[49,5958,5959],{},"'Jump'"," step below the 'Click element' step. In the ",[49,5962,5959],{}," step settings, select '",[49,5965,5966],{},"Jump'"," step and specify the ",[49,5969,5970],{},"'step number'"," from which you wish to repeat. Then, set the number of repetitions by adjusting ",[49,5973,5974],{},"'Maximum cycles'",". The jump step will repeat all the steps between it and the step it is jumping back to.",[129,5977,5979],{"id":5978},"_2-loop-through-data-step","2. Loop through data step",[11,5981,5982],{},"This step loops through data passed into from sources such as Google Sheets, one loop for each row of data. All steps can be nested into a loop steps.",[175,5984],{"alt":5985,"src":5986},"axiom.ai adding a loop step step","\u002Fblog\u002Fauto-clicker-loop.png",[11,5988,5989,5990,5993,5994,5997],{},"To wrap your steps into a ",[49,5991,5992],{},"'Loop through data'"," step, highlight the steps you will move by clicking on the check box to the ",[5314,5995,5996],{},"left of the step number",". A dark toolbar will appear at the top of the builder. In the toolbar, click 'Loop'; the step will be added, and the selected steps will be moved inside.",[129,5999,6001],{"id":6000},"_3-discovering-other-steps","3. Discovering other steps",[11,6003,6004,6005,6008,6009,6012,6013,6016],{},"axiom.ai's no-code bot builder features extensive steps that combine to create powerful browser automation bots. ",[5314,6006,6007],{},"It includes steps for reading and writing data from various sources like webhooks, Google Sheets",", and CSVs, as well as for scraping and filtering data. Other steps cover web actions such as the ",[49,6010,6011],{},"'Enter text'"," and ",[49,6014,6015],{},"'Date picker'"," steps. Explore the builder's step finder or look on our website for a complete list of available steps.",[63,6018,2878],{"id":2877},[11,6020,6021],{},"Creating an auto clicker bot with axiom.ai' no-code platform is straightforward and requires no prior coding knowledge. You can automate repetitive mouse clicks by following simple steps to install the tool and start a new automation. Whether enhancing productivity or customizing browser interactions, axiom.ai equips you with the tools to build bots that save time and effort. Explore making even more powerful bots by experimenting with additional steps.",[63,6023,6025],{"id":6024},"do-you-have-your-idea-for-a-bot","Do you have your idea for a bot",[11,6027,6028],{},"If this guide only partially meets your needs and you have an idea for a bot you'd like to build, apply the skills you've learned and try it. If you need assistance, don't hesitate to contact our customer support team.",{"title":15,"searchDepth":16,"depth":16,"links":6030},[6031,6032,6033,6034,6035,6042,6047,6048],{"id":5813,"depth":542,"text":5814},{"id":5820,"depth":542,"text":5821},{"id":5827,"depth":542,"text":5828},{"id":5834,"depth":542,"text":5835},{"id":5841,"depth":542,"text":5842,"children":6036},[6037,6038,6039,6040,6041],{"id":5845,"depth":16,"text":5846},{"id":5852,"depth":16,"text":5853},{"id":5875,"depth":16,"text":5876},{"id":5913,"depth":16,"text":5914},{"id":5933,"depth":16,"text":5934},{"id":5944,"depth":542,"text":5945,"children":6043},[6044,6045,6046],{"id":5948,"depth":16,"text":5949},{"id":5978,"depth":16,"text":5979},{"id":6000,"depth":16,"text":6001},{"id":2877,"depth":542,"text":2878},{"id":6024,"depth":542,"text":6025},"2024-05-01","Learn how to make and use an auto clicker bot using axiom.ai's no-code bot builder",{"read":6052,"type":578,"tool":6053,"category":6054,"tags":6056,"location":587,"featuredimg":6059,"landingimg":6060,"summary":6061,"video":18,"metaTitle":6062},"3 min read",[580],[6055],"Workflow automation",[1219,6057,6058],"auto clicker","mouse clicks","\u002Fblog\u002Fautoclicker-post.jpg","\u002Fblog\u002Fautoclicker-sq.jpg","Learn how to make an auto clicker bot with axiom.ai a no-code browser automation tool.","auto clicker bot","\u002Fblog\u002Fauto-clicker",{"title":5802,"description":6050},"blog\u002Fauto-clicker","uCE-jd1JpSKb12H874k9Zw0S2nZ_st268ngMpzUPVjI",{"id":6068,"title":6069,"author":23,"body":6070,"date":6049,"description":6321,"draft":575,"extension":19,"meta":6322,"navigation":24,"path":6332,"seo":6333,"stem":6334,"__hash__":6335},"blog\u002Fblog\u002Fautomate-browser-actions.md","How to automate actions on a website with a bot",{"type":8,"value":6071,"toc":6299},[6072,6075,6078,6086,6090,6093,6097,6100,6104,6107,6111,6118,6122,6125,6128,6132,6135,6138,6141,6144,6148,6151,6157,6160,6163,6167,6170,6181,6185,6189,6192,6195,6198,6202,6206,6210,6213,6217,6221,6224,6228,6232,6235,6239,6243,6246,6250,6254,6257,6261,6265,6268,6272,6276,6279,6282,6286,6289,6292,6296],[11,6073,6074],{},"If you want to automate tasks performed in the browser, you should consider building a bot. You will be surprised how useful this can be - who wouldn't want an army of digital assistants to help handle their workload?",[60,6076],{"alt":6077},"how to automate wbesite actions with a bot",[11,6079,6080,6081,6085],{},"In this guide, we will teach you the basics of automating browser actions in just minutes, using ",[39,6082,4988],{"href":6083,"rel":6084},"http:\u002F\u002Faxiom.ai",[43],"’s no-code bot building tool.",[63,6087,6089],{"id":6088},"why-make-a-bot","Why make a bot?",[11,6091,6092],{},"Well, bots can take some of those repetitive, manual browser tasks off your hands, freeing up valuable time for other, more enjoyable things. Besides, watching the bots do your work is pretty amazing! What’s more, you’ll acquire useful automation skills.",[63,6094,6096],{"id":6095},"what-can-bots-automate","What can bots automate?",[11,6098,6099],{},"We’re teaching you how to make bots that can be used in the Chrome browser. These bots can automate a wide range of browser actions, from data entry to data scraping. We have users automating a multitude of different tasks, helping them to more efficiently manage their social media accounts, e-commerce stores, data migration, and more.",[63,6101,6103],{"id":6102},"how-do-bots-automate-in-the-browser","How do bots automate in the browser?",[11,6105,6106],{},"Simply put, bots mimic human behavior in Chrome. They click buttons and enter data into forms, replicating your web browser actions without getting bored, fed up, or frustrated.",[63,6108,6110],{"id":6109},"can-anyone-make-a-bot","Can anyone make a bot?",[11,6112,6113,6114,6117],{},"Our no-code, point-and-click bot builder has been created to be user-friendly from the ground up. You don't need any programming skills to make bots with ",[39,6115,4988],{"href":6083,"rel":6116},[43],", but having a clear idea of what you want to automate will be helpful.",[63,6119,6121],{"id":6120},"what-skills-will-i-learn","What skills will I learn?",[11,6123,6124],{},"Learning how to automate your browser is becoming an increasingly valuable skill. As more and more work moves to the browser, being able to automate it will be an invaluable addition to anyone's CV. Learning to automate, instead of being automated, will empower you for the future. Of course it involves a learning curve: you'll have to get to grips with some of the key concepts of automation, from structuring it, to setting up loops and thinking like a programmer.",[11,6126,6127],{},"Once you master it, you won’t look back.",[63,6129,6131],{"id":6130},"start-by-breaking-your-bot-down-into-steps","Start by breaking your bot down into steps",[11,6133,6134],{},"It's always useful to plan before you get started. A plan helps reduce frustration and speeds up the process.",[11,6136,6137],{},"Start by breaking down the task into steps and then review it, simplifying the process as much as possible for your first bot.",[11,6139,6140],{},"For complex tasks, you may want to consider breaking them down into several steps, to be taken on by more than one bot.",[11,6142,6143],{},"Once you have a plan in place, you're ready to start building.",[63,6145,6147],{"id":6146},"start-from-blank-or-pick-a-template","Start from blank or pick a template",[11,6149,6150],{},"We offer a variety of templates to assist you with scraping, data entry, and social media management on platforms like Instagram. You can find all of our templates on our website. However, we believe it's important to teach you how to start from blank.",[11,6152,6153,6154,13],{},"We will assume that you have already created an account and installed ",[39,6155,4988],{"href":6083,"rel":6156},[43],[11,6158,6159],{},"Open the chrome extension and double click ‘Create New Automation’.",[11,6161,6162],{},"You are now in our Axiom builder. Let’s take you through the basics.",[63,6164,6166],{"id":6165},"choose-a-starting-point","Choose a starting point",[11,6168,6169],{},"Select your first step to add. We suggest one of the following steps:",[187,6171,6172,6175,6178],{},[190,6173,6174],{},"If you have data in a Google Sheet, start with the ‘Read data from a Google Sheet’ step",[190,6176,6177],{},"If want to make a web scraper bot, start with the ‘Get data from URL’ step",[190,6179,6180],{},"If you want to enter data into a form, start with the ‘Go to’ page step",[175,6182],{"src":6183,"alt":6184},"\u002Fblog\u002Fadd-step-web-actions.jpg","adding steps in axiom.ai",[63,6186,6188],{"id":6187},"combine-steps","Combine steps",[11,6190,6191],{},"To make your bot perform tasks, you can combine different steps. For instance, if you need to read or write data, you may consider using ‘Google Sheet’ steps. Or, if you need to interact with a web page, or fill out forms, you can use the ‘Enter Text’ steps and click on the elements you wish to enter data into.",[11,6193,6194],{},"By replicating each step of your task, you can create a sequence of web actions for your bot to execute.",[11,6196,6197],{},"Have a browse through the different steps in our step finder.",[175,6199],{"src":6200,"alt":6201},"\u002Fblog\u002Fstep-finder-web-actions.jpg","select steps using the step finder in axiom.ai",[63,6203,6205],{"id":6204},"some-helpful-patterns-for-your-bot","Some helpful patterns for your bot",[129,6207,6209],{"id":6208},"a-simple-web-scraper-bot","A simple web scraper bot",[11,6211,6212],{},"Here we read URLs from a Google Sheet, loop through them, and write data to a Google Sheet.",[175,6214],{"src":6215,"alt":6216},"\u002Fblog\u002Fdp-scrape-urls-google-sheet.png","a design pattern for a bot that scrapes urls loaded from a Google Sheet made with axiom.ai",[129,6218,6220],{"id":6219},"web-page-interactions-bot","Web page interactions bot",[11,6222,6223],{},"Here we load a web page with a 'Go to page' step then click a button with a 'Click element' step.",[175,6225],{"src":6226,"alt":6227},"\u002Fblog\u002Fweb-actions-basic.png","a design pattern for a bot taht automates website actions made with axiom.ai",[129,6229,6231],{"id":6230},"data-entry-bot","Data entry bot",[11,6233,6234],{},"Here we read data from a sheet one row at a time. Enter the data then loop to repeat the process.",[175,6236],{"src":6237,"alt":6238},"\u002Fblog\u002Fdata-entry-basic.png","a design pattern for a bot that automates data entry made with axiom.ai",[63,6240,6242],{"id":6241},"how-to-loop-your-bots","How to loop your bots",[11,6244,6245],{},"There are loop steps and jump steps. These can be added from the start, or later. The loop step will loop through data from a source like a Google Sheet; the jump step loops for the amount of time you set it to.",[175,6247],{"src":6248,"alt":6249},"\u002Fblog\u002Floop-data-axiom.jpg","looping a bot with axiom.ai",[63,6251,6253],{"id":6252},"how-to-pass-data-between-steps-in-a-bot","How to pass data between steps in a bot",[11,6255,6256],{},"Steps that read or output some form of data like the ‘Get data’ step, can make their data available to other steps in the form of tokens. See this example of a Google Sheet passing a URL into a go to page step.",[175,6258],{"src":6259,"alt":6260},"\u002Fblog\u002Fpass-data-axiom.ai.jpg","pass data between steps in axiom.ai",[63,6262,6264],{"id":6263},"how-to-move-steps-in-a-bot","How to move steps in a bot",[11,6266,6267],{},"We have made it simple to move, edit and duplicate steps by simply clicking on a tick box inside the step. You’ll find the tick box to the left of the title.",[175,6269],{"src":6270,"alt":6271},"\u002Fblog\u002Fmove-steps-axiom-ai.jpg","How to move steps in axiom.ai",[63,6273,6275],{"id":6274},"test-as-you-go","Test as you go",[11,6277,6278],{},"We highly recommend testing your build by running your bot on the desktop app. Failed or stopped runs won't count towards the runtime limit, so you can test as much as you want.",[11,6280,6281],{},"While testing, it's important to observe the behavior of the bot and note at which point it breaks or doesn't behave as expected.",[63,6283,6285],{"id":6284},"ready-to-run","Ready to run!",[11,6287,6288],{},"Once you’re ready to run the bot, you can run it on your desktop, in the cloud. If you’re on a paid tier, you can also schedule your bots. So go ahead click run and watch your digital worker automate your repetitive browser actions.",[11,6290,6291],{},"Please note that if you build a bot on the desktop app when logged in, your session will be shared. However if you run the bot in the cloud, the session will not be shared.",[63,6293,6295],{"id":6294},"need-help","Need help?",[11,6297,6298],{},"If you get stuck or need help with building more complex bots, please don't hesitate to contact us via this link. Be sure to share with us your Axiom bot and as much supporting information as possible describing the web actions use wish to automate.",{"title":15,"searchDepth":16,"depth":16,"links":6300},[6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6315,6316,6317,6318,6319,6320],{"id":6088,"depth":542,"text":6089},{"id":6095,"depth":542,"text":6096},{"id":6102,"depth":542,"text":6103},{"id":6109,"depth":542,"text":6110},{"id":6120,"depth":542,"text":6121},{"id":6130,"depth":542,"text":6131},{"id":6146,"depth":542,"text":6147},{"id":6165,"depth":542,"text":6166},{"id":6187,"depth":542,"text":6188},{"id":6204,"depth":542,"text":6205,"children":6311},[6312,6313,6314],{"id":6208,"depth":16,"text":6209},{"id":6219,"depth":16,"text":6220},{"id":6230,"depth":16,"text":6231},{"id":6241,"depth":542,"text":6242},{"id":6252,"depth":542,"text":6253},{"id":6263,"depth":542,"text":6264},{"id":6274,"depth":542,"text":6275},{"id":6284,"depth":542,"text":6285},{"id":6294,"depth":542,"text":6295},"Learn how to automate Instagram in the browser with axiom.ai a no-code bot building tool",{"read":6052,"type":578,"tool":6323,"category":6324,"tags":6325,"location":587,"featuredimg":6328,"landingimg":6329,"summary":6330,"video":18,"metaTitle":6331},[580],[5787],[5789,6326,6327,1976,5068],"file uploads","file downloads","\u002Fblog\u002Fwebsite-actions-post.jpg","\u002Fblog\u002Fwebsite-actions-sq.jpg","Learn how web actions can be automated in the browser without code using axiom.ai an no-code browser automation tool","Automate web browser actions in chrome without code","\u002Fblog\u002Fautomate-browser-actions",{"title":6069,"description":6321},"blog\u002Fautomate-browser-actions","Aw0ju9KfUlIy9TEJJa95nGyLZxEWMqWfvu3UHiHIS0k",{"id":6337,"title":6338,"author":23,"body":6339,"date":6660,"description":6661,"draft":575,"extension":19,"meta":6662,"navigation":24,"path":6672,"seo":6673,"stem":6674,"__hash__":6675},"blog\u002Fblog\u002Ffill-out-forms-online.md","How to fill out forms online with a bot",{"type":8,"value":6340,"toc":6636},[6341,6344,6347,6350,6354,6357,6361,6364,6368,6371,6375,6382,6386,6393,6397,6400,6402,6405,6409,6418,6421,6427,6433,6437,6440,6446,6449,6474,6477,6481,6484,6487,6491,6494,6498,6501,6505,6508,6514,6518,6521,6524,6528,6531,6542,6548,6552,6555,6561,6564,6567,6571,6574,6578,6584,6586,6589,6592,6627,6630],[11,6342,6343],{},"Entering data and filling out lengthy forms rank among the most tedious tasks on the web. Transferring data from a Google Sheet into an input field can be monotonous. It's easy to become distracted or tired, leading to mistakes. Surely, I'm not the only one who has accidentally copied and pasted data from the wrong row.",[60,6345],{"alt":6346},"automate form filling with axiom.ai",[11,6348,6349],{},"Instead of enduring this dull routine of filling out forms, why not learn a new skill by creating a bot to automatically fill web forms? Let me show you how using our template as a starting point.",[63,6351,6353],{"id":6352},"what-is-a-form-filling-bot","What is a form-filling bot?",[11,6355,6356],{},"A form-filling bot isn't some high-tech robot equipped with arms, legs, and lasers, poised to take on the world of paperwork. Instead, it's clever software designed to tackle the mundane task of filling out online forms. Rather than having a human tediously type in data, a bot can swoop in, saving you from the time-consuming and soul-sucking drudgery of form-filling. And let's not forget that form-filling bots significantly boost efficiency. Since they never yawn, feel sleepy, or get bored, they're prone to making far fewer mistakes.",[63,6358,6360],{"id":6359},"how-do-bots-fill-forms","How do bots fill forms?",[11,6362,6363],{},"Bots, unlike humans, do not use keyboards to input data or mice to click 'submit.' Yet, they manage to fill in forms in a similar manner. Bots load web forms into the browser and interact with input fields to enter text. To submit a form, bots 'click' submit just like humans, but they achieve this through direct interaction with the browser's interface. They can mimic mouse actions by clicking on buttons, radio buttons, dropdown lists, and entering text. Furthermore, bots replicate keyboard behavior, navigating through form elements using tabbing or submitting forms with the return key.",[63,6365,6367],{"id":6366},"what-type-of-forms-could-bots-automate","What type of forms could bots automate?",[11,6369,6370],{},"Not all forms are the same, that is true. Some have just a couple of fields, others have pages to complete. But the underlying structure is all the same; form elements are made up of the same HTML elements and tend to follow a standard pattern. So the answer is yes, you can automate any type of form, from inputting social media posts into Amazon or Facebook to filling tax forms, a bot can do it.",[63,6372,6374],{"id":6373},"what-if-my-data-is-in-a-google-sheet-or-excel-sheet","What if my data is in a Google Sheet or Excel Sheet?",[11,6376,6377,6378,6381],{},"That simplifies the process; ",[39,6379,4988],{"href":6083,"rel":6380},[43]," offers no-code options for reading, writing, filtering, and deleting data in Google Sheets. Just choose your sheet. For Excel users, while we're developing similar features, you can convert Excel sheets to Google Sheets in the interim.",[63,6383,6385],{"id":6384},"how-to-make-a-form-filling-bot-without-code","How to make a form-filling bot without code?",[11,6387,6388,6389,6392],{},"No coding skills or magic required! If you can use a mouse, you can build a bot using ",[39,6390,4988],{"href":6083,"rel":6391},[43],"'s form filling software. Even better, I'll show you how to use our template for filling out forms online. This method allows you to quickly create a proof of concept in seconds, with the bot guiding you. Effortlessly, you can have a full bot built in minutes.",[129,6394,6396],{"id":6395},"install-axiom","Install Axiom",[11,6398,6399],{},"If you haven't installed Axiom yet, it consists of two components: a Chrome extension for building bots and a desktop app that allows you to run bots locally. To install Axiom, go to the Chrome Web Store, create your account, and then you'll be all set to use the template.",[129,6401,149],{"id":148},[11,6403,6404],{},"You will need to prepare a Google Sheet with some test data. Below is an example of how your data should be organized in rows. Obviously, tailor the data to fit the type of form you are automating.",[129,6406,6408],{"id":6407},"our-starting-point-will-be-a-template","Our starting point will be a template",[39,6410,6413,6414],{"href":6411,"target":6412},"\u002Fguides\u002Fdata-input-from-google-sheet","_blank","\n  ",[175,6415],{"src":6416,"alt":6417},"\u002Fblog\u002Fform-filling-template.png","template for data entry and form filling",[11,6419,6420],{},"The starting point for this bot build will be a core template. Core templates are design patterns for bot builds that can be applied to any website or, in this case, any web form. Using a template gives beginners an idea of how to create an Axiom.",[39,6422,6413,6423],{"href":6411,"target":6412},[175,6424],{"src":6425,"alt":6426},"\u002Fblog\u002Fform-filling-design-pattern-for-bot.png","combine steps shown in diagram to automate forms",[11,6428,6429,6430],{},"This is the online data entry bot design pattern we will start with, and it can be installed from this ",[39,6431,6432],{"href":6411},"template page.",[129,6434,6436],{"id":6435},"the-bot-will-guide-you-on-how-to-set-it-up","The bot will guide you on how to set it up",[11,6438,6439],{},"Have your Google Sheet ready; let's get this bot-building started! If you have not already installed the template for form-filling, please do so now. Once installed, the bot will guide you through the setup process outlined below. Just follow the instructions—it's as simple as that.",[39,6441,6413,6442],{"href":6411,"target":6412},[175,6443],{"src":6444,"alt":6445},"\u002Fblog\u002Fform-start-set-up.png","axiom.ai will help you set up you data entry bot",[11,6447,6448],{},"The first goal is to select a couple of 'Enter Text' fields and the 'Submit' button so we can do a quick test run before building the complete bot.",[187,6450,6451,6454,6457,6463,6468,6471],{},[190,6452,6453],{},"Step 1: 'Read Data from a Google Sheet' - Add your Google Sheet and then set your sheet name.",[190,6455,6456],{},"Step 2.1: ‘Go to page’ - Enter URL, Add the site's URL for data entry.",[190,6458,6459,6460,6462],{},"Step 2.2: ‘Enter Text’ - Click 'Select' to choose the text field where the bot should enter text. Then, for 'Enter Text', either manually add data or select '",[236,6461,238],{},"' to choose a data column.",[190,6464,6465,6466,6462],{},"Step 2.3: ‘Enter Text’ - Click 'Select' to choose the text field where the bot should enter text. Then, for 'Enter Text', either manually add data or select '",[236,6467,238],{},[190,6469,6470],{},"Step 2.4: ‘Click element’ - Click 'Select' and choose the form submit button to test the bot.",[190,6472,6473],{},"Step 2.5: ‘Delete rows’ from Google Sheet - This step deletes a row from the Google Sheet, ensuring the bot iterates over the subsequent row on its next loop. Please add your Google Sheet and specify its name.",[11,6475,6476],{},"You are probably thinking this bot does not have enough 'Enter Text' steps. Remember, we are testing first.",[63,6478,6480],{"id":6479},"your-mvp-bot-for-web-form-filling-is-ready-to-test","Your MVP bot for web form filling is ready to test",[11,6482,6483],{},"So the idea behind making an MVP is to test first, then when we know it works with your web form, we use Axiom’s bot builder to add the additional fields.",[11,6485,6486],{},"It's best this way. Always test, then build.",[63,6488,6490],{"id":6489},"completing-the-bot","Completing the bot",[11,6492,6493],{},"Ready to complete the bot, but it seems dauntingly hard? Well, it's not at all. Using the step finder, you can take additional steps to complete the job. It’s as simple as stacking the steps to replicate the form one-for-one. We have steps for all the form elements, from clicking to selecting lists, date pickers, and entering text.",[129,6495,6497],{"id":6496},"using-the-bot-builder","Using the bot builder",[11,6499,6500],{},"If this is your first time using axiom.ai, rest assured. Our user interface is incredibly intuitive—just point and click. Let's start with the fundamentals. The first thing you'll want to grasp is how to select and add steps using the step finder.",[129,6502,6504],{"id":6503},"steps-to-use-when-automating-forms","Steps to use when automating forms",[11,6506,6507],{},"The steps you will most likely want to use are the 'Interact' steps. These steps automate website actions such as clicking buttons, entering text, selecting lists, and uploading files.",[39,6509,6413,6510],{"href":6411,"target":6412},[175,6511],{"src":6512,"alt":6513},"\u002Fblog\u002Fstep-build.png","axiom.ai add interact steps with the step finder",[129,6515,6517],{"id":6516},"adding-steps","Adding steps",[11,6519,6520],{},"To start adding steps, simply click 'add-sub-step' or click between the steps to open the step finder. Then, simply type 'Interact' into the search field of the step finder. We recommend running test runs as you build. Add some steps, test, add some more, test—you get the idea.",[11,6522,6523],{},"If you are interested in learning more about the steps available for building bots, follow this link.",[129,6525,6527],{"id":6526},"moving-and-deleting-steps","Moving and deleting steps",[11,6529,6530],{},"You may want to move and duplicate steps; this is pretty simple. See the image below: click on the tick box inside any step on the left to enter 'Move and Duplicate' mode. In this mode you can:",[187,6532,6533,6536,6539],{},[190,6534,6535],{},"Highlight a step or steps with a tick, click between steps to duplicate or move the selected steps.",[190,6537,6538],{},"Delete, enable, or disable selected steps.",[190,6540,6541],{},"Move selected steps in a loop.",[39,6543,6413,6544],{"href":6411,"target":6412},[175,6545],{"src":6546,"alt":6547},"\u002Fblog\u002Fmove-delete-steps-form-entry.png","axiom.ai move steps to change the order",[63,6549,6551],{"id":6550},"looping-the-bot-to-automatically-fill-web-forms","Looping the bot to automatically fill web forms",[11,6553,6554],{},"You may have noticed that the bots' interact steps, which handle text entry, are all inside the 'Loop through data.' This is because, by default, this bot is set up to loop through rows of data, one row at a time.",[39,6556,6413,6557],{"href":6411,"target":6412},[175,6558],{"src":6559,"alt":6560},"\u002Fblog\u002Floop-form-entry.png","axiom.ai loop your bot",[11,6562,6563],{},"To control the loop, don’t change any settings in the 'Delete rows from Google Sheet' step. We want to delete a single row with each loop.",[11,6565,6566],{},"To control the number of rows processed in each run, in step 1 'Read data from a Google Sheet', set the first row and last row to control the number of rows processed in a single run.",[63,6568,6570],{"id":6569},"test-and-run-your-automate-web-form-filling-bot","Test and Run your automate web form filling bot",[11,6572,6573],{},"For testing, we always urge users to first run bots on the desktop. This is because issues are best resolved by observing runs, which helps inform you about what the issue is. Once your bot is ready, you can run it in the cloud. You may need to add steps to log in or set the cookies to be shared in the cloud.",[63,6575,6577],{"id":6576},"quick-note-on-iframes","Quick note on Iframes",[11,6579,6580,6581,13],{},"When selecting elements, you'll see a cyan selector instead of an orange one. This means the elements you wish to interact with are in an iframe. Not to worry, you just need to turn on iframe support. See how ",[39,6582,5158],{"href":6583},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fiframes",[63,6585,2878],{"id":2877},[11,6587,6588],{},"First up, core templates are an excellent starting point for creating bots to automate web form filling. They allow us to quickly develop a proof of concept without investing a lot of time in a new tool. We have also learned that we can use the step finder to add additional steps to the proof of concept; our initial bot can be fully customized to meet our needs. I have also learned that when selecting form elements on the page, if I see a blue selector, it's an iframe and I need to turn iframe support on. And yes, always test as steps are added.",[11,6590,6591],{},"Here’s a list of other core templates:",[187,6593,6594,6599,6605,6611,6616,6622],{},[190,6595,6596],{},[39,6597,4752],{"href":6598},"\u002Fguides\u002Fweb-scraping-looping-through-pages",[190,6600,6601],{},[39,6602,6604],{"href":6603},"\u002Fguides\u002Fzapier-forms","Data entry from Zap",[190,6606,6607],{},[39,6608,6610],{"href":6609},"\u002Fguides\u002Fchatgpt-web-scraper","ChatGPT web scraper",[190,6612,6613],{},[39,6614,6615],{"href":5157},"How to automate downloads",[190,6617,6618],{},[39,6619,6621],{"href":6620},"\u002Fguides\u002Fautomate-screenshots","How to automate screenshots",[190,6623,6624],{},[39,6625,6626],{"href":6411},"How to automate data entry from Google Sheet",[63,6628,6629],{"id":6024},"Do you have your idea for a bot?",[11,6631,6632,6633],{},"If this guide only partially meets your needs and you have an idea for a bot you'd like to build, apply the skills you've learned and try it. If you need assistance, don't hesitate to contact our ",[39,6634,6635],{"href":521},"customer support team.",{"title":15,"searchDepth":16,"depth":16,"links":6637},[6638,6639,6640,6641,6642,6648,6649,6655,6656,6657,6658,6659],{"id":6352,"depth":542,"text":6353},{"id":6359,"depth":542,"text":6360},{"id":6366,"depth":542,"text":6367},{"id":6373,"depth":542,"text":6374},{"id":6384,"depth":542,"text":6385,"children":6643},[6644,6645,6646,6647],{"id":6395,"depth":16,"text":6396},{"id":148,"depth":16,"text":149},{"id":6407,"depth":16,"text":6408},{"id":6435,"depth":16,"text":6436},{"id":6479,"depth":542,"text":6480},{"id":6489,"depth":542,"text":6490,"children":6650},[6651,6652,6653,6654],{"id":6496,"depth":16,"text":6497},{"id":6503,"depth":16,"text":6504},{"id":6516,"depth":16,"text":6517},{"id":6526,"depth":16,"text":6527},{"id":6550,"depth":542,"text":6551},{"id":6569,"depth":542,"text":6570},{"id":6576,"depth":542,"text":6577},{"id":2877,"depth":542,"text":2878},{"id":6024,"depth":542,"text":6629},"2024-04-14","Learn how to automate form filling tasks in the browser in minutes without code",{"read":6663,"type":578,"tool":6664,"category":6665,"tags":6666,"location":587,"featuredimg":6668,"landingimg":6669,"summary":6670,"video":18,"metaTitle":6671},"6 min read",[580],[2915],[1977,6667,1976],"form filling","\u002Fblog\u002Fwebform-post.jpg","\u002Fblog\u002Fwebform-sq.jpg","Learn how to automate form filling with axiom.ai a no-code bot building tool.","automate form filling","\u002Fblog\u002Ffill-out-forms-online",{"title":6338,"description":6661},"blog\u002Ffill-out-forms-online","x8ho3Nf7KDShjhHYeABK9NPG8FbD8CClU-tVWvyolRY",{"id":6677,"title":6678,"author":23,"body":6679,"date":6973,"description":6974,"draft":575,"extension":19,"meta":6975,"navigation":24,"path":6985,"seo":6986,"stem":6987,"__hash__":6988},"blog\u002Fblog\u002Frpa-tools.md","The best RPA tools for small and large businesses",{"type":8,"value":6680,"toc":6956},[6681,6684,6687,6690,6694,6697,6701,6704,6708,6716,6720,6727,6731,6734,6738,6741,6745,6748,6760,6764,6774,6777,6789,6793,6796,6800,6803,6815,6819,6831,6835,6847,6851,6863,6867,6870,6874,6877,6888,6890,6902,6906,6918,6922,6925,6929,6932,6936,6939,6943,6946,6950,6953],[11,6682,6683],{},"RPA tools can save businesses, both large and small, time and money by automating repetitive tasks that humans just don’t like doing. Unfortunately, RPA is not as simple as flicking a switch and having the process automated. If you have never worked with RPA tools before, you will need to learn a few things in order to pick the right tool for you and your business.",[60,6685],{"alt":6686},"The best RPA tools on the market",[11,6688,6689],{},"There are many tools to choose from, including those designed to serve mammoth enterprise companies, often subject to hefty license fees. Then there are the RPA tools targeted for SMEs, featuring low-code and no-code options, and even RPA tools with AI capabilities. By the end of this article, you should have a clear picture of which tool is right for you.",[63,6691,6693],{"id":6692},"what-is-rpa","What is RPA?",[11,6695,6696],{},"Robotic Process Automation (RPA) is a technology that automates mundane tasks humans typically perform on computers, like form filling and repetitive clicking. It involves programming software robots, or \"bots,\" to mimic human interactions with software, thereby handling tasks such as entering data, processing transactions, or generating reports. RPA saves time, reduces the likelihood of errors, and frees employees to focus on more creative and strategic tasks. While RPA is extensively used in large enterprises to enhance efficiency, its adoption in small businesses and SMEs, as well as in less tech-heavy industries, is less widespread.",[63,6698,6700],{"id":6699},"how-can-rpa-help-my-business","How can RPA help my business?",[11,6702,6703],{},"RPA can significantly boost your business by automating routine and repetitive tasks, allowing employees to focus on more complex and strategic activities. This shift can lead to increased productivity as bots work faster and can operate around the clock. Additionally, RPA improves accuracy by minimizing human errors in tasks like data entry, ultimately enhancing the quality of work and reducing the likelihood of costly mistakes. Implementing RPA also leads to cost savings by lowering the need for manual labor and reducing operational costs. Overall, RPA can streamline processes, increase efficiency, and offer a quick return on investment, making it a valuable tool for businesses looking to optimize operations.",[63,6705,6707],{"id":6706},"how-expensive-are-rpa-tools","How expensive are RPA tools?",[11,6709,6710,6711,6715],{},"The cost of RPA software tools can vary widely based on the scale of implementation, the complexity of the tasks, and the specific needs of a business. RPA costs can range from $10,000 to millions for enterprise customers once you factor in consultancy and license fees. Not hampered by the enterprise selection processes, enjoy a broader choice and more competitive pricing. This includes RPA agencies offering full services at a cost, open-source RPA products free from license fees (though development fees may apply), and self-serve RPA tools like ",[39,6712,4988],{"href":6713,"rel":6714},"http:\u002F\u002Faxiom.ai\u002F",[43],", which start at as little as $15 per month. This diversity ensures the tools servicing the small business sector are innovative and constantly evolving to meet customer needs.",[63,6717,6719],{"id":6718},"do-i-need-to-be-an-expert-to-use-rpa","Do I need to be an expert to use RPA?",[11,6721,6722,6723,6726],{},"If you choose the right tool, you will not need to be an expert to implement RPA technology to automate your business. Enterprise RPA vendors such as UiPath and Automation Anywhere allow you to run and manage your own bots; however, building complex automations will likely require hiring an agency with trained RPA engineers. For open-source tools like Robocorp, you would also need to hire an RPA engineer to implement any bots in your business. On the other hand, tools like ",[39,6724,4988],{"href":6713,"rel":6725},[43]," are self-serve platforms designed to enable you to create your own bots to automate browser tasks. While there is a learning curve—since the browser can be a challenging environment for creating automations—you do not need to be a coder to use these tools.",[63,6728,6730],{"id":6729},"in-the-age-of-ai-is-rpa-still-relevant","In the Age of AI, is RPA still relevant?",[11,6732,6733],{},"AI is buzzing, but Robotic Process Automation (RPA) remains highly relevant and plays a crucial role in automation strategies. While AI introduces advanced capabilities like natural language processing, RPA excels at automating software interactions. What is truly exciting is the integration of AI with RPA, referred to as Intelligent Automation in enterprise settings. AI enhances RPA's capabilities by enabling it to handle more sophisticated tasks that involve unstructured data and adaptive responses. This merging of technologies allows businesses to automate an even broader spectrum of processes, increasing efficiency and innovation.",[63,6735,6737],{"id":6736},"types-of-rpa-tools-on-the-market","Types of RPA tools on the market",[11,6739,6740],{},"It will come as no surprise that there is an RPA tool to suit any type of business. From long-tail businesses looking to automate and empower themselves to mammoth enterprise companies looking to save time on millions of processes, there are probably three core categories to consider: self-serve, open-source, and enterprise.",[63,6742,6744],{"id":6743},"self-serve-rpa-tools","Self-serve RPA tools",[11,6746,6747],{},"Self-serve RPA tools that require no licensing fees can be a cost-effective option for businesses looking to automate simple processes without a significant initial investment. These tools are typically open-source or offer a freemium model where basic functionalities are free, and users only pay for premium features. Examples include:",[187,6749,6750],{},[190,6751,6752,6759],{},[49,6753,6754],{},[39,6755,6758],{"href":6756,"rel":6757},"https:\u002F\u002Fwww.microsoft.com\u002Fen-gb\u002Fpower-platform\u002Fproducts\u002Fpower-automate",[43],"Microsoft Power Automate"," - Focusing on integrating and automating workflows across Microsoft applications, it's a powerful tool for businesses.",[175,6761],{"src":6762,"alt":6763},"\u002Fblog\u002Frpa-tool-microsoft-power-automate.jpg","rpa tool power automate",[187,6765,6766],{"start":542},[190,6767,6768,6773],{},[49,6769,6770],{},[39,6771,4988],{"href":6772},"\u002F"," - A no-code tool for anyone to create browser automations. Aimed at users who want to implement their own solutions. Charges based on runtime. Free to try.",[175,6775],{"src":5580,"alt":6776},"rpa tool axiom.ai",[187,6778,6779],{"start":16},[190,6780,6781,6788],{},[49,6782,6783],{},[39,6784,6787],{"href":6785,"rel":6786},"https:\u002F\u002Fwww.autohotkey.com\u002F",[43],"AutoHotkey"," - Although not a traditional RPA tool, AutoHotkey allows for scripting and automation of the Windows GUI and can be used for simple automation tasks without any cost.",[175,6790],{"src":6791,"alt":6792},"\u002Fblog\u002Frap-auto-hotkey.jpg","rpa tool auto hotkey",[11,6794,6795],{},"These tools typically offer community support and documentation, enabling businesses to start automating with minimal assistance. However, for advanced features, enterprise-level security, and dedicated support, investing in a paid license might be necessary as your needs evolve.",[129,6797,6799],{"id":6798},"open-source-tools","Open Source Tools",[11,6801,6802],{},"Open-source RPA tools empower businesses with the flexibility of customization and the benefit of avoiding licensing fees. This makes them a popular choice for businesses that can develop solutions in-house, putting them in control of their automation technology. Here are several notable open-source RPA tools:",[187,6804,6805],{},[190,6806,6807,6814],{},[49,6808,6809],{},[39,6810,6813],{"href":6811,"rel":6812},"https:\u002F\u002Frobocorp.com\u002F",[43],"Robocorp"," - A new entrant in the RPA market, Robocorp utilizes an open-source stack and is built on Python.",[175,6816],{"src":6817,"alt":6818},"\u002Fblog\u002Frobocorp.jpg","rpa tool robocorp",[187,6820,6821],{"start":542},[190,6822,6823,6830],{},[49,6824,6825],{},[39,6826,6829],{"href":6827,"rel":6828},"https:\u002F\u002Fgithub.com\u002Fsaucepleez\u002Ftaskt",[43],"Taskt (formerly sharpRPA)"," - Taskt is built using C# and provides a user-friendly platform to automate Windows-based tasks. It's geared towards developers with a technical background.",[175,6832],{"src":6833,"alt":6834},"\u002Fblog\u002Ftaskt.jpg","rpa tool Taskt",[187,6836,6837],{"start":16},[190,6838,6839,6846],{},[49,6840,6841],{},[39,6842,6845],{"href":6843,"rel":6844},"https:\u002F\u002Faisingapore.org\u002Faiproducts\u002Ftagui\u002F",[43],"TagUI"," - Designed to be a straightforward tool for automating web interactions and desktop applications. It uses simple syntax for scripting, which can be easily learned by those new to programming.",[175,6848],{"src":6849,"alt":6850},"\u002Fblog\u002Ftgaui.jpg","rpa tool tgaui",[187,6852,6853],{"start":571},[190,6854,6855,6862],{},[49,6856,6857],{},[39,6858,6861],{"href":6859,"rel":6860},"https:\u002F\u002Fopenrpa.dk\u002Fopenrpa",[43],"OpenRPA"," - An open-source RPA tool that offers a comprehensive suite for automation. OpenRPA is designed to be user-friendly, making it accessible for both technical and non-technical users.",[175,6864],{"src":6865,"alt":6866},"\u002Fblog\u002Fopenrpa.jpg","rpa tool OpenRPA",[11,6868,6869],{},"These tools generally have active communities and provide documentation to help users get started with automation. They are particularly suitable for organizations that have some technical expertise in-house and are looking to reduce costs.",[129,6871,6873],{"id":6872},"enterprise-rpa-tools","Enterprise RPA Tools",[11,6875,6876],{},"Enterprise Robotic Process Automation (RPA) tools support large-scale implementations, offering robust features that cater to complex automation needs, high levels of security, scalability, and comprehensive customer support. Here are some of the leading enterprise RPA tools:",[187,6878,6879],{},[190,6880,6881,6887],{},[49,6882,6883],{},[39,6884,5670],{"href":6885,"rel":6886},"https:\u002F\u002Fwww.uipath.com\u002F",[43]," - One of the most popular RPA solutions, UiPath offers a highly intuitive and visual approach to building automation workflows. It supports a wide range of process complexity and integrates seamlessly with numerous enterprise systems.",[175,6889],{"src":5676,"alt":5677},[187,6891,6892],{"start":542},[190,6893,6894,6901],{},[49,6895,6896],{},[39,6897,6900],{"href":6898,"rel":6899},"https:\u002F\u002Fwww.blueprism.com\u002F",[43],"BluePrism"," - Known for its strong enterprise-grade features, Blue Prism emphasizes security and compliance, making it a preferred choice for industries like banking and finance. It provides a model that is scalable and capable of handling a high volume of processes simultaneously.",[175,6903],{"src":6904,"alt":6905},"\u002Fblog\u002Fblueprism.jpg","rpa tool Blurprism",[187,6907,6908],{"start":16},[190,6909,6910,6917],{},[49,6911,6912],{},[39,6913,6916],{"href":6914,"rel":6915},"https:\u002F\u002Fwww.automationanywhere.com\u002F",[43],"Automation Anywhere"," - This tool combines traditional RPA with cognitive elements like natural language processing and reading unstructured data. Automation Anywhere is user-friendly for non-developers and robust enough for complex enterprise tasks.",[175,6919],{"src":6920,"alt":6921},"\u002Fblog\u002Fautomationanywhere.jpg","rpa tool Automation Anywhere",[11,6923,6924],{},"These enterprise RPA tools provide not only the technology to automate tasks but also the analytical tools to monitor and optimize the performance of bots. They are typically backed by strong vendor support and a vast partner ecosystem to ensure successful deployment and operation.",[63,6926,6928],{"id":6927},"wrapping-up-choosing-the-right-rpa-tool-for-your-business","Wrapping up: Choosing the Right RPA Tool for Your Business",[11,6930,6931],{},"When choosing your solution, ignoring any specific feature requirements, there are three key considerations: cost, implementation, and security.",[129,6933,6935],{"id":6934},"cost","Cost",[11,6937,6938],{},"If you are a small business looking to implement RPA, enterprise solutions are likely not for you. While they offer excellent tools, the licensing fees and developer costs can be prohibitive. Small businesses with technical skills should look at self-serve tools or possibly explore open-source options. However, if you are a large-scale business looking to automate processes worth millions, enterprise solutions are most likely a good fit. That said, self-serve or RPA tools may be worth considering for smaller processes or for prototyping MVPs to quickly assess the impact of automation.",[129,6940,6942],{"id":6941},"implementation","Implementation",[11,6944,6945],{},"When it comes to implementation, if you are a citizen automator or enjoy tinkering with tools such as Zapier and e-commerce platforms, the self-serve market is a good fit. You can create bots and implement the solutions yourself without needing to code. However, if you lack technical skills, you may want to consider hiring a bot builder to create the automations for you. If you're a large company looking for a comprehensive review of your processes, implementation, and ongoing management of automations, then enterprise or open source solutions are ideal.",[129,6947,6949],{"id":6948},"security","Security",[11,6951,6952],{},"Security is perhaps the most important consideration, especially if customer data is part of the processes you wish to automate. Self-serve tools will most likely not come with the certifications that enterprise solutions offer. Security may even be a blocker for large companies using self-serve tools or open-source options. However, enterprise-grade security comes at a higher cost. When choosing a tool and considering your security needs, it’s essential to think about the data involved in the processes. If sensitive data is involved, you must select a secure tool. The good news is that security can be just as robust on self-serve, open-source, and enterprise platforms. For example, self-serve solutions and open-source options can be installed on your own computers, and with the right setup, processing data on your own network can meet the most stringent security requirements.",[11,6954,6955],{},"If you have not tried RPA before and are looking to create an MVP, self-serve tools can be a great way to get started without investing too much money and time, suitable for both large and small businesses.",{"title":15,"searchDepth":16,"depth":16,"links":6957},[6958,6959,6960,6961,6962,6963,6964,6968],{"id":6692,"depth":542,"text":6693},{"id":6699,"depth":542,"text":6700},{"id":6706,"depth":542,"text":6707},{"id":6718,"depth":542,"text":6719},{"id":6729,"depth":542,"text":6730},{"id":6736,"depth":542,"text":6737},{"id":6743,"depth":542,"text":6744,"children":6965},[6966,6967],{"id":6798,"depth":16,"text":6799},{"id":6872,"depth":16,"text":6873},{"id":6927,"depth":542,"text":6928,"children":6969},[6970,6971,6972],{"id":6934,"depth":16,"text":6935},{"id":6941,"depth":16,"text":6942},{"id":6948,"depth":16,"text":6949},"2024-04-03","What are the best RPA tools for small and large businesses and how to select ther right RPAL tool for yoou.",{"read":5343,"type":578,"tool":6976,"category":6977,"tags":6978,"location":587,"featuredimg":6981,"landingimg":6982,"summary":6983,"video":18,"metaTitle":6984},[580],[5787],[816,6979,6980],"rpa","bots","\u002Fblog\u002Frpa-post.jpg","\u002Fblog\u002Frpa-sq.jpg","Find out what are the best RPA tools for small and large businesses and how to select ther right RPAL tool for yoou.","RPA tools for businesses large and small","\u002Fblog\u002Frpa-tools",{"title":6678,"description":6974},"blog\u002Frpa-tools","NsUaZIEft0aVwue6eblPI20AOrvtAl_O7zG5n6fMXpA",{"id":6990,"title":6991,"author":23,"body":6992,"date":7244,"description":6321,"draft":575,"extension":19,"meta":7245,"navigation":24,"path":7255,"seo":7256,"stem":7257,"__hash__":7258},"blog\u002Fblog\u002Finstagram-bots.md","How to create Instagram bots in minutes",{"type":8,"value":6993,"toc":7225},[6994,6997,7000,7003,7007,7010,7014,7017,7021,7024,7027,7031,7034,7038,7042,7045,7052,7056,7060,7063,7073,7077,7080,7090,7094,7097,7107,7111,7114,7118,7122,7125,7135,7139,7142,7145,7164,7168,7175,7179,7182,7184,7187,7190,7194,7202,7205,7208,7214,7218,7223],[11,6995,6996],{},"Instagram is one heck of a marketing platform, where influencers excel in driving product adoption and sales. However, behind the glitz and glamour lies the demanding work of constant navigating, uploading, liking, and copy-pasting, all essential for maintaining an active and engaging presence. For those looking to streamline these repetitive tasks, Instagram bots provide a practical solution by automating such interactions.",[60,6998],{"alt":6999},"How to create instagram bots to automate your dialy tasks",[11,7001,7002],{},"Keep reading to discover five Instagram bots that anyone can set up in minutes.",[63,7004,7006],{"id":7005},"what-is-an-instagram-bot","What is an Instagram bot?",[11,7008,7009],{},"It's a cousin of the robot; just like a robot, it has a program and carries out the tasks its program tells it to. It does not, however, have arms and legs; it cannot do backflips or shoot lasers. The bots mimic us when they are running, and it's like watching yourself do the work. Instagram opens up, and the bot starts interacting with the UI like we do. It is worth noting that you can use bots to automate any web-based app, not just Instagram.",[63,7011,7013],{"id":7012},"what-can-instagram-bots-automate","What can Instagram bots automate?",[11,7015,7016],{},"Significantly, our bots automate via the user interface in the browser app; we currently do not provide support to automate the mobile app. That still leaves us plenty to automate. You can use bots to automate various tasks, from interacting with posts and liking content to scraping search pages and sending DMs. You can also create bots to interact with features like Reels and Threads. If you keep scrolling, we have some Instagram bot templates for you, such as a bot that sends DMs.",[63,7018,7020],{"id":7019},"can-anyone-make-an-instagram-bot-in-five-minutes","Can anyone make an Instagram bot in five minutes?",[11,7022,7023],{},"We have a range of bot templates to select from, which can be set up in minutes to automate Instagram. To set them up, you will need a Google Sheet and an axiom.ai account. FYI, all new accounts come with 60 minutes of runtime, so you can test all these bot templates for free.",[11,7025,7026],{},"The best part is we guide you every step of the way. So, select a template from the ones listed below and start using Instagram bots.",[129,7028,7030],{"id":7029},"instagram-message-bot","Instagram message bot",[11,7032,7033],{},"This bot template automates Instagram Messages from profile pages, mimicking human interaction. It opens profile URLs from a Google Sheet in Chrome, checks for the 'Message' button, clicks it, types the Messages, and sends it, then moves to the next row in the Sheet.",[175,7035],{"alt":7036,"src":7037},"axiom.ai design pattern for automating messages in Instagram","\u002Fblog\u002Fdesign-pattern-automate-messages.png",[63,7039,7041],{"id":7040},"instagram-post-bot","Instagram Post bot",[11,7043,7044],{},"This Instagram bot posts content from a Google Sheet to your Instagram without requiring an API. The bot retrieves data from the Sheet, opens Instagram in Chrome, clicks 'create', and inputs the data into the Instagram post web form, which is your human actions. After clicking confirm, the bot removes the processed row from the Sheet.",[11,7046,7047,7048],{},"Click here to install an ",[39,7049,7051],{"href":7050},"\u002Fguides\u002Finstagram-post","Instagram Post bot.",[175,7053],{"alt":7054,"src":7055},"axiom.ai design pattern for automating post on Instagram","\u002Fblog\u002Finstgram-post-pot-design-pattern.png",[63,7057,7059],{"id":7058},"instagram-dm-and-like-bot","Instagram DM and like bot",[11,7061,7062],{},"This bot automates Instagram DMs from profile pages, mimicking human interaction. It opens profile URLs from a Google Sheet in Chrome, checks for the 'Message' button, clicks it, types the DM, and sends it. After that, the bot returns to the profile page, clicking on the first post and liking it.",[11,7064,7065,7066,7069],{},"Click here to install our NEW one-click setup ",[39,7067,7068],{"href":172},"Instagram DM and like bot.",[175,7070],{"alt":7071,"src":7072},"axiom.ai design pattern for instgram dm and like bot","\u002Fblog\u002Fdesign-pattern-instagram.png",[63,7074,7076],{"id":7075},"instagram-search-bot","Instagram search bot",[11,7078,7079],{},"This bot automates Instagram search scraping: it takes search terms from a Google Sheet, appends them to Instagram's search URL, loads the search pages in Chrome, scrapes post links, saves them to a Sheet, deletes processed rows, and repeats with new search terms.",[11,7081,7047,7082,7086],{},[39,7083,7085],{"href":7084},"\u002Fguides\u002Finstagram-scrape-post-links","Instagram search bot.",[175,7087],{"alt":7088,"src":7089},"axiom.ai design pattern for scraping search bot","\u002Fblog\u002Fdesign-pattern-insta-search.png",[63,7091,7093],{"id":7092},"instagram-hashtag-scraper","Instagram hashtag scraper",[11,7095,7096],{},"This bot template scrapes Instagram hashtag pages using a bot. The bot opens a hashtag page in Chrome, collects links to all posts, and extracts each user's handle and profile link. It records the post URLs, handles, and profile URLs into a Google Sheet.",[11,7098,7047,7099,7103],{},[39,7100,7102],{"href":7101},"\u002Fguides\u002Finstagram-scrape-users-from-hashtag","Instagram hashtag scraper bot.",[175,7104],{"alt":7105,"src":7106},"axiom.ai design pattern for scraping hashtags bot","\u002Fblog\u002Fdesign-pattern-scrape-hash-insta.png",[63,7108,7110],{"id":7109},"instagram-follow-and-message","Instagram follow and message",[11,7112,7113],{},"This bot template automates clicking 'follow' then sending a message. It opens profile URLs from a Google Sheet in Chrome, clicks 'follow' then sends a message.",[175,7115],{"alt":7116,"src":7117},"axiom.ai instagram bot that follows and send message","\u002Fblog\u002Finstagram-bot-send-message-follow-design-pattern.png",[63,7119,7121],{"id":7120},"instagram-scrape-users-from-likes","Instagram scrape users from likes",[11,7123,7124],{},"Our last Instagram bot scrapes post likes for user handles and profile links, limited to 100 per post by Instagram. It reads a post link from Google Sheets, opens it in Chrome, likes the post, and scrapes the user data. Afterwards, it deletes the row from Google Sheets and moves on to the next post.",[11,7126,7047,7127,7131],{},[39,7128,7130],{"href":7129},"\u002Fguides\u002Fscrape-likes-from-instagram-posts","Instagram scrape users from likes bot.",[175,7132],{"alt":7133,"src":7134},"axiom.ai instagram bot that scrapes user handles from likes","\u002Fblog\u002Fbot-scrape-likers-post-design-pattern.png",[63,7136,7138],{"id":7137},"can-i-make-a-custom-instagram-bot","Can I make a custom Instagram bot?",[11,7140,7141],{},"Yes, you can. Building a bot from scratch is simple enough and can take minutes when you know what you're doing. You could also customize a bot from the list of templates above. Adapting templates and studying their design patterns is an excellent way to learn axiom.ai.",[11,7143,7144],{},"Here are some vanilla-starter templates you may want to start with:",[187,7146,7147,7153],{},[190,7148,7149,7150],{},"Click to start with a basic ",[39,7151,7152],{"href":6598},"web scraper bot.",[190,7154,7155,7156,7159,7160],{},"Start with this ",[39,7157,7158],{"href":6411},"Enter data bot","3. Press to create a bot that ",[39,7161,7163],{"href":7162},"\u002Fguides\u002Fupload-files-from-a-google-sheet","uploads files.",[63,7165,7167],{"id":7166},"can-axiomai-make-me-an-instagram-bot","Can axiom.ai make me an Instagram bot ?",[11,7169,7170,7171,7174],{},"We love making bots; we have made bots for pretty much all the social media platforms and beyond. Even better, we love a challenge, so if you have an idea for an Instagram bot template, reach out via ",[39,7172,7173],{"href":521},"support."," We may well build it for you.",[63,7176,7178],{"id":7177},"would-using-instagram-bots-get-me-blocked","Would using Instagram bots get me blocked?",[11,7180,7181],{},"Yes, you could be the honest answer, but if you use your bots responsibly to automate your work and don't exceed Instagram's web call limits, you will not encounter any issues. If you are the type of user looking to build a large-scale bot farm, then axiom.ai is not the tool for you.",[63,7183,2878],{"id":2877},[11,7185,7186],{},"In conclusion, Instagram bots offer a powerful solution for automating tedious, repetitive tasks on one of the most influential marketing platforms today. From scheduling posts and liking content to scraping data and automating direct messages, these bots can do it all, directly through the browser interface. We've shown that with a range of bot templates and a little guidance, anyone can start automating Instagram tasks in minutes, making their social media management more efficient and effective.",[11,7188,7189],{},"Whether you're a beginner looking to dive into the world of automation with pre-made templates or an experienced developer eager to build or customize your own bots, there's a path for you. axiom.ai provides the tools and support you need to harness the power of automation without the risk of getting blocked, as long as you operate within Instagram's guidelines.",[63,7191,7193],{"id":7192},"if-you-are-stuck-reach-out-and-we-will-help","If you are stuck, reach out, and we will help.",[11,7195,7196,7197,7201],{},"If you are unsure how to get started or need any assistance, please feel free to reach out to me at ",[39,7198,7200],{"href":7199},"mailto:alex@axiom.ai","alex@axiom.ai",". I would be more than happy to help you.",[11,7203,7204],{},"Let's make the digital world error-free and full of creativity together! 🚀",[11,7206,7207],{},"Try Axiom with two hours of free runtime.",[11,7209,7210],{},[39,7211,7213],{"href":140,"rel":7212},[43],"Install Chrome Extension",[63,7215,7217],{"id":7216},"got-a-great-idea-for-a-bot-share-it-with-me","Got a great idea for a bot? Share it with me!",[11,7219,7220,7221,7201],{},"If you have an excellent idea, then you are in luck! New Axiom accounts come with 60 minutes of free runtime for experimentation. If you are unsure how to get started or need any assistance, please feel free to reach out to me at ",[39,7222,7200],{"href":7199},[11,7224,7204],{},{"title":15,"searchDepth":16,"depth":16,"links":7226},[7227,7228,7229,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243],{"id":7005,"depth":542,"text":7006},{"id":7012,"depth":542,"text":7013},{"id":7019,"depth":542,"text":7020,"children":7230},[7231],{"id":7029,"depth":16,"text":7030},{"id":7040,"depth":542,"text":7041},{"id":7058,"depth":542,"text":7059},{"id":7075,"depth":542,"text":7076},{"id":7092,"depth":542,"text":7093},{"id":7109,"depth":542,"text":7110},{"id":7120,"depth":542,"text":7121},{"id":7137,"depth":542,"text":7138},{"id":7166,"depth":542,"text":7167},{"id":7177,"depth":542,"text":7178},{"id":2877,"depth":542,"text":2878},{"id":7192,"depth":542,"text":7193},{"id":7216,"depth":542,"text":7217},"2024-03-24",{"read":5343,"type":578,"tool":7246,"category":7247,"tags":7248,"location":587,"featuredimg":7251,"landingimg":7252,"summary":7253,"video":18,"metaTitle":7254},[580],[6055],[6980,585,7249,584,7250],"post","scrape","\u002Fblog\u002Finstagram-bots-post.jpg","\u002Fblog\u002Finstagram-sq.jpg","Learn how to automate Instagram in the browser with axiom.ai a no-code bot building tool.","Anyone can automate Instagram with bots","\u002Fblog\u002Finstagram-bots",{"title":6991,"description":6321},"blog\u002Finstagram-bots","IJrGMY1dO8HbHaAmgLzBpkSfv5JBIrZSVmeEKw2JqMI",{"id":7260,"title":7261,"author":23,"body":7262,"date":7556,"description":7557,"draft":575,"extension":19,"meta":7558,"navigation":24,"path":7568,"seo":7569,"stem":7570,"__hash__":7571},"blog\u002Fblog\u002Fdownload-files-from-a-link.md","How to download files from a URL in Chome",{"type":8,"value":7263,"toc":7527},[7264,7267,7270,7277,7281,7288,7292,7295,7299,7306,7310,7313,7317,7320,7324,7327,7330,7334,7337,7341,7345,7348,7352,7355,7358,7362,7366,7369,7374,7378,7381,7392,7396,7399,7403,7407,7409,7413,7417,7419,7433,7437,7440,7444,7448,7451,7460,7464,7467,7471,7474,7477,7481,7484,7488,7492,7495,7499,7506,7508,7511,7514,7517,7521,7525],[11,7265,7266],{},"Many of us work predominantly within a browser, frequently engaging in repetitive tasks like downloading files. However, these tasks can easily be automated, without having to write any code. Using our no-code bot-building tool, you can simply point and click to create a bot that automates file downloads from a URL to your computer or Google Drive or directly from a URL.",[60,7268],{"alt":7269},"How to autoamte file downloads with axiom.ai",[11,7271,7272,7273,7276],{},"Let us teach you how to build a bot, but if you're in a hurry, try using our ",[39,7274,7275],{"href":5157},"template for file downloads."," Give it a try, and work smarter!",[63,7278,7280],{"id":7279},"what-is-a-download-bot","What is a Download bot?",[11,7282,7283,7284,7287],{},"A download bot is a straightforward program you can create without coding to automate user interface interactions, specifically clicking and downloading files. This saves you time and effort. Such a bot operates within the Chrome browser, facilitating ",[39,7285,6327],{"href":7286},"\u002Fdocs\u002Ftutorials\u002Ffiles"," to your local drive or Google Drive.",[63,7289,7291],{"id":7290},"what-could-i-use-these-download-bots-for","What could I use these download bots for?",[11,7293,7294],{},"You can use bots to download files, but what might not be so obvious is that you can create a bot to automate downloading files from behind a login. Yes, bots can download files from nearly any web application to your local folder or Google Drive. You can add steps for the bot to enter data and interact with buttons to generate files for downloading. File download bots are versatile, supporting many use cases from content migration to reporting and even social media or e-commerce.",[63,7296,7298],{"id":7297},"can-anyone-make-a-file-bot-to-download","Can anyone make a file bot to download?",[11,7300,7301,7302,7305],{},"Not a coder or have never automated anything before? Don't worry—it's quite simple and doesn't require writing a single line of code. axiom.ai offers a user-friendly point-and-click interface, making it quick and easy to set up a bot like this in just a few minutes. Plus, we're here to guide you through the process, especially if you use one of our ",[39,7303,7304],{"href":5157},"download file templates"," for local drive or Google Drive.",[63,7307,7309],{"id":7308},"how-do-the-bots-work","How do the bots work?",[11,7311,7312],{},"Guess what? The bots work just like you would—they open up the website URL you give them, click on the button, and download the file. They don't get bored or distracted like we do.",[63,7314,7316],{"id":7315},"make-your-download-bot-in-minutes","Make your download bot in minutes",[11,7318,7319],{},"So, if you love learning new tricks, read on! I will show you how to make a download bot for yourself, and it's pretty easy. By the end, you'll have picked up a new automation skill. Let's dive in and get you started on learning this new skill.",[63,7321,7323],{"id":7322},"getting-started-withaxiomaisbot-builder-interface","Getting started with axiom.ai's bot builder interface",[11,7325,7326],{},"If this is your first time using Axiom, don't worry. Our user interface is as simple as point-and-click. I'll walk you through it step by step. First off, the basics are very straightforward. You select steps that replicate the actions you wish to automate, combining those steps to create a bot that automates your task.",[11,7328,7329],{},"Lets teach you some basics first.",[129,7331,7333],{"id":7332},"starting-point","Starting point",[11,7335,7336],{},"In the following examples we will start from blank by clicking 'Add first step'.",[175,7338],{"alt":7339,"src":7340},"axiom.ai getting started making a bot","\u002Fblog\u002Faxiom-first-step.jpg",[129,7342,7344],{"id":7343},"use-the-step-finder-to-search-for-and-add-steps","Use the step finder to search for and add steps",[11,7346,7347],{},"The step finder will pop-up. We use this to find and select the steps we require to replicate our use case",[175,7349],{"alt":7350,"src":7351},"axiom.ai step finder ui","\u002Fblog\u002Fstep-finder.jpg",[11,7353,7354],{},"You can click 'Add step' or between steps to open the step finder.",[11,7356,7357],{},"This will be easy; we only need to add two steps to create a download bot. We can make three types of download bots, all without using any code. We can make bots to download files locally, to Google Drive, or from a URL.",[63,7359,7361],{"id":7360},"lets-start-with-a-bot-that-downloads-files-locally","Let's start with a bot that downloads files locally",[129,7363,7365],{"id":7364},"_1-add-your-first-step-go-to-page"," 1. Add your first step, 'Go to page'",[11,7367,7368],{},"Click the 'Add first step' button. Using the Step Finder search for 'Go to page' and click to add.",[187,7370,7371],{},[190,7372,7373],{},"Enter URL - Insert the url of the page you wish to download files from",[129,7375,7377],{"id":7376},"_2-add-your-final-step-download-files","2. Add your final step, 'Download files'",[11,7379,7380],{},"Click the 'Add step' button below the 'Go to page' step. Using the Step Finder search for 'Download files' and click to add.",[187,7382,7383,7386,7389],{},[190,7384,7385],{},"Select - Click 'Select' to choose the files to download",[190,7387,7388],{},"Folder - Set a folder to download into (please note currently only one new folder can be created at a time)",[190,7390,7391],{},"File name - Enter a name to save the files as",[175,7393],{"alt":7394,"src":7395},"axiom.ai making download file bot","\u002Fblog\u002Fdownload-bot.jpg",[11,7397,7398],{},"Thats it your download bot is complete. Ready to test.",[63,7400,7402],{"id":7401},"now-create-a-bot-that-downloads-files-onto-your-google-drive","Now create a bot that downloads files onto your Google Drive",[129,7404,7406],{"id":7405},"_1-add-your-first-step-go-to-page-1","1. Add your first step, 'Go to page'",[11,7408,7368],{},[187,7410,7411],{},[190,7412,7373],{},[129,7414,7416],{"id":7415},"_2-add-your-final-step-download-a-file-to-google-drive","2. Add your final step, 'Download a file to Google Drive'",[11,7418,7380],{},[187,7420,7421,7424,7427,7430],{},[190,7422,7423],{},"Select - Click 'Select' to choose the files to download.",[190,7425,7426],{},"Google Drive folder URL - Enter the URL of the folder in Google Drive to download to.",[190,7428,7429],{},"File name - Enter a name for the file on Google Drive. Leave blank to keep the existing filename.",[190,7431,7432],{},"Local folder - If you are using the desktop version of Axiom you can set a local folder here to use as an intermediate step for the file download",[175,7434],{"alt":7435,"src":7436},"axiom.ai making download file to google drive bot","\u002Fblog\u002Fdownload-drive.jpg",[11,7438,7439],{},"That's it. Your download to Google Drive bot is complete. Ready to test.",[63,7441,7443],{"id":7442},"now-make-a-bot-that-downloads-files-direct-from-a-url","Now make a bot that downloads files direct from a URL",[129,7445,7447],{"id":7446},"_1-add-your-final-step-download-file-from-url","1. Add your final step, 'Download file from URL'",[11,7449,7450],{},"Click the 'Add step' button below the 'Go to page' step. Using the Step Finder, search for 'Download files' and click to add.",[187,7452,7453,7456,7458],{},[190,7454,7455],{},"Enter URL - Enter the URL of a file to download",[190,7457,7388],{},[190,7459,7391],{},[175,7461],{"alt":7462,"src":7463},"axiom.ai making download file from URL bot","\u002Fblog\u002Fdownload-url-bot.jpg",[11,7465,7466],{},"Thats it your download from URL bot is complete. Ready to test.",[63,7468,7470],{"id":7469},"customising-bots-with-a-loop","Customising bots with a loop",[11,7472,7473],{},"If your bot needs to perform extra actions, like logging in or pressing a button before downloading a file, there's no need to fret. You can apply what you've learned to include more steps and tailor your bot perfectly to your needs.",[11,7475,7476],{},"Moreover, if you aim to have your bot cycle through pages or URLs to download files, you can effortlessly adapt your bot by incorporating a loop step. Just follow the design patterns in the image below to achieve this.",[129,7478,7480],{"id":7479},"loop-download-files-local","Loop download files local",[11,7482,7483],{},"The design pattern would look like this. Simply chnage the download step to meet your requirments.",[175,7485],{"alt":7486,"src":7487},"axiom.ai looping download bot","\u002Fblog\u002Ffile-download-bot-loop.jpg",[63,7489,7491],{"id":7490},"running-your-download-automation-locally-or-in-the-cloud","Running your download automation locally or in the cloud",[11,7493,7494],{},"As mentioned, these bots have constraints. If you plan to run the bot locally, use the 'Download files' step. To run your bot in the cloud, you'll need to use the 'Download files onto your Google Drive' step. You can also schedule your bots. Don't forget: All new users get 140 minutes of runtime for free to test their bots.",[63,7496,7498],{"id":7497},"short-of-time-why-not-start-with-a-template","Short of time, why not start with a template",[11,7500,7501,7502,7505],{},"If you're short on time, use our ",[39,7503,7504],{"href":5157},"'download files'"," template to start. It comes complete with a guided setup.",[63,7507,2878],{"id":2877},[11,7509,7510],{},"As always, there's more than one way to approach this. The key is choosing the best method that suits your needs, depending on whether you plan to run the bot on the cloud or your desktop. Once you've made that choice, you can create a working bot by combining a 'go to page' step with a download step. It's simple once you know how.",[11,7512,7513],{},"It's just one of many web actions you can automate in the browser.",[11,7515,7516],{},"If you want to learn more about working with files, check out our documentation. You can also learn more about our 'download file', 'download files', 'download to Google Drive', and finally 'download from URL' steps.",[63,7518,7520],{"id":7519},"got-a-great-idea-for-an-automation-share-it-with-me","Got a great idea for an automation? Share it with me!",[11,7522,7220,7523,7201],{},[39,7524,7200],{"href":7199},[11,7526,7204],{},{"title":15,"searchDepth":16,"depth":16,"links":7528},[7529,7530,7531,7532,7533,7534,7538,7542,7546,7549,7552,7553,7554,7555],{"id":7279,"depth":542,"text":7280},{"id":7290,"depth":542,"text":7291},{"id":7297,"depth":542,"text":7298},{"id":7308,"depth":542,"text":7309},{"id":7315,"depth":542,"text":7316},{"id":7322,"depth":542,"text":7323,"children":7535},[7536,7537],{"id":7332,"depth":16,"text":7333},{"id":7343,"depth":16,"text":7344},{"id":7360,"depth":542,"text":7361,"children":7539},[7540,7541],{"id":7364,"depth":16,"text":7365},{"id":7376,"depth":16,"text":7377},{"id":7401,"depth":542,"text":7402,"children":7543},[7544,7545],{"id":7405,"depth":16,"text":7406},{"id":7415,"depth":16,"text":7416},{"id":7442,"depth":542,"text":7443,"children":7547},[7548],{"id":7446,"depth":16,"text":7447},{"id":7469,"depth":542,"text":7470,"children":7550},[7551],{"id":7479,"depth":16,"text":7480},{"id":7490,"depth":542,"text":7491},{"id":7497,"depth":542,"text":7498},{"id":2877,"depth":542,"text":2878},{"id":7519,"depth":542,"text":7520},"2024-03-23","Learn how to create bots to automate file downloads from URLs using axiom.ai a no-code bot building tool",{"read":577,"type":578,"tool":7559,"category":7560,"tags":7562,"location":587,"featuredimg":7565,"landingimg":7566,"summary":7557,"video":18,"metaTitle":7567},[580],[7561],"File automation",[7563,7564,6980],"uopload","download","\u002Fblog\u002Flink-download-post.jpg","\u002Fblog\u002Flink-download-sq.jpg","Automate file download from a URL with a bot","\u002Fblog\u002Fdownload-files-from-a-link",{"title":7261,"description":7557},"blog\u002Fdownload-files-from-a-link","apC4vUjgW-Fdq19-hmr65ZhzZ48E9l1yyb73SC5vFwI",{"id":7573,"title":7574,"author":23,"body":7575,"date":7897,"description":15,"draft":575,"extension":19,"meta":7898,"navigation":24,"path":7909,"seo":7910,"stem":7911,"__hash__":7912},"blog\u002Fblog\u002Fai-proofreader.md","A Dyslexic's Idea: AI Proofreading with axiom.ai and ChatGPT",{"type":8,"value":7576,"toc":7875},[7577,7581,7584,7586,7589,7593,7596,7599,7603,7606,7610,7613,7617,7620,7624,7627,7631,7639,7643,7646,7648,7652,7659,7667,7671,7674,7678,7685,7689,7694,7703,7707,7711,7716,7720,7728,7732,7737,7741,7753,7757,7762,7766,7781,7785,7790,7794,7810,7814,7819,7823,7836,7844,7848,7851,7855,7859,7862,7865,7869,7873],[63,7578,7580],{"id":7579},"automate-checking-a-website-for-typos-with-axiomai-and-chatgpt","Automate checking a website for typos with axiom.ai and ChatGPT",[11,7582,7583],{},"Hello there! I'd like to discuss a common issue that I face due to my dyslexia. While creating content for the axiom.ai website, I often make spelling mistakes which can be quite frustrating. Even after proofreading, sometimes those sneaky typos escape my attention and end up compromising the quality of our web pages.",[60,7585],{},[11,7587,7588],{},"After pondering, I realized the issue wasn't fixing typos, but the endless hours spent proofreading hundreds of pages. It's a thankless task. So, I wondered if I could create a bot to automate this process.",[63,7590,7592],{"id":7591},"which-problem-are-we-solving","Which problem are we solving?",[11,7594,7595],{},"Before discussing solutions, let's first understand the problem at hand. I have identified two tasks: finding the typos and fixing them. Fixing typos is a quick process. Therefore, for now, I will focus on finding the typos, as reading hundreds of pages to identify errors is a time-consuming task.",[11,7597,7598],{},"Let's automate typo detection. Can it be done? Hell yes!",[63,7600,7602],{"id":7601},"the-key-challenges","The key challenges",[11,7604,7605],{},"While brainstorming, I came across two main challenges. The first challenge is to extract data from web pages, which can be done through web scraping. The second challenge is to identify and correct any spelling or typing errors that may be present in the content, without spending too much time.",[63,7607,7609],{"id":7608},"solving-the-challenges","Solving the challenges",[11,7611,7612],{},"Here's my solution: I'll use a Google Sheet to maintain a list of links. I'll scrape those links using axiom.ai's ‘Get data from a URL’ step. Then, I'll pass the scraped data into our ChatGPT step. The AI will then check for any errors and provide recommendations. I will write these recommendations into the Google Sheet for later review and correction.",[63,7614,7616],{"id":7615},"how-to-make-the-proofreading-ai-with-axiomai-and-chatgpt","How to make the proofreading AI with axiom.ai and ChatGPT",[11,7618,7619],{},"Follow this guide, and you will have your AI proofreading set up and ready for testing in under 10 minutes.",[129,7621,7623],{"id":7622},"create-your-google-sheet","Create your Google Sheet",[11,7625,7626],{},"Create a new Google Sheet. You can do this in your Chrome browser by typing 'sheet.new' into the address bar. Don’t forget to name your sheet something descriptive, like 'Website Links’. Then, add some links to test your bot with.",[129,7628,7630],{"id":7629},"grab-your-chatgpt-api-key","Grab your ChatGPT API key",[11,7632,7633,7634],{},"Gab your Open AI Chat GPT API key here, this can be found on your Open AI ",[39,7635,7638],{"href":7636,"rel":7637},"https:\u002F\u002Fplatform.openai.com\u002Faccount\u002Fapi-keys",[43],"account page.",[129,7640,7642],{"id":7641},"open-axiomai-in-your-chrome-browser","Open axiom.ai in your Chrome browser.",[11,7644,7645],{},"From axiom.ai's dashboard, click 'New Automation', then 'Add First Step'. Now, follow the guide below. In just seven steps, your AI bot will be complete.",[175,7647],{"alt":7339,"src":7340},[129,7649,7651],{"id":7650},"_1-add-a-read-data-from-a-google-sheet-step","1. Add a 'Read data from a Google Sheet' step",[11,7653,7654,7655,7658],{},"Use the Step Finder to search for ",[49,7656,7657],{},"‘Read data from a Google Sheet’"," and click on it. The step will be added to Axiom for you to configure.",[648,7660,7661,7664],{},[190,7662,7663],{},"Spreadsheet - Search for the Google Sheet you created. Once found, click to select",[190,7665,7666],{},"Sheet name - Choose the tab containing website links",[175,7668],{"alt":7669,"src":7670},"axiom.ai configuring read data from a Google Sheet step","\u002Fblog\u002Faxiom-read-from-gs.jpg",[129,7672,7673],{"id":202},"2. Add a 'Loop through data' step",[175,7675],{"alt":7676,"src":7677},"axiom.ai find loop step in finder","\u002Fblog\u002Faxiom-step-finder-loop.jpg",[11,7679,7680,7681,7684],{},"Next, add a new step by entering ",[49,7682,7683],{},"‘Loop through data’"," into the Step Finder, and adding it. This step will allow your bot to loop through the rows of data stored in the Google Sheet. Make sure to add the steps you want to repeat inside the loop.",[129,7686,7688],{"id":7687},"_3-now-inside-the-loop-add-a-go-to-page-sub-step","3. Now inside the loop, add a 'Go to page' sub step",[11,7690,7654,7691,7658],{},[49,7692,7693],{},"‘Go to page’",[648,7695,7696],{},[190,7697,7698,7699,7702],{},"Enter url field, select ",[49,7700,7701],{},"‘Insert data’"," and select the data from your Google Sheet, select the column containing the website links",[175,7704],{"alt":7705,"src":7706},"axiom.ai pass data into a go to URL step","\u002Fblog\u002Faxiom-data-go-to-page.jpg",[129,7708,7710],{"id":7709},"_4-still-inside-the-loop-add-a-get-data-from-bots-current-page-sub-step","4. Still inside the loop, add a 'Get data from bot's current page' sub step",[11,7712,7654,7713,7658],{},[49,7714,7715],{},"‘Get data from bot's current page'",[175,7717],{"alt":7718,"src":7719},"axiom.ai configure the scraper","\u002Fblog\u002Fscrape-proof-reading.png",[648,7721,7722,7725],{},[190,7723,7724],{},"Select - Point and click to select the text you wish to scrape. Make a single selection and choose an element that wraps around all the content to be proofed",[190,7726,7727],{},"Max Results - Set to 1",[129,7729,7731],{"id":7730},"_5-still-inside-the-loop-add-an-generate-text-with-chatgpt-sub-step","5. Still inside the loop, add an 'Generate text with ChatGPT' sub step",[11,7733,7654,7734,7658],{},[49,7735,7736],{},"‘Generate text with ChatGPT'",[175,7738],{"alt":7739,"src":7740},"axiom.ai set up ChatGPt step","\u002Fblog\u002Fchatgpt-proof.png",[648,7742,7743,7746],{},[190,7744,7745],{},"ChatGPT API key - Enter your API key",[190,7747,7748,7749,7752],{},"Prompt - Insert the text 'Check this text for spelling mistakes and grammar, return in bullet list compatible with spread sheet cell -' then click 'Insert data' followed by '",[236,7750,7751],{},"scrape-data","' to add the scraped data to check.'",[129,7754,7756],{"id":7755},"_6-still-inside-the-loop-add-an-append-or-merge-data-sub-step","6. Still inside the loop, add an 'Append or Merge Data' sub step",[11,7758,7654,7759,7658],{},[49,7760,7761],{},"‘Append or Merge Data'",[175,7763],{"alt":7764,"src":7765},"axiom.ai append data into one variable","\u002Fblog\u002Fappend-proof.png",[648,7767,7768,7774],{},[190,7769,7770,7771,7773],{},"Data A - Insert '",[236,7772,238],{},"' and select the column containing the URL",[190,7775,7776,7777,7780],{},"Data B - Insert '",[236,7778,7779],{},"chatgpt-output","'",[129,7782,7784],{"id":7783},"_7-still-inside-the-loop-add-a-write-data-to-a-google-sheet-sub-step","7. Still inside the loop, add a 'Write Data to a Google Sheet' sub step",[11,7786,7654,7787,7658],{},[49,7788,7789],{},"‘Write Data to a Google Sheet'",[175,7791],{"alt":7792,"src":7793},"axiom.ai write data to google sheet","\u002Fblog\u002Fwrite-proof-sheet.png",[648,7795,7796,7798,7801,7807],{},[190,7797,7663],{},[190,7799,7800],{},"Sheet name - Choose the tab you created",[190,7802,7803,7804,7780],{},"DATA - Select the '",[236,7805,7806],{},"appended-data",[190,7808,7809],{},"Clear data before writing | Add to existing data - Set this option to 'Add to existing' data'",[129,7811,7813],{"id":7812},"_8-still-inside-the-loop-add-a-delete-rows-from-a-google-sheet-sub-step","8. Still inside the loop, add a 'Delete rows from a Google Sheet' sub step",[11,7815,7654,7816,7658],{},[49,7817,7818],{},"‘Delete rows from a Google Sheet'",[175,7820],{"alt":7821,"src":7822},"axiom.ai delete row from sheet","\u002Fblog\u002Fdelete-proof-sheet.png",[648,7824,7825,7827,7830,7833],{},[190,7826,7663],{},[190,7828,7829],{},"Sheet name - Choose the tab you created for links",[190,7831,7832],{},"First row - Set to 1",[190,7834,7835],{},"Last row - Set to 1",[11,7837,7838,7839],{},"Don't forget this video shows you how to ",[39,7840,7843],{"href":7841,"rel":7842},"https:\u002F\u002Fyoutu.be\u002FWhq1hgwYxcY?si=Icr_VWmDVYLDKvJ9&t=115",[43],"configure your bot.",[129,7845,7847],{"id":7846},"_8-running-the-ai-proofreader","8. Running the AI proofreader",[11,7849,7850],{},"You can run it on your desktop or in the cloud. Your final Axiom should resemble the design pattern shown below.",[175,7852],{"alt":7853,"src":7854},"axiom.ai ai proof reader design pattern","\u002Fblog\u002Fai-proof-reader-design.jpg",[63,7856,7858],{"id":7857},"conclusion-the-response-i-got-back-from-chatgpt","Conclusion - the response I got back from ChatGPT",[11,7860,7861],{},"I wasn't sure what to expect from ChatGPT, but it exceeded my expectations. It not only caught typos that I missed during my proofreading process, but it also suggested grammar corrections. The tool broke down errors line by line, which made it very easy to understand and learn from. And the best part was that ChatGPT provided explanations for each correction, which helped me fill in some educational gaps.",[11,7863,7864],{},"Not only does this bot save time proofreading, it also improves writing skills.",[63,7866,7868],{"id":7867},"got-a-great-idea-share-it-with-me","Got a great idea? Share it with me!",[11,7870,7220,7871,7201],{},[39,7872,7200],{"href":7199},[11,7874,7204],{},{"title":15,"searchDepth":16,"depth":16,"links":7876},[7877,7878,7879,7880,7881,7895,7896],{"id":7579,"depth":542,"text":7580},{"id":7591,"depth":542,"text":7592},{"id":7601,"depth":542,"text":7602},{"id":7608,"depth":542,"text":7609},{"id":7615,"depth":542,"text":7616,"children":7882},[7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894],{"id":7622,"depth":16,"text":7623},{"id":7629,"depth":16,"text":7630},{"id":7641,"depth":16,"text":7642},{"id":7650,"depth":16,"text":7651},{"id":202,"depth":16,"text":7673},{"id":7687,"depth":16,"text":7688},{"id":7709,"depth":16,"text":7710},{"id":7730,"depth":16,"text":7731},{"id":7755,"depth":16,"text":7756},{"id":7783,"depth":16,"text":7784},{"id":7812,"depth":16,"text":7813},{"id":7846,"depth":16,"text":7847},{"id":7857,"depth":542,"text":7858},{"id":7867,"depth":542,"text":7868},"2024-01-02",{"read":6663,"type":578,"tool":7899,"category":7900,"tags":7901,"takeaways":18,"featuredimg":7905,"landingimg":7906,"summary":7907,"video":7908},[580],[6055],[816,7902,7903,7904],"llm","ai","proof reading","\u002Fblog\u002Fai-reader-post.jpg","\u002Fblog\u002Fai-reader-sq.jpg","How to create an AI proofreader with axiom.ai and ChatGpt.","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FWhq1hgwYxcY?rel=0","\u002Fblog\u002Fai-proofreader",{"title":7574,"description":15},"blog\u002Fai-proofreader","0Y4G37E1KdB8m172F-10KVHPN_tDdk4b2wsG2aPak5I",{"id":7914,"title":7915,"author":23,"body":7916,"date":8173,"description":7920,"draft":575,"extension":19,"meta":8174,"navigation":24,"path":8182,"seo":8183,"stem":8184,"__hash__":8185},"blog\u002Fblog\u002Ffuture-of-ai-browser-automation.md","Launching soon: Axiom 4.0 Takes AI Browser Automation to the Next Level",{"type":8,"value":7917,"toc":8154},[7918,7921,7924,7927,7931,7934,7938,7941,7945,7949,7952,7956,7963,7966,7969,7973,7976,7979,7982,7986,7990,7993,7997,8000,8003,8007,8010,8013,8017,8020,8024,8027,8031,8034,8042,8046,8049,8053,8056,8064,8068,8071,8075,8078,8081,8085,8088,8092,8096,8099,8103,8106,8109,8129,8132,8136,8139],[11,7919,7920],{},"Meet Axiom 4.0, our enhanced Chrome browser automation tool. This update introduces significant changes, including a redesigned Axiom builder. We've removed the 'Interact’ step and introduced a new 'Loop' step for up to four levels of nesting. In addition, we've tweaked the Step Finder to make it a Notion-like UI experience and added several new logic steps based on user requests. This post will guide you through these new features and show you how to use them effectively.",[60,7922],{"alt":7923},"The future of browser automation",[11,7925,7926],{},"Before we begin, we’d like to express our gratitude to the team for persistently tackling complex problems and solving them. To our customers, thank you for taking the time to share your valued feedback! Please keep sending us feedback via our support form. We love your ideas.",[63,7928,7930],{"id":7929},"why-did-we-make-axiom-40","Why did we make Axiom 4.0?",[11,7932,7933],{},"In our eagerness to launch our product, we initially made some design choices in the builder that resulted in a more complex UI than necessary. These early mistakes became significant barriers to further improvements. With Axiom 4.0, we've addressed these issues, paving the way for a more streamlined and efficient tool. This marks the beginning of an even more dynamic and promising phase in our product's development.",[63,7935,7937],{"id":7936},"what-about-my-old-axioms","What about my old Axioms?",[11,7939,7940],{},"Don’t worry! All of your old Axioms will work in Axiom 4.0 and beyond. The ‘Interact’ step will still function even though it's been retired.",[63,7942,7944],{"id":7943},"ready-let-us-take-you-through-the-cool-new-stuff","Ready? Let us take you through the cool new stuff",[129,7946,7948],{"id":7947},"new-step-finder","New Step Finder",[11,7950,7951],{},"The first thing you will see are the new ‘Beginner snippets’. These are common design patterns used in most Axioms. A great way to start making an Axiom quickly. In the future, we’ll enable users to make and store their own snippets - another feature requested by users.",[175,7953],{"alt":7954,"src":7955},"axiom.ai design pattern web scraper","\u002Fblog\u002Fnew-step-finder.jpg",[11,7957,7958,7959,7962],{},"Find below our step categories. We’ve put the steps into categories, allowing you easily find the steps you need. However when using the Step Finder we encourage you to type into the Search bar and press return to add your ",[39,7960,883],{"href":7961},"\u002Fsteps",", as you would in Notion. It’s way faster!",[11,7964,7965],{},"Top tip: to add multiple steps at once, simply add a star with a number - like this ‘Enter text *5’. Press return and you’ll see five ‘Enter text’ steps added to your Axiom.",[175,7967],{"alt":7954,"src":7968},"\u002Fblog\u002Fadd-multiple-steps.jpg",[129,7970,7972],{"id":7971},"introducing-nesting-with-our-new-loop-step","Introducing nesting with our new Loop step",[11,7974,7975],{},"We now have a brand new step called ‘Loop through data’. To find it, search for ‘Loop’ inside the Axiom Step Finder. It does exactly what it says on the tin, it loops any nested steps inside the loop.",[11,7977,7978],{},"The updated Axiom now offers enhanced flexibility compared to the previous version. With the new loop step, you can nest loops within each other, up to four levels deep. Crucially, unlike the old ‘Interact’ step, the ‘Loop’ step allows for the use of any type of step within it, significantly expanding the tool's functionality.",[11,7980,7981],{},"To find the step, type ‘Loop’ into the Step Finder.",[175,7983],{"alt":7984,"src":7985},"axiom.ai add loop step","\u002Fblog\u002Fadd-loop-step.jpg",[129,7987,7989],{"id":7988},"how-to-build-your-axioms-with-our-new-nesting-loop-step","How to build your Axioms with our new nesting loop step",[11,7991,7992],{},"Anyone looping through rows of data in a Google Sheet should now follow the below design patterns.",[129,7994,7996],{"id":7995},"design-pattern-for-looping-through-rows-of-data-and-scraping-content","Design pattern for looping through rows of data and scraping content",[11,7998,7999],{},"Now you can nest ‘Write data to a Google Sheet’ and ‘Delete row from a Google Sheet’ steps in the loop. They will write and delete once per loop. This means that if the bot stops or is interrupted for any reason, when the run resumes it will start from where it left off. Previously this design pattern would have required the addition of ‘Jump’ steps.",[175,8001],{"alt":7954,"src":8002},"\u002Fblog\u002Fweb-scraper-design-pattern.jpg",[129,8004,8006],{"id":8005},"design-pattern-for-looping-through-rows-and-entering-data","Design pattern for looping through rows and entering data",[11,8008,8009],{},"By keeping the ‘Delete row from Google Sheet’ step nested inside the loop, the bot will delete a single row once it has been completed. This means the bot will always start from the correct line of data to be processed.",[175,8011],{"alt":7954,"src":8012},"\u002Fblog\u002Fdata-entry-axiom.jpg",[129,8014,8016],{"id":8015},"new-steps","New steps",[11,8018,8019],{},"Logic handling was a big reason why we developed Axiom 4.0. The constraints of not being able to nest made adding logic steps difficult. With that blocker out of the way, these are the first of the new logic steps being added to Axiom.",[129,8021,8023],{"id":8022},"if-condition","If Condition",[11,8025,8026],{},"You can check if a value is true or false - without code - and then execute a series of steps.",[175,8028],{"alt":8029,"src":8030},"axiom.ai if condition","\u002Fblog\u002Fif-conditon.jpg",[11,8032,8033],{},"Some examples for use of the ‘If condition’ step:",[648,8035,8036,8039],{},[190,8037,8038],{},"Price monitoring - scrape price data and check against previous scrape for value change",[190,8040,8041],{},"Check if element is present - scrape the element if found do these steps",[129,8043,8045],{"id":8044},"try-catch","Try \u002F Catch",[11,8047,8048],{},"This step, requested by Axiom users, allows you to execute a specific set of steps if an error is thrown by Axiom.",[175,8050],{"alt":8051,"src":8052},"axiom.ai try catch","\u002Fblog\u002Ftry-catch.jpg",[11,8054,8055],{},"Some examples for use of the ‘Try \u002F Catch’ step:",[648,8057,8058,8061],{},[190,8059,8060],{},"Web forms - catch error and execute a different set of steps",[190,8062,8063],{},"Scraping web pages - catch page break error and try scraping again",[129,8065,8067],{"id":8066},"improved-ui-for-looping-moving-deleting-and-disabling-steps","Improved UI for looping, moving, deleting and disabling steps",[11,8069,8070],{},"You will notice the square icon to the left side of any step. Clicking on it allows you to move, duplicate, delete, loop or disable any step. A gray bar will appear at the top of the Axiom builder. Now you can move single steps or combinations.",[175,8072],{"alt":8073,"src":8074},"axiom.ai moving,copying and deleting steps","\u002Fblog\u002Fmove-bar.jpg",[11,8076,8077],{},"‘Duplicate’ steps are useful for duplicating segments of your Axiom.",[11,8079,8080],{},"Finally, you can select steps and wrap them in a ‘Loop’ step.",[129,8082,8084],{"id":8083},"jump-step","Jump step",[11,8086,8087],{},"This addresses a minor tweak customers have enquired about. You can now jump to sub-steps, not just steps.",[175,8089],{"alt":8090,"src":8091},"axiom.ai jump to sub steps","\u002Fblog\u002Fjump-step-sub-steps.jpg",[63,8093,8095],{"id":8094},"whats-new-under-the-hood-at-axiom","What's new under the hood at Axiom",[11,8097,8098],{},"We continued beyond just the builder under the hood. The engine has been stripped and rebuilt, improving performance and reliability. We have already released the new engine, and it's been powering Axiom 3.2 for some time. That is why we are now ready to launch version 4.0.",[63,8100,8102],{"id":8101},"whats-next-for-axiom","What’s next for Axiom?",[11,8104,8105],{},"We’re working on a smorgasbord of new features, but before we tell you more, please share your feedback with us. If there's a feature you’d like to see, please reach out, whether it’s a minor UI change, or a brand new feature.",[11,8107,8108],{},"Our next focus is onboarding and helping new users get started.",[648,8110,8111,8114,8117,8120,8123,8126],{},[190,8112,8113],{},"New user onboarding experience",[190,8115,8116],{},"AI bot quick builder",[190,8118,8119],{},"Video guided templates",[190,8121,8122],{},"More logic steps",[190,8124,8125],{},"Magic step recorder from browser interactions",[190,8127,8128],{},"Full feature debugger",[11,8130,8131],{},"If there are other features you’d like to see us focusing on, do tell us.",[63,8133,8135],{"id":8134},"when-are-we-launching","When are we launching?",[11,8137,8138],{},"As soon as possible. The release is complete and we are testing, testing, testing. With the help of some of our users - thank you - Axiom 4.0 will launch in the new year beginning of January!",[11,8140,8141,8142,1140,8145,767,8149,8153],{},"If you want to learn more about what you can do with Axiom, why not read these guides on how to ",[39,8143,839],{"href":8144},"\u002Fblog\u002Fhow-to-automate-data-entry",[39,8146,8148],{"href":8147},"\u002Fblog\u002Fchatgpt-web-scraping","ChatGPT web scraping",[39,8150,8152],{"href":8151},"\u002Fblog\u002Fhow-to-automate-social-media-posts","social media",". They are tailored to use with Axiom 4.0.",{"title":15,"searchDepth":16,"depth":16,"links":8155},[8156,8157,8158,8170,8171,8172],{"id":7929,"depth":542,"text":7930},{"id":7936,"depth":542,"text":7937},{"id":7943,"depth":542,"text":7944,"children":8159},[8160,8161,8162,8163,8164,8165,8166,8167,8168,8169],{"id":7947,"depth":16,"text":7948},{"id":7971,"depth":16,"text":7972},{"id":7988,"depth":16,"text":7989},{"id":7995,"depth":16,"text":7996},{"id":8005,"depth":16,"text":8006},{"id":8015,"depth":16,"text":8016},{"id":8022,"depth":16,"text":8023},{"id":8044,"depth":16,"text":8045},{"id":8066,"depth":16,"text":8067},{"id":8083,"depth":16,"text":8084},{"id":8094,"depth":542,"text":8095},{"id":8101,"depth":542,"text":8102},{"id":8134,"depth":542,"text":8135},"2023-12-13",{"read":5343,"type":578,"tool":8175,"category":8176,"tags":8177,"featuredimg":8178,"landingimg":8179,"summary":8180,"video":8181},[580],[5787],[7902,6979,7903],"\u002Fblog\u002Faxiom-v4-wide.jpg","\u002Fblog\u002Faxiom-v4-sq.jpg","Meet Axiom 4.0, our enhanced Chrome browser automation tool","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FyxwfdkMm4KM?rel=0","\u002Fblog\u002Ffuture-of-ai-browser-automation",{"title":7915,"description":7920},"blog\u002Ffuture-of-ai-browser-automation","muh6OAC7QGnKvX6QQpP6d5vJ4h-SGpepL4aW8ar9WiU",{"id":8187,"title":8188,"author":23,"body":8189,"date":8552,"description":8553,"draft":575,"extension":19,"meta":8554,"navigation":24,"path":8565,"seo":8566,"stem":8567,"__hash__":8568},"blog\u002Fblog\u002Fdate-picker.md","How to automate date pickers without code",{"type":8,"value":8190,"toc":8530},[8191,8199,8201,8205,8208,8212,8215,8219,8222,8226,8229,8233,8237,8240,8244,8247,8251,8255,8258,8283,8287,8290,8294,8297,8300,8304,8307,8315,8319,8323,8326,8330,8344,8349,8354,8359,8363,8366,8377,8381,8386,8390,8393,8401,8409,8413,8416,8424,8429,8433,8436,8453,8459,8463,8466,8470,8474,8477,8481,8484,8487,8492,8495,8499,8506,8510,8521,8523],[11,8192,8193,8194,8198],{},"In this guide, we show you how to ",[39,8195,8197],{"href":8196},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-picker","automate date pickers"," using axiom.ai, without the need to write any code. Date pickers can be tricky HTML elements to automate, but they are often essential for automating reporting or posting content.",[60,8200],{},[63,8202,8204],{"id":8203},"why-are-date-pickers-tricky-to-automate","Why are date pickers tricky to automate?",[11,8206,8207],{},"Date pickers are not standardized, which means there are many different solutions available. Some popular options include jQuery's date picker, an old but reliable option, or bespoke pickers created with JavaScript tools like React or AngularJS. Standardizing date pickers would make browser automation much easier. Thankfully we have found ways to work around this.",[63,8209,8211],{"id":8210},"which-date-pickers-are-easiest-to-automate","Which date pickers are easiest to automate?",[11,8213,8214],{},"If the date picker you need to automate includes an input field where dates and times can be manually entered, then it's possible to automate this process.",[63,8216,8218],{"id":8217},"which-date-pickers-are-difficult-to-automate","Which date pickers are difficult to automate?",[11,8220,8221],{},"Date pickers that don't have an input field, or where the input field is disabled, blocking the user from inserting a date, are more challenging to automate. However this doesn't mean it's impossible.",[63,8223,8225],{"id":8224},"lets-learn-how-to-automate-a-date-picker-with-axiomai","Let's learn how to automate a date picker with axiom.ai",[11,8227,8228],{},"Start by checking if there is an input field for the start date. If you are able to type in the date by clicking inside the field, then you're in luck because this will be an easy task. However, if there is no such input field, don't worry. We'll show you how you can still automate a date picker without the need for code. Follow the steps below using axiom.ai's simple point-and-click interface.",[63,8230,8232],{"id":8231},"for-date-pickers-with-input-fields","For date pickers with input fields",[129,8234,8236],{"id":8235},"_1-add-an-enter-text-step","1. Add an 'Enter text' step",[11,8238,8239],{},"This step inputs the date into the date picker. Use the Step Finder to search for the 'Enter text' step and click to add it.",[175,8241],{"alt":8242,"src":8243},"axiom.ai find enter text step","\u002Fblog\u002Fenter-text-find-step.jpg",[11,8245,8246],{},"Click the 'Select text' field and select the input field you want to enter the date into.",[175,8248],{"alt":8249,"src":8250},"axiom.ai picking a date","\u002Fblog\u002Fpicking-date.jpg",[129,8252,8254],{"id":8253},"_2-adding-the-date-value","2. Adding the date value",[11,8256,8257],{},"To complete configuring the 'Enter text' step, you must include a date value in the 'Text' field. It will need to match the format used by the date picker. There are a few ways to do this:",[187,8259,8260,8263,8270,8277],{},[190,8261,8262],{},"Manually enter a value into the 'Text' field.",[190,8264,8265,8266,13],{},"Click on 'Insert data' and pull a value from a ",[39,8267,8269],{"href":8268},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-a-google-sheet-step","Google Sheet",[190,8271,8272,8273,8276],{},"Use the ",[39,8274,8275],{"href":8196},"'Date and time'"," step.",[190,8278,8279,8280,8276],{},"Generate a date value with the ",[39,8281,8282],{"href":3622},"'Custom JavaScript'",[175,8284],{"alt":8285,"src":8286},"axiom.ai enter text date data","\u002Fblog\u002Fenter-text-date-data.jpg",[11,8288,8289],{},"Note: You will need to match the exact date format used by the date picker.",[63,8291,8293],{"id":8292},"for-date-pickers-without-input-fields","For date pickers without input fields",[11,8295,8296],{},"If we are unable to automate the date picker via an input field, we can try an alternative approach. Although it may require additional steps, it's not a complex process.",[11,8298,8299],{},"You will need to add steps to scrape the month displayed in the picker and check it against the month you want it to be. When they match, add a step to select the day you want.",[129,8301,8303],{"id":8302},"_1-add-a-click-element-step-to-your-bot","1. Add a 'Click Element' step to your bot",[11,8305,8306],{},"This step will open up the date picker we want to automate, so that axiom can interact with it.",[187,8308,8309,8312],{},[190,8310,8311],{},"Use the Step Finder to search for the 'Click Element' step and click on it",[190,8313,8314],{},"Next, click 'Select' and choose the button or input that launches the date picker window",[175,8316],{"alt":8317,"src":8318},"axiom.ai date picker click element","\u002Fblog\u002Fdp-i1.jpg",[129,8320,8322],{"id":8321},"_2-add-a-get-data-from-current-page-step","2. Add a 'Get data from current page' step",[11,8324,8325],{},"This step will scrape the current month's value for us.",[175,8327],{"alt":8328,"src":8329},"axiom.ai date picker get data","\u002Fblog\u002Fdp-i2.jpg",[187,8331,8332,8335,8338,8341],{},[190,8333,8334],{},"Use the Step Finder to search for the 'Get data from current page' step and click to add it",[190,8336,8337],{},"Click 'Select' and choose the month displayed in the selector",[190,8339,8340],{},"Set the 'Max results' setting to '1'.",[190,8342,8343],{},"In the 'Configure scraper', set 'No. of retry attempts when results not found' to '0'.",[11,8345,8346],{},[5314,8347,8348],{},"Note: when using the Amazon scraper, you will need to use a custom CSS selector. Do this by clicking 'Select', then in Column A clicking on the arrow icon and selecting 'Custom Selector'.",[11,8350,8351],{},[5314,8352,8353],{},"The selector we used for Amazon was:",[11,8355,8356],{},[714,8357,8358],{},".CalendarMonthGrid .CalendarMonthGrid_month__horizontal:nth-child(2) .CalendarMonth_caption",[129,8360,8362],{"id":8361},"_3-add-an-if-condition-step","3. Add an 'If condition' step",[11,8364,8365],{},"This step verifies the current scraped month against the desired month. If the months do not match, axiom executes the sub steps within the 'if' condition, which includes clicking the 'next month' button. It then returns to the scraping step to recheck the months. When the months match, the 'if' condition is bypassed, and the process advances to the next step of selecting the day.",[187,8367,8368,8371,8374],{},[190,8369,8370],{},"Set 'Data to check' to 'Scrape-data'",[190,8372,8373],{},"In 'Condition to check', hard code your month value or click 'Insert data' to pass in a value. Make sure the format matches the date picker format",[190,8375,8376],{},"In 'Reverse condition', tick the box to set to false",[175,8378],{"alt":8379,"src":8380},"axiom.ai date picker if condition","\u002Fblog\u002Fdp-i3.jpg",[11,8382,8383],{},[5314,8384,8385],{},"Note: the next steps you add will be substeps. Add these nested within the 'If Condition' step.",[129,8387,8389],{"id":8388},"_4-add-a-click-element-sub-step","4. Add a 'Click Element' sub step",[11,8391,8392],{},"Staying within the 'If condition' step, it's time to add a sub step (click the white 'Add step' button).",[187,8394,8395,8398],{},[190,8396,8397],{},"Search for and click to add a 'Click Element' sub step",[190,8399,8400],{},"Select the next month button",[11,8402,8403,4942,8406],{},[5314,8404,8405],{},"Note: in this Amazon example, you will need to use a custom CSS attribute selector:",[714,8407,8408],{},"[aria-label=\"Move forward to switch to the next month.\"]",[129,8410,8412],{"id":8411},"_5-add-a-jump-to-step-sub-step","5. Add a 'Jump to step' sub step",[11,8414,8415],{},"Add a further sub step — 'Jump to step'. This step returns to the scraping step to recheck the month value.",[187,8417,8418,8421],{},[190,8419,8420],{},"Scroll up to your 'Get Data' step and note the step number.",[190,8422,8423],{},"Input this step number into the 'Jump to step' field.",[11,8425,8426],{},[5314,8427,8428],{},"Note: that's the final sub step.",[129,8430,8432],{"id":8431},"_6-add-a-click-element-step-after-the-if-condition","6. Add a 'Click element' step after the 'If condition'",[11,8434,8435],{},"This step involves selecting the day you wish to set in the date picker. You will need to create a custom CSS selector.",[187,8437,8438,8441,8447,8450],{},[190,8439,8440],{},"Use the Step Finder to add a new 'Click Element' step",[190,8442,8443,8444,8446],{},"You will need to create a ",[39,8445,2342],{"href":2480},". Click 'Select' then 'Custom'",[190,8448,8449],{},"Use the Chrome Inspector tool, inspect the date. Most dates have a date attribute — replicate the format",[190,8451,8452],{},"You can also pass in a selector from a Google sheet by clicking 'Insert data'",[11,8454,8455,8456,13],{},"In the image below you can see the date has an attribute we can use as a CSS class in square brackets: ",[714,8457,8458],{},"[aria-label=\"Tuesday, 19 December 2023\"]",[175,8460],{"alt":8461,"src":8462},"axiom.ai date picker css attribute","\u002Fblog\u002Fdate-picker-css.jpg",[11,8464,8465],{},"And you're done! This is what it should look like.",[175,8467],{"alt":8468,"src":8469},"axiom.ai date picker design pattern","\u002Fblog\u002Fdate-picker-steps.jpg",[63,8471,8473],{"id":8472},"the-double-date-picker","The double-date picker",[11,8475,8476],{},"To automate a double date picker like the one found on Amazon, you need to repeat the steps above for the start and end date.",[63,8478,8480],{"id":8479},"css-selectors","CSS selectors",[11,8482,8483],{},"For this process, custom CSS selectors are needed. Thankfully, most date pickers have solid CSS selectors we can take advantage of when automating.",[11,8485,8486],{},"The Amazon date picker has a great selector to use for selecting days, for example this aria selector, which can be added to your axiom:",[11,8488,8489],{},[714,8490,8491],{},"[aria-label=\"Wednesday, November 8, 2023\"]",[11,8493,8494],{},"Selecting the month is a little more tricky. There are in fact 3 months listed in the code — the month before, the current month and the month after. They all have the same selector, so we need to work out a unique hierarchy, as seen in the example below:",[11,8496,8497],{},[714,8498,8358],{},[11,8500,8501,8502,8505],{},"In this case, we use an ",[714,8503,8504],{},"nth-child(2)"," selector, as it is the second child value we want.",[63,8507,8509],{"id":8508},"issues-you-may-encounter-with-date-pickers","Issues you may encounter with date pickers",[187,8511,8512,8515,8518],{},[190,8513,8514],{},"Bot isn't looping the scrape when the months don't match? Make sure the 'Jump step' is going to the correct step and the 'If step' is set to reverse condition: false",[190,8516,8517],{},"Not clicking the day? Make sure your selector is covering the correct month",[190,8519,8520],{},"Buttons not clicking and getting errors? You'll need to work on your CSS selectors",[63,8522,526],{"id":525},[11,8524,8525,8526],{},"Congratulations, you just built a bot to automate a date picker! If you find a troublesome date picker, share it with us to crack. We love a good bot-building challenge. Email us at ",[39,8527,8529],{"href":8528},"mailto:support@axiom.ai","support@axiom.ai",{"title":15,"searchDepth":16,"depth":16,"links":8531},[8532,8533,8534,8535,8536,8540,8548,8549,8550,8551],{"id":8203,"depth":542,"text":8204},{"id":8210,"depth":542,"text":8211},{"id":8217,"depth":542,"text":8218},{"id":8224,"depth":542,"text":8225},{"id":8231,"depth":542,"text":8232,"children":8537},[8538,8539],{"id":8235,"depth":16,"text":8236},{"id":8253,"depth":16,"text":8254},{"id":8292,"depth":542,"text":8293,"children":8541},[8542,8543,8544,8545,8546,8547],{"id":8302,"depth":16,"text":8303},{"id":8321,"depth":16,"text":8322},{"id":8361,"depth":16,"text":8362},{"id":8388,"depth":16,"text":8389},{"id":8411,"depth":16,"text":8412},{"id":8431,"depth":16,"text":8432},{"id":8472,"depth":542,"text":8473},{"id":8479,"depth":542,"text":8480},{"id":8508,"depth":542,"text":8509},{"id":525,"depth":542,"text":526},"2023-12-12","A step-by-step guide on how to automate a date picker in the browser without code, including tricky pickers with no input field.",{"read":3588,"type":578,"tool":8555,"category":8556,"tags":8557,"featuredimg":8560,"landingimg":8561,"summary":8562,"video":8563,"metaTitle":8564},[580],[5787],[8558,8559],"date picker","ui","\u002Fblog\u002Fdatepick-rect.jpg","\u002Fblog\u002Fdatepick-sq.jpg","A step-by-step guide on how to automate a date picker without code","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FtOJci-fiIB8?rel=0","automate date pickers without code","\u002Fblog\u002Fdate-picker",{"title":8188,"description":8553},"blog\u002Fdate-picker","L3hyD20vihSvWZdRxpoHOKxRhey8aSpLjlQgGKhUYHs",{"id":8570,"title":8188,"author":23,"body":8571,"date":8552,"description":8931,"draft":575,"extension":19,"meta":8932,"navigation":24,"path":8939,"seo":8940,"stem":8941,"__hash__":8942},"blog\u002Fblog\u002Fhow-to-automate-a-date-picker.md",{"type":8,"value":8572,"toc":8909},[8573,8578,8580,8582,8584,8586,8589,8591,8594,8597,8600,8602,8604,8607,8609,8612,8614,8616,8619,8636,8638,8641,8643,8646,8649,8652,8655,8663,8670,8673,8676,8678,8680,8693,8699,8704,8708,8710,8714,8717,8725,8728,8734,8739,8742,8745,8752,8758,8763,8771,8774,8777,8785,8791,8796,8800,8807,8827,8834,8837,8843,8851,8854,8857,8859,8862,8864,8867,8870,8873,8880,8883,8887,8890,8892,8902,8904],[11,8574,8193,8575,8198],{},[39,8576,8197],{"href":8577},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdate-picker",[60,8579],{},[63,8581,8204],{"id":8203},[11,8583,8207],{},[63,8585,8211],{"id":8210},[11,8587,8588],{},"If the data picker you need to automate includes an input field where dates and times can be manually entered, then it’s possible to automate this process.",[63,8590,8218],{"id":8217},[11,8592,8593],{},"Date pickers that don’t have an input field or where the input field is disabled, blocking the user from inserting a date, are more challenging to automate. However this doesn’t mean it’s impossible.",[63,8595,8596],{"id":8224},"Let’s learn how to automate a date picker with axiom.ai",[11,8598,8599],{},"Start by checking if there is an input field for the start date. If you are able to type in the date by clicking inside the field, then you're in luck because this will be an easy task. However, if there is no such input field, don't worry. We'll show you how you can still automate a date picker without the need for code. Follow the steps below using axiom.ai’s simple point-and-click interface.",[63,8601,8232],{"id":8231},[129,8603,8236],{"id":8235},[11,8605,8606],{},"This step inputs the date into the date picker. Use the Step Finder to search for the ‘Enter text’ step and click to add it.",[175,8608],{"alt":8242,"src":8243},[11,8610,8611],{},"Click the ‘Select text’ field and select the input field you want to enter the date into.",[175,8613],{"alt":8249,"src":8250},[129,8615,8254],{"id":8253},[11,8617,8618],{},"To complete configuring the 'Enter text' step, you must include a date value in the 'Text' field. I will need to match the format used by the date picker. There are a few ways to do this:",[187,8620,8621,8623,8627,8632],{},[190,8622,8262],{},[190,8624,8265,8625,13],{},[39,8626,8269],{"href":8268},[190,8628,8272,8629,8276],{},[39,8630,8275],{"href":8631},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-time",[190,8633,8279,8634,8276],{},[39,8635,8282],{"href":3622},[175,8637],{"alt":8242,"src":8286},[11,8639,8640],{},"Note:  You will need to match the exact date format used by the date picker.",[63,8642,8293],{"id":8292},[11,8644,8645],{},"If we are unable to automate the date picker via an input field, we can try an alternative approach. Although it may require additional steps, it’s not a complex process, it simply requires a few extra steps.",[11,8647,8648],{},"You will need to add steps to scrape the month displayed in the picker and check against the month you want it to be. When they match, add a step to select the day you want.",[129,8650,8651],{"id":8302},"1. Add a ‘Click Element’ step to your bot",[11,8653,8654],{},"This step will open up the date picker we want to automate, so that Axiom can interact with it.",[187,8656,8657,8660],{},[190,8658,8659],{},"Use the Step Finder to search for the ‘Click Element’ step and click on it",[190,8661,8662],{},"Next, click ‘Select’ and choose the button or input that launches the date picker window",[11,8664,8665],{},[39,8666,8669],{"href":8667,"rel":8668},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=Wys3-rpWoDghuwN7&t=152",[43],"Unsure? watch here",[175,8671],{"alt":8672,"src":8318},"axiom.ai amazon date picker",[129,8674,8675],{"id":8321},"2. Add a ‘Get data from current page’ step",[11,8677,8325],{},[175,8679],{"alt":8672,"src":8329},[187,8681,8682,8685,8687,8690],{},[190,8683,8684],{},"Use the Step Finder to search for the ‘Get data from current page’ step and click to add it",[190,8686,8337],{},[190,8688,8689],{},"Set the ‘Max results’ setting to ‘1’.",[190,8691,8692],{},"In the 'Configure scraper', Set 'No. of retry attempts when results not found' to '0'.",[11,8694,8695],{},[39,8696,8669],{"href":8697,"rel":8698},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=jUD5ASRYrhZ_L3vc&t=161",[43],[11,8700,8701],{},[5314,8702,8703],{},"Note: when using the Amazon scraper, you will need to use a custom CSS selector. Do this by clicking 'Select', then in Column A clicking on the arrow icon and selecting 'Custom Selector’.",[11,8705,8706],{},[5314,8707,8353],{},[11,8709,8358],{},[129,8711,8713],{"id":8712},"_3-add-a-if-condition-step","3. Add a ‘If condition’ step",[11,8715,8716],{},"This step verifies the current scraped month against the desired month. If the months do not match, the Axiom executes the sub steps within the 'if' condition, which includes clicking the 'next month' button. It then returns to the scraping step to recheck the months. When the months match, the 'if' condition is bypassed, and the process advances to the next step of selecting the day.",[187,8718,8719,8721,8723],{},[190,8720,8370],{},[190,8722,8373],{},[190,8724,8376],{},[175,8726],{"alt":8727,"src":8380},"axiom.ai amazon date picker if condition",[11,8729,8730],{},[39,8731,8669],{"href":8732,"rel":8733},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=id3DAJPgQzaNT64m&t=345",[43],[11,8735,8736],{},[5314,8737,8738],{},"Note: the next steps you add will be substeps. Add these nested within the ‘If Condition’ step.",[129,8740,8741],{"id":8388},"4. Add a ‘Click Element’ sub step",[11,8743,8744],{},"Staying within the ‘If condition’ step, it’s time to add a sub step (click the white ‘Add step’ button).",[187,8746,8747,8750],{},[190,8748,8749],{},"Search for and click to add a ‘Click Element’ sub step",[190,8751,8400],{},[11,8753,8754],{},[39,8755,8669],{"href":8756,"rel":8757},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=FxG2fasy-0MpR0S1&t=404",[43],[11,8759,8760],{},[5314,8761,8762],{},"Note: in this Amazon example, you will need to use a custom CSS. Click 'Select' then 'Custom' and use:",[11,8764,8765],{},[5314,8766,8767,8770],{},[236,8768,8769],{},"aria-label=\"Move forward to switch to the next month.\""," an attribute selector more about those below.",[129,8772,8773],{"id":8411},"5. Add a ‘Jump to step’ sub step",[11,8775,8776],{},"Add a further sub step - 'Jump to step'. This step returns to the scraping step to recheck the month value.",[187,8778,8779,8782],{},[190,8780,8781],{},"You will need to scroll up to your ‘Get Data’ step, and note the step number.",[190,8783,8784],{},"Input this step number into the ‘Jump to step’ field.",[11,8786,8787],{},[39,8788,8669],{"href":8789,"rel":8790},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=uIag5bCpNuE9Pi4P&t=489",[43],[11,8792,8793],{},[5314,8794,8795],{},"Note: That's the final sub step",[129,8797,8799],{"id":8798},"_6-add-a-click-element-step-after-the-if-conditon","6. Add a 'Click element' step after the 'If conditon'",[11,8801,8802,8803],{},"This step involves selecting the day you wish to set in the date picker. You will need to create a custom CSS selector, and I will show you how to do this in the accompanying ",[39,8804,8806],{"href":8732,"rel":8805},[43],"video.",[187,8808,8809,8812,8817,8825],{},[190,8810,8811],{},"Use the Step Finder to add a new ‘Click Element’ step",[190,8813,8814,8815,8446],{},"You will need create and a ",[39,8816,2342],{"href":2480},[190,8818,8272,8819,8824],{},[39,8820,8823],{"href":8821,"rel":8822},"https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fdevtools\u002Fcss",[43],"Chrome Inspector tool",", inspect the date. Most dates have a date attibute, replicate the format",[190,8826,8452],{},[11,8828,8829,8830,8833],{},"In the image below you can see the date has this attribute we can use as a css class in square brackets '",[236,8831,8832],{},"aria-label=\"Tuesday, 19 December 2023\"","'.",[175,8835],{"alt":8836,"src":8462},"axiom.ai amazon date picker css atribute",[11,8838,8839],{},[39,8840,8669],{"href":8841,"rel":8842},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=iFkt42Y2oQzn1Gsi&t=525",[43],[11,8844,8845],{},[5314,8846,8847,8848],{},"Note: in this Amazon example, the 'Custom' is: ",[236,8849,8850],{},"aria-label=\"Thursday, November 16, 2023\"",[11,8852,8853],{},"And you’re done! This is what it should look like.",[175,8855],{"alt":8856,"src":8469},"axiom.ai amazon date picker design pattern",[63,8858,8473],{"id":8472},[11,8860,8861],{},"To automate a double date picker like this one found on Amazon, you need to repeat the steps above for start and end date.",[63,8863,8480],{"id":8479},[11,8865,8866],{},"For this process, custom CSS selectors are needed. If you haven’t used these before, you can find out more here.",[11,8868,8869],{},"Thankfully, most date pickers have solid CSS selectors we can take advantage of when automating.",[11,8871,8872],{},"The Amazon date picker has a great selector to use for selecting days, for example this aria selector, which can be added to your Axiom:",[11,8874,8875],{},[5314,8876,8877],{},[236,8878,8879],{},"aria-label=\"Wednesday, November 8, 2023",[11,8881,8882],{},"Selecting the month is a little more tricky. There are in fact 3 months listed in the code. The month before, current month and month after. They all have the same selector, so we need to work out a unique hierarchy, as seen in the example below:",[11,8884,8885],{},[5314,8886,8358],{},[11,8888,8889],{},"In this case, we use an nth-child(2) selector, as it is the second child value we want.",[63,8891,8509],{"id":8508},[187,8893,8894,8897,8899],{},[190,8895,8896],{},"Bot isn’t looping the scrape when the months don’t match? Make sure the ‘Jump step’ is going to the correct step and the ‘If step’ is set to reverse condition: false",[190,8898,8517],{},[190,8900,8901],{},"Buttons not clicking and getting errors? You’lll need to work on your CSS selectors",[63,8903,526],{"id":525},[11,8905,8906,8907],{},"Congratulations, you just built a bot to automate a date picker! If you find a troublesome data picker, share it with us to crack. We love a good bot-building challenge. Email us on ",[39,8908,8529],{"href":8528},{"title":15,"searchDepth":16,"depth":16,"links":8910},[8911,8912,8913,8914,8915,8919,8927,8928,8929,8930],{"id":8203,"depth":542,"text":8204},{"id":8210,"depth":542,"text":8211},{"id":8217,"depth":542,"text":8218},{"id":8224,"depth":542,"text":8596},{"id":8231,"depth":542,"text":8232,"children":8916},[8917,8918],{"id":8235,"depth":16,"text":8236},{"id":8253,"depth":16,"text":8254},{"id":8292,"depth":542,"text":8293,"children":8920},[8921,8922,8923,8924,8925,8926],{"id":8302,"depth":16,"text":8651},{"id":8321,"depth":16,"text":8675},{"id":8712,"depth":16,"text":8713},{"id":8388,"depth":16,"text":8741},{"id":8411,"depth":16,"text":8773},{"id":8798,"depth":16,"text":8799},{"id":8472,"depth":542,"text":8473},{"id":8479,"depth":542,"text":8480},{"id":8508,"depth":542,"text":8509},{"id":525,"depth":542,"text":526},"In this guide, we show you how to automate date pickers using axiom.ai, without the need to write any code. Date pickers can be tricky HTML elements to automate, but they are often essential for automating reporting or posting content.",{"read":3588,"type":578,"tool":8933,"category":8934,"tags":8935,"featuredimg":8560,"landingimg":8561,"summary":8562,"video":8563},[580],[2915],[8936,8937,8938],"time","date","web forms","\u002Fblog\u002Fhow-to-automate-a-date-picker",{"title":8188,"description":8931},"blog\u002Fhow-to-automate-a-date-picker","890aMNC337ajoPid2Omzscn4TmlXEX09DJhmkKEImLE",{"id":8944,"title":8945,"author":23,"body":8946,"date":9252,"description":8950,"draft":575,"extension":19,"meta":9253,"navigation":24,"path":9264,"seo":9265,"stem":9266,"__hash__":9267},"blog\u002Fblog\u002Fhow-to-scrape-product-details-from-amazon-books.md","How to scrape product details from Amazon Books with a bot",{"type":8,"value":8947,"toc":9233},[8948,8951,8954,8957,8963,8967,8974,8981,8985,8992,8996,8999,9003,9006,9010,9014,9017,9020,9023,9026,9029,9032,9036,9039,9042,9046,9049,9052,9055,9058,9061,9064,9067,9071,9075,9078,9082,9086,9089,9092,9099,9102,9105,9109,9112,9116,9119,9122,9125,9129,9133,9136,9139,9142,9148,9151,9154,9158,9161,9165,9168,9172,9179,9183,9186,9189,9192,9203,9209,9211,9214,9218],[11,8949,8950],{},"If you're looking to improve your product offerings or marketing strategies, it's important to gather data on bestselling books, popular genres, and emerging trends. Additionally, keeping tabs on your competitors' product listings, pricing strategies, and customer reviews can give you a competitive edge.",[60,8952],{"alt":8953},"How to scrape amazon product information",[11,8955,8956],{},"In this guide, we show you how to extract data from Amazon Books using a bot. You’ll learn how to scrape URLs from a list of top-selling books, and then filter them by ranking, and extract their Best Sellers Rank.",[11,8958,8959,8960,8962],{},"Don't worry if this example doesn't match your use case, because what you will learn in this guide will enable you to ",[39,8961,7250],{"href":5108}," any data from Amazon. For example, you can use the basis of this bot to scrape data from other product types, such as electrical goods or home furnishings.",[63,8964,8966],{"id":8965},"what-exactly-is-a-bot","What exactly is a bot?",[11,8968,8969,8970,13],{},"Axiom’s bots are powerful tools that you can delegate browser tasks to. Think of them as your very own digital helpers. They’re built using a simple step-by-step process - without the need for code - that replicates your actions in the Chrome browser, allowing you to automate a whole range of data gathering tasks in the ",[39,8971,8973],{"href":8972},"\u002Fautomate\u002Famazon-store","Amazon store",[11,8975,8976,8977],{},"The beauty of learning how to create bots is that they can be tailored to your specific requirements and scheduled to run independently, freeing up valuable time. They can even ",[39,8978,8980],{"href":8979},"\u002Fblog\u002Famazon-posts","automate Amazon posts.",[63,8982,8984],{"id":8983},"how-does-the-amazon-book-scraper-bot-work","How does the Amazon Book scraper bot work?",[11,8986,1498,8987,8991],{},[39,8988,8990],{"href":8989},"\u002Fguides\u002Fscrape-amazon","Amazon Book scraper"," bot mimics your actions in the browser. It navigates to a URL and extracts the links to books before proceeding to loop through the links to gather information on the best-selling rankings. Finally, it outputs the data and saves it to a Google Sheet. This guide teaches you specifically how to scrape Best Sellers book guides on Amazon.",[63,8993,8995],{"id":8994},"lets-learn-how-to-build-an-amazon-book-scraper-bot-with-axiomai","Let’s learn how to build an Amazon Book scraper bot with axiom.ai",[11,8997,8998],{},"Creating bots for Amazon scraping has never been easier thanks to axiom.ai's no-code bot builder. With our user-friendly no-code interface, you can create as many bots as you need without any coding knowledge. By following the simple steps below, you can make a fully functional bot that extracts Amazon data within minutes.",[129,9000,9002],{"id":9001},"_1-start-from-blank","1. Start from blank",[11,9004,9005],{},"To build your bot from scratch, click on 'Add first step’. This will open the step selector and you can start adding steps to your bot.",[175,9007],{"alt":9008,"src":9009},"axiom.ai add first step","\u002Fblog\u002Fadd-first-step.jpg",[129,9011,9013],{"id":9012},"_2-add-your-first-step-get-data-from-a-url","2. Add your first step: ‘Get data from a URL’",[11,9015,9016],{},"Use the Step Finder to search for ‘Get data from a URL’ and click on it. The step will be added to Axiom for you to configure.",[11,9018,9019],{},"In the field called 'URL', enter the URL of the Amazon Book listing page you wish to scrape data from. In this guide, we will be scraping best sellers in Women's Fantasy Fiction.",[11,9021,9022],{},"Next, we need to select the data we want to scrape. In this case, we require two columns of data: column A will contain the book listing number, and column B will contain the link to the book page.",[11,9024,9025],{},"For column A, by clicking ‘Select’ select the book ranking number on the first book, then repeat the action on subsequent books. Tip: don’t just select books 1, 2 and 3. Instead, scroll down the page and select Books 1, 5 and 20. This helps our AI understand the selectors.",[11,9027,9028],{},"Then click on ‘Add column’ to add column B. Use the ‘Link selector’ to click on the box around the books, again repeating the selection as above.",[11,9030,9031],{},"Press ‘Complete’ to save your selections. Your data output should look something like this:",[175,9033],{"alt":9034,"src":9035},"axiom.ai scrape data with get data from current url step","\u002Fblog\u002Fget-data-current-url-step.jpg",[11,9037,9038],{},"Now we need to set up the pager by clicking ‘Find pager’. Scroll down the Amazon page and select the pager button ‘Next page’ then click ‘Complete’.",[11,9040,9041],{},"Then click on ‘Confirm selector’ and then ‘Complete’. Lastly, set ‘Max results’ to 100.",[129,9043,9045],{"id":9044},"_3-remove-results-which-do-not-contain-certain-words","3. Remove results which do not contain certain words",[11,9047,9048],{},"In this example, we only want to scrape books listed at numbers 1, 20 and 50, so we’re going to pass the URLs we just scraped through a filter to remove all unwanted URLs.",[11,9050,9051],{},"Use the Step Finder to find and add the step ‘Remove results which do not contain certain words’.",[11,9053,9054],{},"In the ‘Data’ field, select ‘Scrape data’.",[11,9056,9057],{},"In ‘Words (comma separated)’ type 1,20,50.",[11,9059,9060],{},"In ‘Word matching mode’, select ‘Any’.",[11,9062,9063],{},"Select the ‘Match on word boundary’ box.",[11,9065,9066],{},"Finally, we only want to use the first column for our filter as the URLs also have numbers in. In ‘Columns (optional)’ switch the toggle on and set to 1.",[175,9068],{"alt":9069,"src":9070},"axiom.ai remove results that contain certain words step","\u002Fblog\u002Fremove-results.jpg",[129,9072,9074],{"id":9073},"_34-add-the-loop-through-data-step","34. Add the ‘Loop through data’ step",[11,9076,9077],{},"Use the Step Finder to find and add the step ‘Loop through data’. This step allows your bot to loop through the links we just scraped. Be sure to add the steps you want to repeat inside the loop as substeps.",[175,9079],{"alt":9080,"src":9081},"axiom.ai adding a loop step amazon scraper","\u002Fblog\u002Floop-step.jpg",[129,9083,9085],{"id":9084},"_5-add-the-go-to-page-sub-step","5. Add the ‘Go to page’ sub step",[11,9087,9088],{},"Staying within the ‘Loop through data’ step, it’s time to add a sub step (click the white ‘Add step’ button).",[11,9090,9091],{},"Use the Step Finder to search for ‘Go to page’ and click on it. The step will be added for you to configure.",[11,9093,9094,9095,9098],{},"In the 'Enter URL' field, click ‘Insert data’ and select ‘",[236,9096,9097],{},"matching-word-data?*&1","’.",[11,9100,9101],{},"In the data preview that appears, select only column ‘B’ with the URLs.",[175,9103],{"alt":9104,"src":7706},"axiom.ai pass data ionto a go to url step",[129,9106,9108],{"id":9107},"_6-add-the-current-url-sub-step","6. Add the ‘Current URL’ sub step",[11,9110,9111],{},"No configuration is needed for this step. It simply retrieves the current URL.",[129,9113,9115],{"id":9114},"_7-add-the-get-data-from-bots-current-page-sub-step","7. Add the ‘Get data from bot's current page’ sub step",[11,9117,9118],{},"For this guide, we want to scrape the best seller ranking, but of course you can make different data selections. Start by clicking ‘Select’ and then scroll the Amazon page until you see the Bestseller ranking. Then click on it, and click complete.",[11,9120,9121],{},"Leave Max results set to ‘1’.",[11,9123,9124],{},"To learn more about the selector tools, follow this link.",[129,9126,9128],{"id":9127},"_8-add-the-write-data-to-a-google-sheet-sub-step","8. Add the ‘Write data to a Google Sheet’ sub step",[175,9130],{"alt":9131,"src":9132},"axiom.ai write data to a google sheet step","\u002Fblog\u002Faxiom-write-data-gs.jpg",[11,9134,9135],{},"Now we’re going to write the data that we extracted from Amazon to a Google Sheet.",[11,9137,9138],{},"Use the Step Finder to search for 'Write data to a Google Sheet' and click to add it.",[11,9140,9141],{},"In the 'Spreadsheet URL' field, search for the Google Sheet you wish to use.",[11,9143,9144,9145,8833],{},"In the 'Sheet name' field, select 'Data'. In the 'Data' field, select '",[236,9146,9147],{},"interact-data",[11,9149,9150],{},"Finally, in the ‘Write options’ field, click the ‘Add to existing Data’ option.",[11,9152,9153],{},"If you do not wish to use a Google Sheet you could output to a CSV or Display Message - just add the relevant step.",[63,9155,9157],{"id":9156},"_9-ready-to-test","9. Ready to test",[11,9159,9160],{},"Almost there! Your Amazon bot should resemble the screenshot below.",[175,9162],{"alt":9163,"src":9164},"axiom.ai design pattern for Amazon book scraper","\u002Fblog\u002Famazon-book-desig-pattern.jpg",[11,9166,9167],{},"Now you’re ready to test your Amazon scraper with the desktop app, by clicking ‘Run w\u002Fdesktop app’.",[63,9169,9171],{"id":9170},"_10-running-the-bot","10. Running the bot",[11,9173,9174,9175],{},"You can run this Amazon bot in both the cloud and the desktop app. If you want to learn more about scheduling, ",[39,9176,9178],{"href":9177},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run","click here.",[63,9180,9182],{"id":9181},"issues-you-may-encounter-with-the-amazon-bot","Issues you may encounter with the Amazon bot",[11,9184,9185],{},"If you’re experiencing any problems with running the bot, a great way to debug is by using ‘Display messages’ to examine the data at various stages of its transition through the bot.",[11,9187,9188],{},"For example, you could add a ‘Display messages’ step after a scraper to check that the data being scraped is output correctly.",[11,9190,9191],{},"Here are some other issues you may experience:",[187,9193,9194,9197,9200],{},[190,9195,9196],{},"‘Remove results’ step not returning any data? Check that ‘Columns (optional)’ is set to 1.",[190,9198,9199],{},"The bot isn’t looping through the book page links? Check that the ‘Go to page’ step has the data inserted properly.",[190,9201,9202],{},"Amazon page doesn’t load when running the bot? Try using just the desktop app and running it locally.",[11,9204,9205,9206],{},"Don't forget we offer excellent customer support. If you need help, ",[39,9207,9208],{"href":521},"get in touch.",[63,9210,526],{"id":525},[11,9212,9213],{},"Congratulations, you've learned how to build a bot to extract data from Amazon. With this newly acquired skill, you know how to scrape data, loop through actions, and extract data to a Google Sheet. You can make bots to scrape any website - the sky's the limit with your new AI super powers.",[63,9215,9217],{"id":9216},"what-else-can-i-automate-with-axiomai","What else can I automate with axiom.ai?",[11,9219,9220,9221,1140,9224,9227,9228,9232],{},"Axiom is a powerful browser automation tool. If you're excited, here are some ideas for other bots: such as ",[39,9222,9223],{"href":8979},"Automating amazon posting",[39,9225,9226],{"href":8989},"scraping Amazon"," including extracting ",[39,9229,9231],{"href":9230},"\u002Fblog\u002Fscrape-amazon-asins","ASINs"," data.",{"title":15,"searchDepth":16,"depth":16,"links":9234},[9235,9236,9237,9247,9248,9249,9250,9251],{"id":8965,"depth":542,"text":8966},{"id":8983,"depth":542,"text":8984},{"id":8994,"depth":542,"text":8995,"children":9238},[9239,9240,9241,9242,9243,9244,9245,9246],{"id":9001,"depth":16,"text":9002},{"id":9012,"depth":16,"text":9013},{"id":9044,"depth":16,"text":9045},{"id":9073,"depth":16,"text":9074},{"id":9084,"depth":16,"text":9085},{"id":9107,"depth":16,"text":9108},{"id":9114,"depth":16,"text":9115},{"id":9127,"depth":16,"text":9128},{"id":9156,"depth":542,"text":9157},{"id":9170,"depth":542,"text":9171},{"id":9181,"depth":542,"text":9182},{"id":525,"depth":542,"text":526},{"id":9216,"depth":542,"text":9217},"2023-11-22",{"read":9254,"type":578,"tool":9255,"category":9256,"tags":9257,"featuredimg":9261,"landingimg":9262,"summary":9263},"19 min read",[580],[4752],[9258,9259,9260],"amazon","products","asin","\u002Fblog\u002Famazon-books-hero.jpg","\u002Fblog\u002Famazon-books.jpg","A step-by-step guide that teaches you how to scrape Amazon Books with a bot","\u002Fblog\u002Fhow-to-scrape-product-details-from-amazon-books",{"title":8945,"description":8950},"blog\u002Fhow-to-scrape-product-details-from-amazon-books","6RkufleBHeUB14SUfAsMfnjaXYfatY60CcSW9w5iO1I",{"id":9269,"title":9270,"author":23,"body":9271,"date":9632,"description":9275,"draft":575,"extension":19,"meta":9633,"navigation":24,"path":9644,"seo":9645,"stem":9646,"__hash__":9647},"blog\u002Fblog\u002Fhow-to-send-email-blast.md","How to send an email blast (From Gmail with a bot)",{"type":8,"value":9272,"toc":9606},[9273,9276,9279,9282,9284,9287,9290,9294,9301,9305,9308,9315,9319,9322,9326,9329,9331,9335,9339,9342,9345,9349,9352,9355,9358,9361,9364,9368,9370,9378,9380,9384,9387,9390,9394,9397,9402,9405,9409,9413,9416,9419,9422,9426,9430,9433,9436,9440,9443,9447,9450,9453,9456,9458,9462,9465,9468,9472,9474,9477,9480,9484,9487,9490,9493,9496,9499,9503,9507,9510,9513,9517,9520,9524,9527,9530,9533,9537,9540,9542,9545,9549,9553,9556,9559,9562,9565,9569,9572,9578,9582,9590,9596,9598,9601,9603],[11,9274,9275],{},"Sending email blasts from Gmail lets you send the right message to the right people at the right time. It can help personalize your marketing campaign, making it less intrusive for the receiver and boosting overall performance.",[60,9277],{"alt":9278},"How to send email blasts with axiom.ai",[11,9280,9281],{},"Learn how to send email blasts more efficiently by creating a browser bot that automates the process in Gmail, taking repetitive manual tasks off your hands. If you don’t use Gmail, don’t worry. You can use what you learn in this guide to automate email blasts on any web-based email platform. Let's dive in!",[63,9283,8966],{"id":8965},[11,9285,9286],{},"Axiom’s bots are powerful tools that you can delegate repetitive tasks, such as blast emailing, to. Think of them as your very own digital helpers. They’re built using a simple step-by-step process - without the need for code - that replicates your actions in the Chrome browser, allowing you to automate a whole range of tasks.",[11,9288,9289],{},"The beauty of learning how to create bots is that they can be tailored to your specific requirements and scheduled to run independently, freeing up valuable time.",[63,9291,9293],{"id":9292},"how-does-an-email-blast-bot-work","How does an email blast bot work?",[11,9295,9296,9300],{},[39,9297,9299],{"href":9298},"\u002Fguides\u002Fgmail-mail-merge","Gmail blast bots"," run in your Chrome browser and are built to mimic your actions, from logging into the app, to clicking the compose button. Once the compose form is open, the bot can populate it with text and files stored on your computer or in a Google Sheet.",[63,9302,9304],{"id":9303},"can-my-gmail-account-be-blocked","Can my Gmail account be blocked?",[11,9306,9307],{},"Gmail has daily send limits and if you exceed those limits, especially with a new account, there is a strong likelihood that your account will be blocked. We recommend staying within the limits. If you need to send more emails, you can use multiple accounts.",[11,9309,9310],{},[39,9311,9314],{"href":9312,"rel":9313},"https:\u002F\u002Fsupport.google.com\u002Fmail\u002Fanswer\u002F22839?hl=en-GB&ref_topic=7280460&sjid=15474505023042916918-EU",[43],"Read Google's Policy here.",[63,9316,9318],{"id":9317},"lets-learn-how-to-build-a-email-blast-bot-with-axiomai","Let’s learn how to build a email blast bot with axiom.ai",[11,9320,9321],{},"In this example, we will guide you through the process of extracting data from a Google Sheet, looping through the rows, and using Gmail to compose and send new emails. This method can be applied to any web-based email app, including Outlook.",[129,9323,9325],{"id":9324},"_1-set-up-your-google-sheet","1. Set up your Google Sheet",[11,9327,9328],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering 'sheet.new' into the address bar. Don’t forget to name your sheet something like 'Gmail blast’. In the sheet, add some text data, with the email copy in one column and the name in another column, so you can personalize the message.",[175,9330],{"alt":9008,"src":9009},[129,9332,9334],{"id":9333},"_2-add-your-first-step-read-data-from-a-google-sheet","2. Add your first step: ‘Read data from a Google Sheet’",[175,9336],{"alt":9337,"src":9338},"axiom.ai adding a step","\u002Fblog\u002Ffinder-read.jpg",[11,9340,9341],{},"Use the Step Finder to search for ‘Read data from a Google Sheet’ and click on it. The step will be added to Axiom for you to configure.",[11,9343,9344],{},"In the 'Spreadsheet URL' field, you can search by name for the Google Sheet you created. Click on it to select.",[175,9346],{"alt":9347,"src":9348},"axiom.ai read data from a Google Sheet step","\u002Fblog\u002Fread-data-google-sheet-step.jpg",[11,9350,9351],{},"In the ‘Sheet name' field, click on the drop-down and select the correct tab.",[11,9353,9354],{},"In the ‘First cell’ field, toggle the switch and enter 'A1’. This setting tells the bot where to start reading data.",[11,9356,9357],{},"In the 'Last cell' field, click the toggle switch and enter 'A10'. You have limited the bot to read ten rows. This is fine for now, you can increase the amount later once you’ve tested it.",[11,9359,9360],{},"If you want to learn more about Google Sheet steps, watch these videos",[11,9362,9363],{},"(\u002Fguides\u002Fgoogle-sheets)",[129,9365,9367],{"id":9366},"_3-add-the-go-to-page-step","3. Add the ‘Go to page’ step",[11,9369,9091],{},[11,9371,9372,9373,9377],{},"In the 'Enter URL' field, cut and paste the Gmail URL: ",[39,9374,9375],{"href":9375,"rel":9376},"https:\u002F\u002Fmail.google.com\u002Fmail\u002Fu\u002F0\u002F#inbox?compose=new",[43],". This step will open the Gmail compose email form by default.",[175,9379],{"alt":9104,"src":7706},[129,9381,9383],{"id":9382},"_4-add-the-loop-through-data-step","4. Add the ‘Loop through data’ step",[11,9385,9386],{},"Next, add a new step by entering ‘Loop through data’ into the Step Finder, and clicking to add it. This step will allow your bot to loop through the rows of emails in the Google Sheet. Make sure to add the steps you want to repeat, inside this loop.",[175,9388],{"alt":9389,"src":9081},"axiom.ai adding a loop step",[129,9391,9393],{"id":9392},"_5-add-a-split-a-name-into-columns-sub-step","5. Add a 'Split a name into columns' sub step",[11,9395,9396],{},"Staying within the ‘Loop through data’ step, it’s time to add a sub step, by clicking the white ‘Add step’ button. Search for and add the 'Split a name into columns' step.",[11,9398,9399,9400,8833],{},"In the data field, select '",[236,9401,238],{},[11,9403,9404],{},"Once you've added the step, you should see the names separated as shown in the image. These names can be used to personalize your emails.",[175,9406],{"alt":9407,"src":9408},"axiom.ai adding a split name step to gmail automation","\u002Fblog\u002Fsplit-name-step.jpg",[129,9410,9412],{"id":9411},"_6-add-an-enter-text-sub-step-for-the-to-field","6. Add an ‘Enter text’ sub step for the 'To' field",[11,9414,9415],{},"Add a further sub step by using the Step Finder to search for ‘Enter text’ and clicking on it.",[11,9417,9418],{},"When composing an email in Gmail, the cursor is automatically placed in the 'To' field, so no need to select the 'To' Field.",[11,9420,9421],{},"Click ‘Insert data’ to select the Google Sheet used to store your email addresses, then highlight the column with the email address for the blast.",[175,9423],{"alt":9424,"src":9425},"axiom.ai enter text step","\u002Fblog\u002Fenter-text-step.jpg",[129,9427,9429],{"id":9428},"_7-add-a-press-keys-sub-step-to-enter-email-address","7. Add a 'Press Key(s)' sub step to enter email address",[11,9431,9432],{},"Add a further sub step by using the Step Finder to search for ‘Press key(s)’ and clicking on it.",[11,9434,9435],{},"Inside the step, press record, then the 'Return tab' key. Then click 'Stop recording', and the return tab to move the cursor to the following field.",[175,9437],{"alt":9438,"src":9439},"axiom.ai adding a press keys step","\u002Fblog\u002Fpress-keys-step.jpg",[11,9441,9442],{},"This is an important step, as the return key press enters the email address into the field.",[129,9444,9446],{"id":9445},"_8-add-an-enter-text-sub-step-to-add-email-subject","8. Add an ‘Enter text’ sub step to add email subject",[11,9448,9449],{},"Add a further ‘Enter text’ sub step.",[11,9451,9452],{},"Again, no need to click 'Select' -  just add your subject line into the ‘Text’ field.",[11,9454,9455],{},"If you want to personalize it, you can also insert data from the 'Split a name into columns' step.",[175,9457],{"alt":9424,"src":9425},[129,9459,9461],{"id":9460},"_9-add-a-press-keys-sub-step-to-tab-to-the-email-body","9. Add a 'Press Key(s)' sub step to tab to the email body",[11,9463,9464],{},"Add another ‘Press Key(s)’ sub step by using the Step Finder to search for and add it.",[11,9466,9467],{},"Press record, then the 'tab' key.",[129,9469,9471],{"id":9470},"_10-add-an-enter-text-sub-step-to-add-email-body","10. Add an ‘Enter text’ sub step to add email body",[11,9473,9449],{},[11,9475,9476],{},"Again, no need to click 'Select' - just add your body copy into the ‘Text’ field.",[11,9478,9479],{},"If you want to personalize it, you can also insert data from the 'Split a name into columns' step. See the image below for an example.",[129,9481,9483],{"id":9482},"_11-add-a-click-element-sub-step-to-click-compose","11. Add a ‘Click element’ sub step to click compose",[11,9485,9486],{},"Add a ‘Click element’ sub step by using the Step Finder to search for and add it.",[11,9488,9489],{},"Click ‘Select’ and choose the ‘Compose’ button in Gmail.",[11,9491,9492],{},"Then click 'Custom' in the selector tool and tick the box 'Use element text instead of HTML'.",[11,9494,9495],{},"Finally click 'Send'.",[11,9497,9498],{},"This sends your email. Disable this step during testing.",[129,9500,9502],{"id":9501},"_12-add-a-wait-sub-step","12.  Add a ‘Wait’ sub step",[175,9504],{"alt":9505,"src":9506},"axiom.ai wait step","\u002Fblog\u002Fwait-step.jpg",[11,9508,9509],{},"Add a ‘Wait’ sub step by using the Step Finder to search for and add it.",[11,9511,9512],{},"In the field 'Set a time in milliseconds', input the number 1500. This step briefly pauses the bot to allow Gmail to send the email.",[129,9514,9516],{"id":9515},"_13-add-a-delete-rows-from-a-google-sheet-sub-step","13. Add a ‘Delete rows from a Google Sheet’ sub step",[11,9518,9519],{},"Add a further sub step, 'Delete rows from a Google Sheet', to delete the row of data just entered. This is to prevent the same row from being entered repeatedly. Search for the step using the Step Finder, and add it.",[175,9521],{"alt":9522,"src":9523},"axiom.ai delete rows from google sheet step","\u002Fblog\u002Faxiom-delete-rows-gs.jpg",[11,9525,9526],{},"Next, in ‘Spreadsheet URL’, upload the Google Sheet you are using as your data source.",[11,9528,9529],{},"For 'Sheet name' click on the drop-down and select the correct tab.",[11,9531,9532],{},"Then, in 'First row to delete' enter the number 1 and repeat this in 'Last row to delete', so that both are set to 1. The delete step ensures we do not email the same person repeatedly.",[129,9534,9536],{"id":9535},"_14-add-a-click-element-sub-step-to-open-a-new-email-form","14. Add a ‘Click element’ sub step to open a new email form",[11,9538,9539],{},"Add a final ‘Click element’ step to open the compose form, ready for the next email.",[11,9541,9489],{},[11,9543,9544],{},"Then click 'Custom' in the selector tool and tick the box 'Use element text instead of HTML', then click 'Complete'.",[175,9546],{"alt":9547,"src":9548},"axiom.ai click element step","\u002Fblog\u002Fclick-element-step.jpg",[129,9550,9552],{"id":9551},"_15-ready-to-test","15. Ready to test",[11,9554,9555],{},"Almost there! Your blast email bot should resemble the screenshot below.",[175,9557],{"alt":9505,"src":9558},"\u002Fblog\u002Fgmail-blast-design-patternv2.jpg",[11,9560,9561],{},"Now you’re ready to test your newly built bot, but before you do so, we recommend disabling the last ‘Click Element’ step added, allowing you to test without actually sending emails.",[11,9563,9564],{},"When you’re ready to test, use the desktop app, by clicking ‘Run with desktop app’.",[129,9566,9568],{"id":9567},"_16-running-the-bot","16. Running the bot",[11,9570,9571],{},"You can run the bot in the cloud and the desktop app. If you want to run the bot in the cloud, you will need to share the session or add login steps.",[11,9573,9574,9575,13],{},"To learn more about scheduling, ",[39,9576,9577],{"href":5184},"see here.",[63,9579,9581],{"id":9580},"issues-you-may-encounter-with-the-email-blast-bot","Issues you may encounter with the email blast bot",[187,9583,9584,9587],{},[190,9585,9586],{},"The bot seems confused and out of sync? Ensure the 'Return tab' is set in step 7 of the guide.",[190,9588,9589],{},"The wrong data is being submitted into a field? Re-select the 'Insert data' option in the corresponding 'Enter text' step.",[11,9591,9205,9592],{},[39,9593,9208],{"href":9594,"rel":9595},"https:\u002F\u002Fwww.axiom.ai\u002Fcustomer-support",[43],[63,9597,526],{"id":525},[11,9599,9600],{},"Congratulations, you've learned how to make a Gmail blast bot! With this newly acquired skill, you can save time on your emailing tasks and reach your customers more easily. You can apply the same pattern to any web-based email app, including Outlook. The sky's the limit with your new bot building super powers!",[63,9602,9217],{"id":9216},[11,9604,9605],{},"Axiom is a powerful browser automation tool. If you're excited, here are some ideas for other bots: extract data from your email app (such as Gmail), generate content, and send DMs on social media. We have steps to extract data and to generate text with AI.",{"title":15,"searchDepth":16,"depth":16,"links":9607},[9608,9609,9610,9611,9629,9630,9631],{"id":8965,"depth":542,"text":8966},{"id":9292,"depth":542,"text":9293},{"id":9303,"depth":542,"text":9304},{"id":9317,"depth":542,"text":9318,"children":9612},[9613,9614,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628],{"id":9324,"depth":16,"text":9325},{"id":9333,"depth":16,"text":9334},{"id":9366,"depth":16,"text":9367},{"id":9382,"depth":16,"text":9383},{"id":9392,"depth":16,"text":9393},{"id":9411,"depth":16,"text":9412},{"id":9428,"depth":16,"text":9429},{"id":9445,"depth":16,"text":9446},{"id":9460,"depth":16,"text":9461},{"id":9470,"depth":16,"text":9471},{"id":9482,"depth":16,"text":9483},{"id":9501,"depth":16,"text":9502},{"id":9515,"depth":16,"text":9516},{"id":9535,"depth":16,"text":9536},{"id":9551,"depth":16,"text":9552},{"id":9567,"depth":16,"text":9568},{"id":9580,"depth":542,"text":9581},{"id":525,"depth":542,"text":526},{"id":9216,"depth":542,"text":9217},"2023-11-20",{"read":9634,"type":578,"tool":9635,"category":9636,"tags":9637,"featuredimg":9641,"landingimg":9642,"summary":9643},"22 min read",[580],[6055],[9638,9639,9640],"email","gmail","bulk email","\u002Fblog\u002Fgmail-post.jpg","\u002Fblog\u002Fgmail-sq.jpg","A step-by-step guide that teaches you how to send an email blast with Gmail using a bot.","\u002Fblog\u002Fhow-to-send-email-blast",{"title":9270,"description":9275},"blog\u002Fhow-to-send-email-blast","VHJAO1cOpxmYjVPWtrrCotbK51Jk6rcFKQHQKEVQm3w",{"id":9649,"title":9650,"author":23,"body":9651,"date":10016,"description":10017,"draft":575,"extension":19,"meta":10018,"navigation":24,"path":8151,"seo":10028,"stem":10029,"__hash__":10030},"blog\u002Fblog\u002Fhow-to-automate-social-media-posts.md","How to automate social media posts with a bot",{"type":8,"value":9652,"toc":9994},[9653,9656,9659],[11,9654,9655],{},"How much time do you spend posting on your social media accounts? Keeping an audience engaged requires being consistently active on your social media platforms, which is time consuming. By automating social media posting, the repetitive manual tasks that took hours are now done within minutes. Using bots to take on your posting tasks is a great way to save time, improve efficiency and maximize the benefits of social media to your business.",[60,9657],{"alt":9658},"How to automate social media posts",[9660,9661,9662,9664,9683,9687,9694,9698,9713,9717,9720,9722,9725,9728,9731,9734,9738,9741,9744,9748,9750,9752,9754,9757,9759,9762,9764,9771,9773,9776,9778,9780,9782,9784,9786,9789,9793,9796,9799,9822,9825,9828,9831,9834,9838,9840,9847,9850,9852,9855,9859,9863,9866,9869,9872,9876,9884,9887,9891,9894,9897,9901,9903,9906,9909,9912,9918,9920,9924,9927,9929,9931,9933,9938,9942,9953,9958,9960,9963,9967],"zero-set-up",{},[63,9663,8966],{"id":8965},[11,9665,9666,9667,1140,9670,1140,9674,9678,9679,9682],{},"axiom.ai’s bots are powerful tools that you can delegate repetitive tasks to. Think of them as your very own digital helpers. They’re built using a simple step-by-step process - without the need for code - that replicates your actions in the Chrome browser, allowing you to automate a whole range of tasks including posting on soical media websites including ",[39,9668,9669],{"href":8979},"Amazon Posts",[39,9671,9673],{"href":9672},"\u002Fblog\u002Fhow-to-automate-facebook-posts","Facebook",[39,9675,9677],{"href":9676},"\u002Fguides\u002Fgoogle-sheets-tweeter","Twitter(X)"," and many others including ",[39,9680,9681],{"href":7050},"Instagram.","\nThe beauty of learning how to create bots is that they can be tailored to your specific requirements and scheduled to run independently, freeing up valuable time.",[63,9684,9686],{"id":9685},"how-do-social-media-posting-bots-work","How do social media posting bots work?",[11,9688,9689,9690,9693],{},"Social media automation ",[39,9691,6980],{"href":9692},"\u002Fguides"," run in your Chrome browser and are built to mimic your actions, from logging into the app and opening up the post form. Once open, your bot can populate it from text and files stored on your computer or in a Google Sheet.",[63,9695,9697],{"id":9696},"what-would-you-recommend-using-a-social-media-posting-bot-for","What would you recommend using a social media posting bot for?",[11,9699,9700,9701,1140,9704,1140,9706,9709,9710,9712],{},"You can build bots to handle posting to a wide range of web applications, including ",[39,9702,9703],{"href":8979},"Amazon posts",[39,9705,9673],{"href":9672},[39,9707,9708],{"href":9676},"Twitter or X posts",", Tiktok posts, Pinterest, LinkedIn, Tumblr, Reddit, YouTube, Snapchat, WeChat, Weibo, Tencent, ",[39,9711,2696],{"href":7050}," and more.",[63,9714,9716],{"id":9715},"lets-learn-how-to-build-a-bot-that-posts-to-social-media","Let’s learn how to build a bot that posts to social media",[11,9718,9719],{},"Use axiom.ai’s simple point-and-click interface to create as many social media posting bots as you want. By following the steps below, you'll have a working bot in no time.",[129,9721,9325],{"id":9324},[11,9723,9724],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering 'sheet.new' into the address bar.",[11,9726,9727],{},"Don’t forget to name your sheet something like 'Instagram Posts’.",[11,9729,9730],{},"Set up your sheet with the post text in one column and paths to your post images in another.",[11,9732,9733],{},"Set up a second tab on your sheet titled ‘Posted’. In this the bot will record when a post was submitted.",[129,9735,9737],{"id":9736},"_2-start-from-blank","2. Start from blank",[11,9739,9740],{},"To build your social media bot from scratch, click on 'Start blank’. This will open the step selector and you can start adding steps to your bot.",[175,9742],{"alt":9743,"src":9009},"axiom.ai add first step to build a social media bot",[129,9745,9747],{"id":9746},"_3-add-your-first-step-read-data-from-a-google-sheet","3. Add your first step: ‘Read data from a Google Sheet’",[175,9749],{"alt":9337,"src":9338},[11,9751,9341],{},[175,9753],{"alt":9347,"src":9348},[11,9755,9756],{},"In the field called 'Spreadsheet URL', you can search for and upload the Google Sheet you are using as your data source, by name. Once found, click on it to select.",[11,9758,9529],{},[11,9760,9761],{},"In the 'First cell' field, toggle the switch and enter 'A1’. This setting tells the bot where to start reading data.",[11,9763,9357],{},[11,9765,9766,9767,13],{},"If you want to ",[39,9768,9770],{"href":9769},"\u002Fguides\u002Fgoogle-sheets","learn more about Google Sheet steps, watch these videos",[129,9772,9383],{"id":9382},[11,9774,9775],{},"Next, add a new step by entering ‘Loop through data’ into the Step Finder, and adding it. This step will allow your bot to loop through the rows of data stored in the Google Sheet.",[175,9777],{"alt":9389,"src":9081},[129,9779,9085],{"id":9084},[11,9781,9088],{},[175,9783],{"alt":9104,"src":7706},[11,9785,9091],{},[11,9787,9788],{},"In the 'Enter URL' field, cut and paste your social media URL. This step will open your platform of choice.",[129,9790,9792],{"id":9791},"_6-add-further-sub-steps-needed-for-the-data-entry","6. Add further sub steps needed for the data entry",[11,9794,9795],{},"Continuing within the same step, add further sub steps. You’ll need to add a combination of sub steps that will enter data into the inputs found in the form you want to automate.",[11,9797,9798],{},"You can choose from the following steps:",[187,9800,9801,9808,9815],{},[190,9802,9803,9807],{},[39,9804,9806],{"href":9805},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-element","Click element"," - for radio buttons (option buttons), toggles and checkboxes",[190,9809,9810,9814],{},[39,9811,9813],{"href":9812},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fenter-text","Enter text"," - for entering data into inputs",[190,9816,9817,9821],{},[39,9818,9820],{"href":9819},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fupload-file","Upload file","- for uploading files such as images",[11,9823,9824],{},"Use the Step Finder to find and add the right combination of steps for your task.",[11,9826,9827],{},"You will then need to configure each step. Click ‘Select’ to tell it which element to interact with, and the ‘Insert data’ to pass data from the Google Sheet.",[11,9829,9830],{},"The order will likely look something like this: a ‘Click element’ step to initiate post generation, and ‘Enter text’ step to add title and body, and an ‘Upload file’ step to attach image files. A final ‘Click element’ step will be needed to submit the post.",[11,9832,9833],{},"Top tip: you may need to include a ‘Wait’ steps to allow the page to load image files, before the bot progresses on to the next step.",[129,9835,9837],{"id":9836},"_7-add-a-delete-rows-from-a-google-sheet-sub-step","7. Add a ‘Delete rows from a Google Sheet’ sub step",[175,9839],{"alt":9522,"src":9523},[11,9841,9842,9843,9846],{},"Using the Step Finder, search for ",[39,9844,466],{"href":9845},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdelete-rows-from-a-google-sheet",", and add it. This is to delete the row of data just entered, preventing the same row from being entered repeatedly.",[11,9848,9849],{},"In ‘Spreadsheet URL’, upload the Google Sheet you are using as your data source.",[11,9851,9529],{},[11,9853,9854],{},"Then, in 'First row to delete' enter the number 1 and repeat this in 'Last row to delete', so that both are set to 1. The delete step ensures we do not repost the same content repeatedly.",[129,9856,9858],{"id":9857},"_8-add-a-get-date-and-time-sub-step","8. Add a ‘Get date and time’ sub step",[175,9860],{"alt":9861,"src":9862},"axiom.ai get time and date step automating social media","\u002Fblog\u002Fget-time-date.jpg",[11,9864,9865],{},"Add a ‘Get date and time’ sub step by using the Step Finder to search for and add it.",[11,9867,9868],{},"In ‘Select date’, select ‘Current’.",[11,9870,9871],{},"In ‘Select format’, select the date format you require.",[129,9873,9875],{"id":9874},"_9-add-append-or-merge-data-sub-step","9. Add ‘Append or Merge Data’ sub step",[11,9877,9878,9879,9883],{},"Add a ",[39,9880,9882],{"href":9881},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fappend-or-merge-data","‘Append or Merge Data’"," sub step by using the Step Finder to search for and add it.",[11,9885,9886],{},"In ‘Data A’, select the post title column in your source Google Sheet.",[175,9888],{"alt":9889,"src":9890},"axiom.ai append merge data step","\u002Fblog\u002Fappend-merge-data.jpg",[11,9892,9893],{},"In ‘Data B’ add the current date and time to record the time your post was submitted.",[11,9895,9896],{},"In ‘Append mode’, select ‘Vertical’.",[129,9898,9900],{"id":9899},"_10-add-write-data-to-a-google-sheet-sub-step","10. Add ‘Write data to a Google Sheet’ sub step",[175,9902],{"alt":9131,"src":9132},[11,9904,9905],{},"Add a ‘Write data to a Google Sheet’ sub step by using the Step Finder to search for and add it.",[11,9907,9908],{},"In the 'Spreadsheet URL' field, search for the Google Sheet you created at the beginning of this tutorial.",[11,9910,9911],{},"In the 'Sheet name' field, select 'Posted'.",[11,9913,9914,9915,8833],{},"In the 'Data' field, select '",[236,9916,9917],{},"append-data",[11,9919,9150],{},[129,9921,9923],{"id":9922},"_10-ready-to-test","10. Ready to test",[11,9925,9926],{},"Before you test, we recommend disabling the last ‘Click Element’ step added, allowing you to test without actually posting.",[11,9928,9564],{},[129,9930,9171],{"id":9170},[11,9932,9571],{},[11,9934,9935,9936,13],{},"If you want to learn more about scheduling, ",[39,9937,9577],{"href":5184},[63,9939,9941],{"id":9940},"issues-you-may-encounter-with-social-media-posting-bot","Issues you may encounter with social media posting bot",[187,9943,9944,9947,9950],{},[190,9945,9946],{},"‘Enter text’ steps not working? Try reselecting and making sure you’ve inserted the data.",[190,9948,9949],{},"Bot working on the desktop app, but not when run in the cloud? Add Login steps.",[190,9951,9952],{},"Bot doesn’t wait for the image to upload? You may want to use Wait steps to ensure the automation is in sync with the page.",[11,9954,9955,9956],{},"Don't forget we offer excellent customer support. If you need help, get in touch. ",[39,9957,522],{"href":521},[63,9959,526],{"id":525},[11,9961,9962],{},"Congratulations, you've learned how to make and use a social media posting bot. With this newly acquired skill, you have built a tool to automate content input and posting, helping you keep your audience engaged. You can use this tool across multiple social media platforms. The sky's the limit with your new super powers!",[63,9964,9966],{"id":9965},"what-else-can-i-automate-with-axiom","What else can I automate with Axiom?",[11,9968,9969,9970,1140,9972,767,9975,9978,9979,9982,9983,1140,9987,9990,9991],{},"Axiom is a powerful browser automation tool. If you're excited, here are some ideas for social media bots: such as ",[39,9971,9223],{"href":8979},[39,9973,9974],{"href":9672},"Automating Facebook posting",[39,9976,9977],{"href":593},"automating DMs on Instagram."," We also have these social media templates, ",[39,9980,9981],{"href":9676},"Twitter posting",",\n",[39,9984,9986],{"href":9985},"\u002Fguides\u002Fautomate-facebook-posts","Facebook posting",[39,9988,9989],{"href":7050},"Instagram Posts"," and finally ",[39,9992,9993],{"href":172},"Insatgram DMs.",{"title":15,"searchDepth":16,"depth":16,"links":9995},[9996,9997,9998,9999,10013,10014,10015],{"id":8965,"depth":542,"text":8966},{"id":9685,"depth":542,"text":9686},{"id":9696,"depth":542,"text":9697},{"id":9715,"depth":542,"text":9716,"children":10000},[10001,10002,10003,10004,10005,10006,10007,10008,10009,10010,10011,10012],{"id":9324,"depth":16,"text":9325},{"id":9736,"depth":16,"text":9737},{"id":9746,"depth":16,"text":9747},{"id":9382,"depth":16,"text":9383},{"id":9084,"depth":16,"text":9085},{"id":9791,"depth":16,"text":9792},{"id":9836,"depth":16,"text":9837},{"id":9857,"depth":16,"text":9858},{"id":9874,"depth":16,"text":9875},{"id":9899,"depth":16,"text":9900},{"id":9922,"depth":16,"text":9923},{"id":9170,"depth":16,"text":9171},{"id":9940,"depth":542,"text":9941},{"id":525,"depth":542,"text":526},{"id":9965,"depth":542,"text":9966},"2023-11-19","A step-by-step guide that teaches you how to post on social media using a bot.",{"read":10019,"type":578,"tool":10020,"category":10021,"tags":10022,"featuredimg":10026,"landingimg":10027,"summary":10017},"20 min read",[580],[6055],[10023,10024,9258,10025,585],"posts","facebook","Twitter","\u002Fblog\u002Fsocial-media-hero.jpg","\u002Fblog\u002Fsocial-media-sq.jpg",{"title":9650,"description":10017},"blog\u002Fhow-to-automate-social-media-posts","VEAod-pu-YYodDPR4Q10mFEMIj8Qh8BKhgvn7Bo0rFU",{"id":10032,"title":10033,"author":23,"body":10034,"date":10410,"description":10038,"draft":575,"extension":19,"meta":10411,"navigation":24,"path":9672,"seo":10419,"stem":10420,"__hash__":10421},"blog\u002Fblog\u002Fhow-to-automate-facebook-posts.md","How to automate facebook posts",{"type":8,"value":10035,"toc":10388},[10036,10039,10042,10045,10049,10052,10056,10059,10063,10066,10069,10076,10078,10089,10093,10100,10102,10106,10110,10112,10119,10121,10123,10130,10136,10142,10144,10149,10151,10153,10159,10162,10167,10173,10177,10180,10182,10189,10192,10196,10203,10205,10210,10216,10220,10225,10230,10234,10241,10245,10252,10259,10267,10271,10275,10282,10286,10292,10294,10300,10306,10312,10316,10319,10323,10330,10336,10340,10343,10350,10354,10365,10368,10370,10373,10375],[11,10037,10038],{},"Using Facebook is a crucial day-to-day business activity for many of us, but creating posts across multiple accounts, whether for your own businesses or for clients, can be time consuming. 🤖 Bots are incredibly helpful in freeing up time and saving us from the tedious and repetitive tasks we tend to encounter while using a browser.",[60,10040],{"alt":10041},"How to automate facebook posts with axiom.ai",[11,10043,10044],{},"In this guide, we show you how to build a bot that can automate your Facebook posts directly in the browser. The design pattern you will learn can be applied to post from a profile. It can also be used to automate posts directly from Facebook Business pages. Get ready to dive in and discover the joy of using bots!",[63,10046,10048],{"id":10047},"what-exactly-is-a-facebook-bot","What exactly is a Facebook bot?",[11,10050,10051],{},"It’s like having your own digital assistant that you can delegate your Facebook tasks to. axiom.ai’s bots are highly customizable, and you can use them to automate almost anything in the browser, without having to use code. The beauty of learning to create bots is that they can be tailored to your specific requirements by mimicking your actions.",[63,10053,10055],{"id":10054},"how-does-a-facebook-bot-work","How does a Facebook bot work?",[11,10057,10058],{},"Facebook bots run in your Chrome browser and are built to mimic your actions, from logging into the app, clicking the menu button, and posting. Once the post form is open, your bot can populate it from files and text stored on your computer or in a Google Sheet.",[63,10060,10062],{"id":10061},"lets-learn-how-to-build-a-bot-to-automate-facebook-posts","Let’s learn how to build a bot to automate Facebook posts",[11,10064,10065],{},"With axiom.ai's no-code bot builder, you can create bots for posting on Facebook without having to code. Instead, use a simple point-and-click interface to create as many Facebook bots as you want. By following the steps below, you'll have a working bot automating your posts in no time.",[11,10067,10068],{},"The steps below outline how to use Google Sheets to store your posts, pass the data into your bot, and automate posting in the browser. The bot will click the “What’s on your mind” input field to open the post web form. You can also adapt what you learn here to post from Facebook Business pages.",[11,10070,10071,10072,10075],{},"If you're eager to start, why not give this\n",[39,10073,10074],{"href":9985},"template."," a try?",[129,10077,9325],{"id":9324},[11,10079,10080,10081,10084,10085,10088],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering ",[49,10082,10083],{},"'sheet.new'"," into the address bar. Don’t forget to name your sheet something like ",[49,10086,10087],{},"'Facebook Posts’",". In the sheet, add some text data, with the text in one column and paths to your post images in another.",[129,10090,10092],{"id":10091},"_2-add-first-step","2. Add first step",[11,10094,10095,10096,10099],{},"To build your bot from scratch, click on ",[49,10097,10098],{},"'Add first step’",". This will open the step selector and you can start adding steps to your bot.",[175,10101],{"alt":9008,"src":9009},[129,10103,10105],{"id":10104},"_3-add-the-step-read-data-from-a-google-sheet","3. Add the step: ‘Read data from a Google Sheet’",[11,10107,7654,10108,7658],{},[49,10109,7657],{},[175,10111],{"alt":9337,"src":9338},[11,10113,10114,10115,10118],{},"In the field called ",[49,10116,10117],{},"'Spreadsheet URL'",", you can search for and upload the Google Sheet you are using as your data source, by name. Once found, click on it to select.",[11,10120,9529],{},[175,10122],{"alt":9347,"src":9348},[11,10124,10125,10126,10129],{},"In the ",[49,10127,10128],{},"'First cell'"," field, toggle the switch and enter 'A1’. This setting tells the bot where to start reading data.",[11,10131,10125,10132,10135],{},[49,10133,10134],{},"'Last cell'"," field, click the toggle switch and enter 'A1'. You have limited the bot to read ten rows. This is fine for now, you can increase the amount later once you’ve tested it.",[11,10137,10138,10139,13],{},"If you want to learn more about Google Sheet steps, ",[39,10140,10141],{"href":9769},"watch these videos",[129,10143,9383],{"id":9382},[11,10145,7680,10146,10148],{},[49,10147,7683],{}," into the Step Finder, and adding it. This step will allow your bot to loop through the rows of data stored in the Google Sheet.",[175,10150],{"alt":9389,"src":9081},[129,10152,9085],{"id":9084},[11,10154,10155,10156,10158],{},"Staying within the ",[49,10157,7683],{}," step, it’s time to add a sub step (click the white ‘Add step’ button).",[175,10160],{"alt":9104,"src":10161},"\u002Fblog\u002Fgo-to-page-blank.jpg",[11,10163,7654,10164,10166],{},[49,10165,7693],{}," and click on it. The step will be added for you to configure.",[11,10168,10125,10169,10172],{},[49,10170,10171],{},"'Enter URL'"," field, cut and paste the Facebook URL. This step will open Facebook.",[129,10174,10176],{"id":10175},"_5-add-a-click-element-sub-step","5. Add a ‘Click element’ sub step",[11,10178,10179],{},"Continuing within the same step, add a further sub step. Use the Step Finder to search for ‘Click element’ and click on it.",[175,10181],{"alt":9547,"src":9548},[11,10183,10184,10185,10188],{},"Next, click ",[49,10186,10187],{},"‘Select’"," and choose the “What’s on your mind” input field.",[11,10190,10191],{},"This click opens the post form.",[129,10193,10195],{"id":10194},"_6-add-an-enter-text-sub-step","6. Add an ‘Enter text’ sub step",[11,10197,10198,10199,10202],{},"Add a further sub step by using the Step Finder to search for ",[49,10200,10201],{},"‘Enter text’"," and clicking on it.",[175,10204],{"alt":9424,"src":9425},[11,10206,10184,10207,10209],{},[49,10208,10187],{}," to highlight the “What's on your mind” text and click confirm.",[11,10211,10212,10213,10215],{},"Then click ",[49,10214,7701],{}," to select the Google Sheet used to store your posts, then highlight the column with the text for the post.",[129,10217,10219],{"id":10218},"_7-add-click-element-sub-step","7. Add ‘Click element’ sub step",[11,10221,10198,10222,10202],{},[49,10223,10224],{},"‘Click element’",[11,10226,10212,10227,10229],{},[49,10228,10187],{}," and choose the icon for uploading images: the green picture icon.",[129,10231,10233],{"id":10232},"_8-add-upload-a-file-sub-step","8. Add ‘Upload a file’ sub step",[11,10235,10236,10237,10240],{},"Add a further sub step by using the Step Finder to search for the ",[49,10238,10239],{},"‘Upload a file’"," step and clicking on it.",[175,10242],{"alt":10243,"src":10244},"axiom.ai file upload step","\u002Fblog\u002Ffile-upload-step.jpg",[11,10246,10247,10248,10251],{},"Next, select the grey ",[49,10249,10250],{},"‘Add photos\u002Fvideos’"," area pictured below.",[11,10253,10254,10255,10258],{},"Then, in ",[49,10256,10257],{},"‘File path’",", click ‘Insert data’ and select the column in your Google Sheet with the file path.",[11,10260,10261,10262,10264,10265,10229],{},"Next, in ",[49,10263,10224],{},", click ",[49,10266,10187],{},[129,10268,10270],{"id":10269},"_9-add-click-element-sub-step-to-click-on-post","9. Add ‘Click element’ sub step to click on Post",[11,10272,10198,10273,10202],{},[49,10274,10224],{},[11,10276,10277,10278,10281],{},"Select and highlight the blue ",[49,10279,10280],{},"‘Post’"," button in Facebook. Click ‘Confirm’ and hey presto, you have built your Facebook bot.",[129,10283,10285],{"id":10284},"_10-finally-add-the-delete-rows-from-a-google-sheet-sub-step","10 Finally, Add the ‘Delete rows from a Google Sheet’ sub step",[11,10287,10288,10289,10291],{},"Add a further sub step, ",[49,10290,466],{},", to delete the row of data just entered. This is to prevent the same row from being entered repeatedly. Search for the step using the Step Finder, and add it.",[175,10293],{"alt":9522,"src":9523},[11,10295,10261,10296,10299],{},[49,10297,10298],{},"‘Spreadsheet URL’",", upload the Google Sheet you are using as your data source.",[11,10301,5224,10302,10305],{},[49,10303,10304],{},"'Sheet name'"," click on the drop-down and select the correct tab.",[11,10307,10254,10308,10311],{},[49,10309,10310],{},"'First row to delete'"," enter the number 1 and repeat this in 'Last row to delete', so that both are set to 1.",[129,10313,10315],{"id":10314},"_11-ready-to-test","11. Ready to test",[11,10317,10318],{},"And that’s it! Your bot should look something like the below.",[175,10320],{"alt":10321,"src":10322},"axiom.ai facebook post design pattern","\u002Fblog\u002Ffb-post-design-pattern.jpg",[11,10324,10325,10326,10329],{},"Before you test, we recommend disabling the last ",[49,10327,10328],{},"‘Click Element’"," step added, allowing you to test without actually posting.",[11,10331,10332,10333,13],{},"When you’re ready to test, use the desktop app, by clicking ",[49,10334,10335],{},"‘Run with desktop app’",[129,10337,10339],{"id":10338},"_12-running-the-bot","12. Running the bot",[11,10341,10342],{},"You can run the bot in the cloud and the desktop app. If you want to learn more about scheduling, see here.",[11,10344,10345,10346],{},"Please note that if you build a bot on the desktop app when logged in, your session will be shared. However if you run the bot in the cloud, the session will not be shared. Learn how to work around this ",[39,10347,10349],{"href":10348},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin","here.",[63,10351,10353],{"id":10352},"issues-you-may-encounter-with-your-facebook-bot","Issues you may encounter with your Facebook bot",[187,10355,10356,10359,10362],{},[190,10357,10358],{},"The file isn’t uploading? Try reselecting the upload file element in step 8.",[190,10360,10361],{},"The file is uploading, but the bot clicks post before it's finished? You may want to use ‘Wait’ steps to ensure the automation is in sync with the page.",[190,10363,10364],{},"The post button isn’t clicking? Try using the text selector.",[11,10366,10367],{},"Don't forget we offer excellent customer support. If you need help, get in touch. (\u002Fcustomer-support)",[63,10369,526],{"id":525},[11,10371,10372],{},"🥳 Congratulations, you've learned how to make and use a bot to extract reports! With this newly acquired skill 👩‍🎓, you know how to automate scraping data, downloading files and sending emails. The sky's the limit with your new AI 🦸 super powers.",[63,10374,9966],{"id":9965},[11,10376,10377,10378,10382,10383,10385,10386],{},"If you're excited, here are some ideas for other bots: extract data from your email app (such as ",[39,10379,10381],{"href":10380},"\u002Fblog\u002Fhow-to-scrape-emails","Gmail","), generate content, and send direct messages on ",[39,10384,2696],{"href":172},". We have steps to extract data with AI and to generate text with AI. Take a look at our templates ",[39,10387,10349],{"href":9692},{"title":15,"searchDepth":16,"depth":16,"links":10389},[10390,10391,10392,10407,10408,10409],{"id":10047,"depth":542,"text":10048},{"id":10054,"depth":542,"text":10055},{"id":10061,"depth":542,"text":10062,"children":10393},[10394,10395,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406],{"id":9324,"depth":16,"text":9325},{"id":10091,"depth":16,"text":10092},{"id":10104,"depth":16,"text":10105},{"id":9382,"depth":16,"text":9383},{"id":9084,"depth":16,"text":9085},{"id":10175,"depth":16,"text":10176},{"id":10194,"depth":16,"text":10195},{"id":10218,"depth":16,"text":10219},{"id":10232,"depth":16,"text":10233},{"id":10269,"depth":16,"text":10270},{"id":10284,"depth":16,"text":10285},{"id":10314,"depth":16,"text":10315},{"id":10338,"depth":16,"text":10339},{"id":10352,"depth":542,"text":10353},{"id":525,"depth":542,"text":526},{"id":9965,"depth":542,"text":9966},"2023-11-12",{"read":10412,"type":578,"tool":10413,"category":10414,"tags":10415,"featuredimg":10416,"landingimg":10417,"summary":10418},"18 min read",[580],[6055],[7249,10024,8152,1976],"\u002Fblog\u002FFB-LONG.jpg","\u002Fblog\u002FFB.jpg","Thanks to automation, repetitive inputting of data can be delegated to bots.",{"title":10033,"description":10038},"blog\u002Fhow-to-automate-facebook-posts","yGJ5dfWqKoncgQhZjjz5bXHOJ_sGurPRcw-wF0XrWsM",{"id":10423,"title":10424,"author":23,"body":10425,"date":10739,"description":15,"draft":575,"extension":19,"meta":10740,"navigation":24,"path":8144,"seo":10749,"stem":10750,"__hash__":10751},"blog\u002Fblog\u002Fhow-to-automate-data-entry.md","How to automate data entry with a bot",{"type":8,"value":10426,"toc":10718},[10427,10431,10434,10437,10440,10444,10447,10451,10454,10458,10461,10465,10468,10471,10474,10478,10480,10483,10487,10491,10493,10495,10497,10501,10505,10507,10511,10520,10529,10535,10537,10541,10543,10545,10554,10558,10563,10565,10567,10569,10571,10582,10586,10588,10597,10601,10610,10612,10622,10626,10630,10632,10636,10640,10644,10646,10648,10652,10658,10664,10671,10673,10679,10683,10687,10698,10702,10704,10707,10709],[63,10428,10430],{"id":10429},"why-automate-data-entry-with-bots","Why automate data entry with bots?",[11,10432,10433],{},"Who wouldn’t want to automate data entry? 🥱 It’s rather a tedious manual task, after all, and one that the average employee spends a significant amount of time on 🕥. Due to its repetitive nature, it can be challenging to maintain focus, resulting in errors.",[60,10435],{"alt":10436},"how to automate data entry",[11,10438,10439],{},"Thanks to automation, repetitive inputting of data can be delegated to bots, eliminating errors, increasing productivity, and freeing up valuable time. 🤖 Bots will never get bored like me or you, and watching them do their thing in the browser is just magical. Read on to learn how to build your very own data entry bot.",[63,10441,10443],{"id":10442},"what-exactly-is-a-data-entry-bot","What exactly is a data entry bot?",[11,10445,10446],{},"It’s like having your own digital assistant 🦾 that you can delegate your data entry tasks to. axiom.ai’s bots are highly customizable, and you can use them to automate almost anything in the browser, without having to use code. The beauty of learning to create bots is that they can be tailored to your specific requirements by mimicking your actions.",[63,10448,10450],{"id":10449},"what-would-you-recommend-using-a-data-entry-bot-for","What would you recommend using a data entry bot for?",[11,10452,10453],{},"If you are manually entering data into a web app in the Chrome browser, then the data entry task can be automated. Our customers are automating data entry into thousands of different web apps, ranging from 💡 social media platforms, to 💡 e-commerce and listing apps, to 💡 CRM and legacy web apps.",[63,10455,10457],{"id":10456},"how-does-a-data-entry-bot-work","How does a data entry bot work?",[11,10459,10460],{},"Data entry bots run in your Chrome browser and are built to mimic your actions, from logging into web apps, entering data into webforms, and submitting it. It can pull your data for inputting from sources such as Google Sheets, CSVs and web hooks. What’s more, if you have multiple data entry tasks, you can run multiple bots, and schedule them to run day and night.",[63,10462,10464],{"id":10463},"lets-learn-how-to-build-a-data-entry-bot-with-axiomai","Let’s learn how to build a data entry bot with axiom.ai",[11,10466,10467],{},"With axiom.ai's no-code bot builder, you can create bots for data entry use cases without having to code. Instead, use a simple point-and-click interface to create as many data entry bots as you want. By following the steps below, you'll have a working bot inputting rows upon rows of data into your web app in no time.",[11,10469,10470],{},"In this example, we’re going to show you how to take data from a Google Sheet and enter it into a webform. However, you can easily adapt this design pattern to any data source.",[11,10472,10473],{},"👇👇👇👇",[11,10475,10071,10476,10075],{},[39,10477,10074],{"href":6411},[129,10479,9325],{"id":9324},[11,10481,10482],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering 'sheet.new' into the address bar. Don’t forget to name your sheet something like 'Data’. Then add some data to test your bot with.",[129,10484,10486],{"id":10485},"_1-add-first-step","1. Add first step",[11,10488,10095,10489,10099],{},[49,10490,10098],{},[175,10492],{"alt":9008,"src":9009},[129,10494,9747],{"id":9746},[175,10496],{"alt":9337,"src":9338},[11,10498,7654,10499,7658],{},[49,10500,7657],{},[11,10502,10114,10503,10118],{},[49,10504,10117],{},[175,10506],{"alt":9347,"src":9348},[11,10508,5224,10509,10305],{},[49,10510,10304],{},[11,10512,10125,10513,10515,10516,10519],{},[49,10514,10128],{}," field, toggle the switch and enter ",[49,10517,10518],{},"'A1’",". This setting tells the bot where to start reading data.",[11,10521,10125,10522,10524,10525,10528],{},[49,10523,10134],{}," field, click the toggle switch and enter ",[49,10526,10527],{},"'A10'",". You have limited the bot to read ten rows. This is fine for now, you can increase the amount later once you’ve tested it.",[11,10530,10531,10532,13],{},"If you want to learn more about Google Sheet steps, watch ",[39,10533,10534],{"href":9769},"these videos",[129,10536,9383],{"id":9382},[11,10538,7680,10539,10148],{},[49,10540,7683],{},[175,10542],{"alt":9389,"src":9081},[129,10544,9085],{"id":9084},[11,10546,10155,10547,10549,10550,10553],{},[49,10548,7683],{}," step, it’s time to add a sub step (click the white ",[49,10551,10552],{},"‘Add step’"," button).",[11,10555,7654,10556,10166],{},[49,10557,7693],{},[11,10559,10114,10560,10562],{},[49,10561,10171],{},", cut and paste the URL to the site you want to input data.",[175,10564],{"alt":9104,"src":7706},[129,10566,9792],{"id":9791},[11,10568,9795],{},[11,10570,9798],{},[187,10572,10573,10576,10579],{},[190,10574,10575],{},"Enter text - for entering data into inputs",[190,10577,10578],{},"Select list - for automating drop-down menus",[190,10580,10581],{},"Click element - Use for radio buttons (option buttons), toggles and checkboxes",[175,10583],{"alt":10584,"src":10585},"axiom.ai add the steps required to replicate your actions","\u002Fblog\u002Finteract-steps.jpg",[11,10587,9824],{},[11,10589,10590,10591,10593,10594,10596],{},"You will then need to configure each step. Click ",[49,10592,10187],{}," to tell it which element to interact with, and the ",[49,10595,7701],{}," to pass data from the Google Sheet.",[129,10598,10600],{"id":10599},"_7-add-the-click-element-sub-step-to-submit-the-form","7. Add the ‘Click element’ sub step to submit the form",[11,10602,10603,10604,10606,10607,10609],{},"Still within the ",[49,10605,7683],{}," step, add the ",[49,10608,10224],{}," sub step to submit the form. Add it, then click ‘Select’ to highlight the submit button in the web form and click confirm.",[175,10611],{"alt":9547,"src":9548},[11,10613,10614,10615,10617,10618,10621],{},"Top tip: If the submit button has unique text, use the custom select option. Click ",[49,10616,10187],{}," then ",[49,10619,10620],{},"‘Custom’"," and tick the box labeled ‘Use text by element instead of html’.",[129,10623,10625],{"id":10624},"_8-add-the-delete-rows-from-a-google-sheet-sub-step","8. Add the ‘Delete rows from a Google Sheet’ sub step",[11,10627,10288,10628,10291],{},[49,10629,466],{},[175,10631],{"alt":9522,"src":9523},[11,10633,10261,10634,10299],{},[49,10635,10298],{},[11,10637,5224,10638,10305],{},[49,10639,10304],{},[11,10641,10254,10642,10311],{},[49,10643,10310],{},[129,10645,9157],{"id":9156},[11,10647,10318],{},[175,10649],{"alt":10650,"src":10651},"axiom.ai data entry design pattern","\u002Fblog\u002Fdesign-pattern-data.jpg",[11,10653,10654,10655,13],{},"Now you’re ready to test in the Axiom desktop app, by clicking ",[49,10656,10657],{},"‘Run’",[11,10659,10660,10661,10663],{},"You may want to test without actually submitting the form. You can do so by disabling the ",[49,10662,10328],{}," set up in step 7. See how in the image below:",[11,10665,10666,10667,10670],{},"When you’ve finished testing and you want to increase the size of your loop, edit the ",[49,10668,10669],{},"‘Last cell’"," field mentioned in step 3 and run again.",[129,10672,9171],{"id":9170},[11,10674,10675,10676],{},"You can run this bot in the cloud and the desktop app. If you want to learn more about scheduling, ",[39,10677,10678],{"href":9177},"See here.",[11,10680,10345,10681],{},[39,10682,10349],{"href":10348},[63,10684,10686],{"id":10685},"issues-you-may-encounter-with-your-data-entry-bot","Issues you may encounter with your data entry bot",[187,10688,10689,10692,10695],{},[190,10690,10691],{},"The bot is looping through the same row? Check that step 8 is correctly configured and is deleting rows in the Google sheet.",[190,10693,10694],{},"Data is entered in the wrong input? You may want to use ‘Wait’ steps to ensure the automation is in sync with the page load.",[190,10696,10697],{},"Content is loading as you automate form? You may want to use ‘Wait’ steps to ensure the automation is in sync with the page.",[11,10699,9205,10700],{},[39,10701,9208],{"href":521},[63,10703,526],{"id":525},[11,10705,10706],{},"👩‍🎓 Congratulations, you've learned how to make and use a data entry bot to input data into web forms. With this newly acquired skill, you know how to automate data entry into any web app and how to loop through large volumes of data. The sky's the limit with your new super powers. 🧙 👩‍🚀 👩‍🔬",[63,10708,9966],{"id":9965},[11,10710,10377,10711,10713,10714,10385,10716],{},[39,10712,10381],{"href":10380},", generate content, and send direct messages on ",[39,10715,2696],{"href":172},[39,10717,10349],{"href":9692},{"title":15,"searchDepth":16,"depth":16,"links":10719},[10720,10721,10722,10723,10724,10736,10737,10738],{"id":10429,"depth":542,"text":10430},{"id":10442,"depth":542,"text":10443},{"id":10449,"depth":542,"text":10450},{"id":10456,"depth":542,"text":10457},{"id":10463,"depth":542,"text":10464,"children":10725},[10726,10727,10728,10729,10730,10731,10732,10733,10734,10735],{"id":9324,"depth":16,"text":9325},{"id":10485,"depth":16,"text":10486},{"id":9746,"depth":16,"text":9747},{"id":9382,"depth":16,"text":9383},{"id":9084,"depth":16,"text":9085},{"id":9791,"depth":16,"text":9792},{"id":10599,"depth":16,"text":10600},{"id":10624,"depth":16,"text":10625},{"id":9156,"depth":16,"text":9157},{"id":9170,"depth":16,"text":9171},{"id":10685,"depth":542,"text":10686},{"id":525,"depth":542,"text":526},{"id":9965,"depth":542,"text":9966},"2023-11-07",{"read":10741,"type":578,"tool":10742,"category":10743,"tags":10744,"featuredimg":10747,"landingimg":10748,"summary":10418},"13 min read",[580],[2915],[10745,6667,8938,10746,1976],"bot","data input","\u002Fblog\u002Fdata-entry-long.jpg","\u002Fblog\u002Fdata-entry.jpg",{"title":10424,"description":15},"blog\u002Fhow-to-automate-data-entry","eibpmJZAVlLEpillHs3_B_4V1x8a3pjVcAbu_LjyGC0",{"id":10753,"title":10754,"author":23,"body":10755,"date":10739,"description":10953,"draft":575,"extension":19,"meta":10954,"navigation":24,"path":10961,"seo":10962,"stem":10963,"__hash__":10964},"blog\u002Fblog\u002Fhow-to-automate-downloadin-a-file-from-a-website.md","How to automate downloading a file from a website",{"type":8,"value":10756,"toc":10937},[10757,10764,10767,10770,10773,10777,10780,10783,10791,10794,10798,10801,10805,10808,10810,10814,10816,10821,10825,10834,10837,10847,10850,10854,10856,10860,10863,10867,10870,10874,10876,10880,10888,10892,10896,10917,10919,10926,10928],[11,10758,10759,10760,10763],{},"If your job or business requires you to spend lots of time ",[39,10761,10762],{"href":7286},"downloading files"," from websites, you might want to consider automating this process with axiom.ai’s no-code bots.",[11,10765,10766],{},"The reason for automating repetitive browser tasks such as file downloading is simple: it saves you time and money. Instead of spending time on repetitive, manual tasks yourself, or employing someone to do so, they’re taken care of by easy-to-build bots.",[60,10768],{"alt":10769},"How to automate file downloads from a website",[11,10771,10772],{},"Read on to learn how to make your very own customized bot to help you reduce manual effort and save valuable time.",[63,10774,10776],{"id":10775},"what-exactly-is-a-bot-and-how-does-it-work","What exactly is a bot and how does it work?",[11,10778,10779],{},"Axiom’s bots are powerful tools that you can delegate browser tasks to. Think of them as your very own digital assistant. They’re built using a simple step-by-step process - without the need for code - that replicates your actions in the Chrome browser, allowing you to automate all sorts of repetitive tasks, including file downloading.",[11,10781,10782],{},"The beauty of learning how to create bots is that they can be tailored to your specific requirements. If you have several file downloading tasks, you can run multiple bots, either on demand or scheduling them according to your preference.",[63,10784,10786,10787,10790],{"id":10785},"what-would-you-recommend-using-a-file-download-bot-for","What would you recommend using a ",[39,10788,10789],{"href":5157},"file download"," bot for?",[11,10792,10793],{},"Customizing bots to fit your specific use case is easy with our platform. If you are manually downloading files from websites in the Chrome browser, then these tasks can be automated. To give an example, you can build bots to assist you with downloading report files, CSV files or image files, making migrating sites or carrying out research a breeze.",[129,10795,10797],{"id":10796},"lets-learn-how-to-build-a-file-download-bot-with-axiomai","Let’s learn how to build a file download bot with axiom.ai",[11,10799,10800],{},"Use axiom.ai’s simple point-and-click interface to create as many file download bots as you want. By following the steps below, you'll have a working bot in no time.",[11,10802,10071,10803,10075],{},[39,10804,10074],{"href":5157},[129,10806,10807],{"id":7364},"1. Add your first step: ‘Go to page’",[175,10809],{"alt":9008,"src":9009},[11,10811,7654,10812,7658],{},[49,10813,7693],{},[175,10815],{"alt":9104,"src":7706},[11,10817,10114,10818,10820],{},[49,10819,10171],{},", paste the URL for the web page you would like to download files from. This step will open up the web page.",[129,10822,10824],{"id":10823},"_2-add-the-download-file-step","2. Add the ‘Download File’ step",[11,10826,7654,10827,10833],{},[49,10828,10829],{},[39,10830,10832],{"href":10831},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-step","‘Download File’"," and click on it to add the step to Axiom.",[175,10835],{"alt":9104,"src":10836},"\u002Fblog\u002Fdownload-file-step.jpg",[11,10838,10839,10840,10846],{},"Note: If you want to download multiple files at once, add the ",[49,10841,10842],{},[39,10843,10845],{"href":10844},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files","‘Download Files’"," step, instead.",[11,10848,10849],{},"Here you can select the file you want to download, and choose the location you would like it to download to.",[129,10851,10853],{"id":10852},"_3-ready-to-test","3. Ready to test",[11,10855,10318],{},[175,10857],{"alt":10858,"src":10859},"axiom.ai deisgn pattern donwload file","\u002Fblog\u002Fdownload-file-d-pattern.jpg",[11,10861,10862],{},"Now you’re ready to test it, by clicking ‘Run’.",[129,10864,10866],{"id":10865},"_4-running-the-bot","4. Running the bot",[11,10868,10869],{},"You can run this bot on the desktop app. If you want to download files in the cloud you will need to use the Google Drive download step.",[11,10871,10345,10872],{},[39,10873,10349],{"href":10348},[63,10875,10686],{"id":10685},[63,10877,10879],{"id":10878},"troubleshooting-the-file-download-axiom","Troubleshooting the file download axiom",[648,10881,10882,10885],{},[190,10883,10884],{},"Files open in a browser window - Try setting the Force download option in the step.",[190,10886,10887],{},"Files not downloading - Check the folder write permissions on your computer.",[11,10889,9205,10890],{},[39,10891,9208],{"href":521},[63,10893,10895],{"id":10894},"alternative-file-download-steps","Alternative file download steps",[187,10897,10898,10904,10910],{},[190,10899,10900,10903],{},[39,10901,10902],{"href":10844},"Download files"," - Axiom desktop only",[190,10905,10906,10903],{},[39,10907,10909],{"href":10908},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-from-url","Download files from a URL directly",[190,10911,10912,10916],{},[39,10913,10915],{"href":10914},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files-to-google-drive","Download files to a Google Drive"," - Cloud or Desktop",[63,10918,526],{"id":525},[11,10920,10921,10922,10925],{},"Congratulations, you've learned how to make and use a ",[39,10923,10924],{"href":7286},"file downloading"," bot. With this newly acquired skill, you know how to download single or multiple files and set the download location. The sky's the limit with your new super powers.",[63,10927,9966],{"id":9965},[11,10929,10930,10931,10713,10933,10385,10935],{},"If you're excited, here are some ideas for other bots: extract data from your email app such as ",[39,10932,10381],{"href":10380},[39,10934,2696],{"href":172},[39,10936,10349],{"href":9692},{"title":15,"searchDepth":16,"depth":16,"links":10938},[10939,10940,10948,10949,10950,10951,10952],{"id":10775,"depth":542,"text":10776},{"id":10785,"depth":542,"text":10941,"children":10942},"What would you recommend using a file download bot for?",[10943,10944,10945,10946,10947],{"id":10796,"depth":16,"text":10797},{"id":7364,"depth":16,"text":10807},{"id":10823,"depth":16,"text":10824},{"id":10852,"depth":16,"text":10853},{"id":10865,"depth":16,"text":10866},{"id":10685,"depth":542,"text":10686},{"id":10878,"depth":542,"text":10879},{"id":10894,"depth":542,"text":10895},{"id":525,"depth":542,"text":526},{"id":9965,"depth":542,"text":9966},"If your job or business requires you to spend lots of time downloading files from websites, you might want to consider automating this process with axiom.ai’s no-code bots.",{"read":10955,"type":578,"tool":10956,"category":10957,"tags":10958,"featuredimg":10959,"landingimg":10960,"summary":10418},"8 min read",[580],[7561],[7564,10789],"\u002Fblog\u002Fautomate-downloads-longv2.jpg","\u002Fblog\u002Fautomate-downloads.jpg","\u002Fblog\u002Fhow-to-automate-downloadin-a-file-from-a-website",{"title":10754,"description":10953},"blog\u002Fhow-to-automate-downloadin-a-file-from-a-website","_8McSf1zStdrCjXhcGiY0W1Fq6lb49IkvcgP_SfWmZ4",{"id":10966,"title":10967,"author":23,"body":10968,"date":10739,"description":10972,"draft":575,"extension":19,"meta":11242,"navigation":24,"path":11251,"seo":11252,"stem":11253,"__hash__":11254},"blog\u002Fblog\u002Fhow-to-automate-reporting.md","How to automate reporting",{"type":8,"value":10969,"toc":11219},[10970,10973,10976,10980,10983,10987,10990,10994,10997,11001,11007,11011,11018,11021,11023,11025,11027,11031,11034,11038,11043,11047,11050,11068,11070,11073,11077,11094,11107,11113,11122,11125,11128,11133,11139,11143,11150,11154,11164,11167,11171,11173,11178,11182,11186,11190,11201,11205,11207,11209,11211],[11,10971,10972],{},"Do you spend a lot of time logging into multiple web apps to generate and download reports? If so, read on. We’ll teach you how to make a bot to automate that process, and distribute your reports, saving you valuable time.",[60,10974],{"alt":10975},"Autyomate reporting in the browser with axiom.ai",[63,10977,10979],{"id":10978},"what-exactly-is-a-reporting-bot","What exactly is a reporting bot?",[11,10981,10982],{},"It’s like having your own digital assistant. axiom.ai’s 🤖 bots are highly customizable, and you can use them to automate almost anything in the browser. The beauty of learning to create bots is that they can be tailored to your specific requirements by mimicking your actions. Who wouldn't want an army of personalized digital assistants at their disposal?",[63,10984,10986],{"id":10985},"why-would-you-want-to-automate-downloading-reports-with-bots","Why would you want to automate downloading reports with bots?",[11,10988,10989],{},"The reason for automating repetitive browser tasks such as reporting is simple: it saves you time and money. Instead of spending the time on repetitive, manual tasks yourself, or employing someone to do so, they’re taken care of by easy to build, no-code bots. Our first ever customer used Axiom to automate Amazon reporting, and it truly revolutionized their workflow.",[63,10991,10993],{"id":10992},"what-use-cases-would-you-recommend-using-a-reporting-bot-for","What use cases would you recommend using a reporting bot for?",[11,10995,10996],{},"Customizing bots to fit your specific use case is easy with our platform. If you're an agency, you can create bots that log into multiple accounts and download reports from each, across numerous platforms. In e-commerce, we have customers who build bots to download reports from platforms like Amazon. You can either run bots on demand or schedule them according to your preference.",[63,10998,11000],{"id":10999},"how-does-a-reporting-bot-work","How does a reporting bot work?",[11,11002,11003,11004,11006],{},"Reporting bots run in your Chrome browser, and are set up to mimic your actions, from logging into web apps, to entering date ranges and then clicking to generate reports. Finally, the bot can ",[39,11005,7564],{"href":5157}," reports and if you want it to go the extra mile, it can distribute them to team members via email.",[63,11008,11010],{"id":11009},"lets-learn-how-to-build-a-reporting-bot-with-axiomai","Let’s learn how to build a reporting bot with axiom.ai",[11,11012,11013,11014,11017],{},"With axiom.ai's no-code bot builder, you can create bots for reporting without having to code. Use our simple point-and-click interface to create as many reporting bots as you want. If you follow the steps below, you'll have a working bot ",[39,11015,11016],{"href":5157},"downloading"," reports by the time you get to the end of this article.",[11,11019,11020],{},"👇🧑‍🎓",[129,11022,10486],{"id":10485},[11,11024,9005],{},[175,11026],{"alt":9008,"src":9009},[129,11028,11030],{"id":11029},"_2-add-your-first-step-go-to-page","2. Add your first step ‘Go to page’",[11,11032,11033],{},"Use the Step Finder to search for ‘Go to page’ and click on it. The step will be added to Axiom for you to configure.",[175,11035],{"alt":11036,"src":11037},"axiom.ai add the 'go to page'# step","\u002Fblog\u002Fgo-to-page-generic.jpg",[11,11039,10125,11040,11042],{},[49,11041,10171],{}," field, cut and paste the URL for the site you want to download the report from.",[129,11044,11046],{"id":11045},"_2-add-steps-to-generate-your-report","2. Add steps to generate your report",[11,11048,11049],{},"Next, you will need to add a combination of steps to automate generating the report in your chosen system.",[11,11051,11052,11053,1140,11057,767,11061,11067],{},"The main steps you will find useful are the ",[49,11054,11055],{},[39,11056,10328],{"href":9805},[49,11058,11059],{},[39,11060,6011],{"href":9812},[49,11062,11063,11066],{},[39,11064,11065],{"href":8631},"‘Get date and time’","’"," steps.",[175,11069],{"alt":10584,"src":10585},[11,11071,11072],{},"Add the steps you need to replicate your interactions with the browser. For example, if you need to enter a date to set the data range you may require the following steps:",[175,11074],{"alt":11075,"src":11076},"axiom.ai add the steps required to download report","\u002Fblog\u002Fsteps-report.jpg",[129,11078,11080,11081,11086,11087,11093],{"id":11079},"_3-next-add-the-download-file-step-or-the-get-data-from-bots-current-page-step","3. Next add the ",[49,11082,11083],{},[39,11084,11085],{"href":10831},"‘Download file’"," step or the ",[49,11088,11089],{},[39,11090,11092],{"href":11091},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-data-from-website","‘Get data from bot's current page’"," step",[11,11095,11096,11097,11099,11100,11106],{},"If you want to download a report file, add a ",[49,11098,11085],{}," step (alternatively, you can use the ",[49,11101,11102,11103,11066],{},"‘Download to ",[39,11104,11105],{"href":10914},"Google Drive"," step).",[11,11108,11109,11110,8276],{},"If you want to scrape the report data, add a ",[49,11111,11112],{},"‘Get data’",[129,11114,11116,11117],{"id":11115},"how-to-configure-download-file","How to configure ",[49,11118,11119,11066],{},[39,11120,11121],{"href":5157},"‘Download file",[11,11123,11124],{},"First select the file to download, then the folder to download too. You can set your own file name by adding it into the input field.",[175,11126],{"alt":11127,"src":10836},"axiom.ai download file step",[129,11129,11116,11131,11093],{"id":11130},"how-to-configure-get-data-from-bots-current-page-step",[49,11132,11092],{},[11,11134,11135,11136,11138],{},"Click ",[49,11137,10187],{}," to tell the bot what data to scrape, and select it using our point and click selector tool.",[175,11140],{"alt":11141,"src":11142},"axiom.ai get data off current page step","\u002Fblog\u002Fget-data-current-page.jpg",[11,11144,11145,11146,11149],{},"Set the ",[49,11147,11148],{},"‘Max results’"," setting to the number of rows you would like to scrape.",[129,11151,11153],{"id":11152},"_4-send-email-optional","4. Send email (optional)",[11,11155,11156,11157,11160,11161,11163],{},"If you’d like to email your scraped data to team members, add the ",[49,11158,11159],{},"‘Send email’"," step, then insert email addresses in the address field. Add your subject, then, click ",[49,11162,7701],{}," to include your scraped data in the email body.",[175,11165],{"alt":11141,"src":11166},"\u002Fblog\u002Fsend-an-email.jpg",[129,11168,11170],{"id":11169},"_5-ready-to-test","5. Ready to test",[11,11172,10318],{},[11,11174,11175,11176,13],{},"Now you’re ready to test with the desktop app, by clicking ",[49,11177,10657],{},[129,11179,11181],{"id":11180},"_6-running-the-bot","6. Running the bot",[11,11183,10675,11184],{},[39,11185,10678],{"href":5184},[63,11187,11189],{"id":11188},"issues-you-might-encounter-with-your-reporting-bot","Issues you might encounter with your reporting bot",[187,11191,11192,11195,11198],{},[190,11193,11194],{},"Report taking too long to generate on the webpage? You may need to add a wait step to let the report generate before the scrape or download.",[190,11196,11197],{},"File not downloading? Check that your selected folder has the correct write permissions.",[190,11199,11200],{},"Bot working on the desktop but not the cloud? You may need to add login steps. See here.",[11,11202,9205,11203],{},[39,11204,9208],{"href":521},[63,11206,526],{"id":525},[11,11208,10372],{},[63,11210,9966],{"id":9965},[11,11212,10377,11213,10713,11215,10385,11217],{},[39,11214,10381],{"href":10380},[39,11216,2696],{"href":172},[39,11218,10349],{"href":9692},{"title":15,"searchDepth":16,"depth":16,"links":11220},[11221,11222,11223,11224,11225,11239,11240,11241],{"id":10978,"depth":542,"text":10979},{"id":10985,"depth":542,"text":10986},{"id":10992,"depth":542,"text":10993},{"id":10999,"depth":542,"text":11000},{"id":11009,"depth":542,"text":11010,"children":11226},[11227,11228,11229,11230,11232,11234,11236,11237,11238],{"id":10485,"depth":16,"text":10486},{"id":11029,"depth":16,"text":11030},{"id":11045,"depth":16,"text":11046},{"id":11079,"depth":16,"text":11231},"3. Next add the ‘Download file’ step or the ‘Get data from bot's current page’ step",{"id":11115,"depth":16,"text":11233},"How to configure ‘Download file’",{"id":11130,"depth":16,"text":11235},"How to configure ‘Get data from bot's current page’ step",{"id":11152,"depth":16,"text":11153},{"id":11169,"depth":16,"text":11170},{"id":11180,"depth":16,"text":11181},{"id":11188,"depth":542,"text":11189},{"id":525,"depth":542,"text":526},{"id":9965,"depth":542,"text":9966},{"read":11243,"type":578,"tool":11244,"category":11245,"tags":11247,"featuredimg":11249,"landingimg":11250,"summary":10418},"11 min read",[580],[11246],"Website monitoring",[10745,7564,9638,11248],"reporting","\u002Fblog\u002Fautomate-reporting-long.jpg","\u002Fblog\u002Fautomate-reporting.jpg","\u002Fblog\u002Fhow-to-automate-reporting",{"title":10967,"description":10972},"blog\u002Fhow-to-automate-reporting","Uzwnd4BaM_NDSlWNmWVOBZOzuCXxqszSwy-WP8GPsr0",{"id":11256,"title":11257,"author":23,"body":11258,"date":11523,"description":11524,"draft":575,"extension":19,"meta":11525,"navigation":24,"path":11534,"seo":11535,"stem":11536,"__hash__":11537},"blog\u002Fblog\u002Fcreate-a-bot-to-automate-tasks.md","How to create a bot to automate tasks for you",{"type":8,"value":11259,"toc":11501},[11260,11263,11266,11274],[11,11261,11262],{},"If you want to automate tasks performed in the browser, you should consider creating a bot. You will be surprised how useful this can be - who wouldn't want an army of AI digital assistants to help handle their workload?",[60,11264],{"alt":11265},"Create bots to automate tasks in the browser",[11,11267,11268,11269,11273],{},"In this guide, we will teach you the basics of creating your own 🤖 bot in just minutes, using ",[39,11270,11272],{"href":11271},"\u002Fdocs","Axiom’s"," no-code bot building tool.",[9660,11275,11276,11278,11281,11283,11285,11287,11290,11292,11296,11298,11301,11304,11307,11309,11312,11314,11316,11318,11320,11335,11340,11342,11344,11346,11348,11350,11359,11363,11365,11367,11371,11374,11377,11380,11384,11386,11389,11392,11394,11398,11403,11407,11410,11414,11417,11420,11424,11429,11433,11435,11438,11440,11443,11445,11450,11452,11454,11458,11460,11467,11469,11471,11477,11483,11486,11492,11494],{},[63,11277,6089],{"id":6088},[11,11279,11280],{},"Well, bots can take some of those repetitive, manual browser tasks off your hands, freeing up valuable time for other, more enjoyable things. Besides, watching the bots do your work is pretty amazing! What’s more, you’ll acquire useful 👩‍🎓 automation skills.",[63,11282,6096],{"id":6095},[11,11284,6099],{},[63,11286,6103],{"id":6102},[11,11288,11289],{},"Simply put, bots mimic human behavior in Chrome. They click buttons and enter data into forms, except they don't get bored, fed up, or frustrated.",[63,11291,6110],{"id":6109},[11,11293,6113,11294,6117],{},[39,11295,4988],{"href":11271},[63,11297,6121],{"id":6120},[11,11299,11300],{},"Learning how to automate your browser is becoming an increasingly valuable skill . As more and more work moves to the browser, being able to automate it will be an invaluable addition to anyone's CV.",[11,11302,11303],{},"Learning to automate, instead of being automated, will empower you for the future. Of course it involves a learning curve: you'll have to get to grips with some of the key concepts of automation, from structuring it, to setting up loops and thinking like a programmer.",[11,11305,11306],{},"👨🏾‍🎓 Once you master it, you won’t look back.",[63,11308,6131],{"id":6130},[11,11310,11311],{},"It's always useful to plan before you get started. 💡 A plan helps reduce frustration and speeds up the process.",[11,11313,6137],{},[11,11315,6140],{},[11,11317,6143],{},[63,11319,6147],{"id":6146},[11,11321,11322,11323,11325,11326,1140,11329,11331,11332,11334],{},"We offer a variety of  ",[39,11324,5059],{"href":9692},". to assist you with ",[39,11327,11328],{"href":6598},"scraping",[39,11330,1976],{"href":6411},", and ",[39,11333,8152],{"href":172}," management on platforms like Instagram. You can find all of our templates on our website. However, we believe it's important to teach you how to start from scratch.",[11,11336,6153,11337,13],{},[39,11338,4988],{"href":140,"rel":11339},[43],[11,11341,6159],{},[175,11343],{"alt":7339,"src":7340},[11,11345,6162],{},[63,11347,6166],{"id":6165},[11,11349,6169],{},[187,11351,11352,11354,11356],{},[190,11353,6174],{},[190,11355,6177],{},[190,11357,11358],{},"If you want to enter data into a form, start with the ‘Interact’ step or, in the new version of Axiom, the ‘Go to’ page",[175,11360],{"alt":11361,"src":11362},"axiom.ai selecting step to build your bot","\u002Fblog\u002Faxiom-step-finder.png",[63,11364,6188],{"id":6187},[11,11366,6191],{},[175,11368],{"alt":11369,"src":11370},"axiom.ai combine steps to make your bot","\u002Fblog\u002Faxiom-combine-steps.jpg",[11,11372,11373],{},"By replicating each step of your task, you can create a sequence of actions for your bot to execute.",[11,11375,11376],{},"Have a browse through the  different steps in our step finder.",[11,11378,11379],{},"Here's a neat trick on how to add multiple steps of the same type. By adding '*8' after the step name I can add 8 steps instead of one.",[175,11381],{"alt":11382,"src":11383},"axiom.ai adding multiple steps","\u002Fblog\u002Faxiom-multi-step.jpg",[63,11385,6205],{"id":6204},[11,11387,11388],{},"If you're not sure where to begin 🤷‍♀️, try using one of these beginner bot design patterns, and replicate it with the step finder to create a basic bot. 💪🏽",[129,11390,11391],{"id":6208},"A simple web scraper bot 🤖",[11,11393,6212],{},[175,11395],{"alt":11396,"src":11397},"axiom.ai design pattern for scraping bot","\u002Fblog\u002Fscraper-design-pattern.jpg",[11,11399,11400],{},[39,11401,11402],{"href":6598},"Try this web scraping template",[129,11404,11406],{"id":11405},"web-actions-bot","Web actions bot 🤖",[11,11408,11409],{},"Here we show a simple bot automating some web actions.",[175,11411],{"alt":11412,"src":11413},"axiom.ai design pattern for website actions","\u002Fblog\u002Fweb-actions-design-pattern.jpg",[129,11415,11416],{"id":6230},"Data entry bot 🤖",[11,11418,11419],{},"Here we read data from a sheet a sheet and enter it into a form.",[175,11421],{"alt":11422,"src":11423},"axiom.ai design pattern for data entry bot","\u002Fblog\u002Faxiom-data-entry-design-pattern.jpg",[11,11425,11426],{},[39,11427,11428],{"href":6411},"Try this data entry template",[63,11430,11432],{"id":11431},"how-to-loop-your-bots-️","How to loop your bots ♻️",[175,11434],{"alt":7676,"src":7677},[11,11436,11437],{},"There are loop steps and jump steps. These can be added from the start, or later. The loop step will loop through data from a source like a Google Sheet; the jump step loops for the number of times you set it to. Make sure to add the steps you want to repeat inside the loop.",[63,11439,6253],{"id":6252},[11,11441,11442],{},"Steps that read or output some form of data like the ‘Get data’ step, make their data available to other steps in the form of tokens. See this example of a Google Sheet token passing a URL into a go to page step.",[175,11444],{"alt":9104,"src":7706},[11,11446,11447],{},[39,11448,11449],{"href":5084},"Read more about passing data here",[63,11451,6264],{"id":6263},[11,11453,6267],{},[175,11455],{"alt":11456,"src":11457},"axiom.ai moving steps","\u002Fblog\u002Faxiom-move.jpg",[63,11459,6275],{"id":6274},[11,11461,11462,11463,11466],{},"We highly recommend testing your build by running your bot on the desktop app. ",[49,11464,11465],{},"Failed or stopped runs"," won't count towards the runtime limit, so you can test as much as you want.",[11,11468,6281],{},[63,11470,6285],{"id":6284},[11,11472,11473,11474,13],{},"Once you’re ready to run the bot 🥳, you can run it on your desktop, in the cloud or on a VPS. If you’re on a paid tier, you can also ",[39,11475,11476],{"href":9177},"schedule your bots.",[11,11478,11479,11480],{},"Please note that if you build a bot on the desktop app when logged in, your session will be shared. However if you run the bot in the cloud, the session will not be shared. Learn how to work around ",[39,11481,11482],{"href":10348},"this here.",[11,11484,11485],{},"The screenshots in this guide are from Axiom v4. If you're using v3, your experience may differ but the methods remain true. However, the interact step is being phased out in favor of the loop step.",[11,11487,11488,11489],{},"Would you like to test the latest version before it is officially released? ",[39,11490,11491],{"href":521},"Contact support.",[63,11493,6295],{"id":6294},[11,11495,11496,11497,11500],{},"If you get stuck or need help with building more complex bots 💁🏻\n, please don't hesitate to contact us\n",[39,11498,11499],{"href":521},"via this link",". Be sure to share with us your Axiom bot and as much supporting information as possible.",{"title":15,"searchDepth":16,"depth":16,"links":11502},[11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11517,11518,11519,11520,11521,11522],{"id":6088,"depth":542,"text":6089},{"id":6095,"depth":542,"text":6096},{"id":6102,"depth":542,"text":6103},{"id":6109,"depth":542,"text":6110},{"id":6120,"depth":542,"text":6121},{"id":6130,"depth":542,"text":6131},{"id":6146,"depth":542,"text":6147},{"id":6165,"depth":542,"text":6166},{"id":6187,"depth":542,"text":6188},{"id":6204,"depth":542,"text":6205,"children":11513},[11514,11515,11516],{"id":6208,"depth":16,"text":11391},{"id":11405,"depth":16,"text":11406},{"id":6230,"depth":16,"text":11416},{"id":11431,"depth":542,"text":11432},{"id":6252,"depth":542,"text":6253},{"id":6263,"depth":542,"text":6264},{"id":6274,"depth":542,"text":6275},{"id":6284,"depth":542,"text":6285},{"id":6294,"depth":542,"text":6295},"2023-10-25","Learn how to automation the browser",{"read":10412,"type":578,"tool":11526,"category":11527,"tags":11528,"location":587,"featuredimg":11531,"landingimg":11532,"summary":11533},[580],[5787],[10745,11529,11530],"automate","task","\u002Fblog\u002Fmake-a-bot-hero.jpg","\u002Fblog\u002Fmake-a-bot-landing.jpg","Learn how to automate the browser","\u002Fblog\u002Fcreate-a-bot-to-automate-tasks",{"title":11257,"description":11524},"blog\u002Fcreate-a-bot-to-automate-tasks","SVH1PQCUcNGzSdbOW1FpO6Hrz0wRm0HHte4fsAd1cJg",{"id":11539,"title":11540,"author":23,"body":11541,"date":11932,"description":11933,"draft":575,"extension":19,"meta":11934,"navigation":24,"path":8147,"seo":11945,"stem":11946,"__hash__":11947},"blog\u002Fblog\u002Fchatgpt-web-scraping.md","ChatGPT web scraping (with a bot)",{"type":8,"value":11542,"toc":11906},[11543,11546,11552,11556,11558,11561,11565,11568,11572,11575,11579,11582,11586,11589,11593,11601,11605,11613,11616,11620,11626,11628,11644,11646,11648,11652,11654,11656,11658,11663,11667,11671,11676,11680,11682,11684,11688,11692,11696,11709,11711,11715,11718,11738,11742,11747,11751,11754,11758,11761,11768,11772,11775,11777,11786,11793,11798,11805,11809,11811,11814,11817,11832,11835,11837,11842,11845,11849,11854,11858,11861,11865,11869,11887,11891,11893,11896,11900],[11,11544,11545],{},"Some people fear AI taking over 😱, while others use it to automate their jobs 🕺. How do you feel about it? If you're looking to gain skills to automate and build bots with powerful AI capabilities, you've come to the right place. We'll show you how to create a bot that utilizes ChatGPT AI to scrape data websites.",[11,11547,11548,11549],{},"If you want to dive straight in, why not start with the ",[39,11550,11551],{"href":6609},"ChatGPT web scraper template.",[63,11553,11555],{"id":11554},"why-would-you-want-to-scrape-websites-with-a-chatgpt-bot","Why would you want to scrape websites with a ChatGPT bot?",[60,11557],{},[11,11559,11560],{},"There are lots of good no-code web scrapers like axiom.ai and Octotparse. They are great at scraping content from websites if they are always in the same format. We call that structured data. But 💁🏼 sometimes you want to scrape data when it's unstructured, when it doesn’t appear in a consistent format or place and we need the help of an AI to find it.",[63,11562,11564],{"id":11563},"what-scraping-use-case-would-you-recommend-using-a-chatgpt-bot-for","What scraping use case would you recommend using a ChatGPT bot for?",[11,11566,11567],{},"The primary use case is if you want to scrape many different websites with a single bot, looking for a defined data set. The data would appear unstructured as each website is different, and this is where an 🧠 AI scraper bot would be a useful tool. It would allow you to scrape thousands of pages for phone numbers or emails, for example. Great for lead building.",[63,11569,11571],{"id":11570},"what-exactly-is-a-chatgpt-bot-web-scraper","What exactly is a ChatGPT bot web scraper?",[11,11573,11574],{},"🧠 ➕ 🤖 A ChatGPT web scraper bot combines browser automation technology and AI ChatGPT tech. It's like a robot, but for the browser.",[63,11576,11578],{"id":11577},"how-do-you-make-a-chatgpt-scraper","How do you make a ChatGPT scraper?",[11,11580,11581],{},"With axiom.ai's no-code bot builder 🛠️\n, you can create bots for web scraping without having to code. Use a simple point and click interface to create as many ChatGPT scraper bots as you want! If you follow the steps below, you'll have a working bot doing your web scraping in no time.",[63,11583,11585],{"id":11584},"how-does-a-chatgpt-scraper-work","How does a ChatGPT scraper work?",[11,11587,11588],{},"The scraper works by looping through a list of URLs from a Google Sheet, visiting each page, and extracting the data you need, using its AI capabilities. The bot then writes the data to another Google Sheet, leaving you free to sit back and enjoy a cup of coffee!",[63,11590,11592],{"id":11591},"do-i-need-my-own-chat-gpt-api-key","Do I need my own Chat GPT API key?",[11,11594,11595,11596],{},"You probably already have one, but they are simple to get hold of if you don't. Just follow 🔐 OpenAI's ",[39,11597,11600],{"href":11598,"rel":11599},"https:\u002F\u002Fhelp.openai.com\u002Fen\u002Farticles\u002F4936850-where-do-i-find-my-secret-api-key",[43],"instructions.",[63,11602,11604],{"id":11603},"is-it-legal-to-scrape-websites","Is it legal to scrape websites?",[11,11606,11607,11608],{},"The short answer is that there’s no law or rule banning web scraping, but that doesn’t mean that you can scrape everything. Web scraping is completely legal if you scrape data that is ",[39,11609,11612],{"href":11610,"rel":11611},"https:\u002F\u002Ftechcrunch.com\u002F2022\u002F04\u002F18\u002Fweb-scraping-legal-court\u002F?guccounter=1&guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&guce_referrer_sig=AQAAADgvjX28dWcoHnZCde5w5z5Ydj20MqZBJXizUmRjltRwM1LuhC73c5vSaZlpyubbXN4lsa2yzkv_uBxVLOlG_K_CXMcwpqjq9KGiWHi8KSF4L2kkj_BTvIEB7r5tnIwBzHrQ4Q4lndd19PKJlc67fc0aqY74krc41nUYPZP3J-WL",[43],"publicly available online.",[11,11614,11615],{},"Certain types of data however are protected by international regulations, so be mindful of what you can and can’t scrape when it comes to personal data, intellectual property, or confidential data.",[63,11617,11619],{"id":11618},"lets-learn-how-to-build-a-chatgpt-scraper-bot-with-axiomai","Let’s learn how to build a ChatGPT scraper bot with axiom.ai",[11,11621,11622,11623,11625],{},"If you want to short cut the process why not try the ",[39,11624,5109],{"href":6609}," or read on to learn more!",[129,11627,9325],{"id":9324},[11,11629,11630,11631,10084,11633,11636,11637,11640,11641,13],{},"🏁 Create a new Google Sheet. You can do this in your Chrome browser by entering ",[49,11632,10083],{},[49,11634,11635],{},"'Websites to scrape’",". Add two tabs; one named ",[49,11638,11639],{},"‘URLs’"," and another named ",[49,11642,11643],{},"‘Data’",[129,11645,9737],{"id":9736},[175,11647],{"alt":7339,"src":7340},[11,11649,10095,11650,10099],{},[49,11651,10098],{},[129,11653,9747],{"id":9746},[11,11655,9341],{},[175,11657],{"alt":7669,"src":7670},[11,11659,10114,11660,11662],{},[49,11661,10117],{},", you can search for the Google Sheet you created by name. Once found, click on it to select.",[11,11664,5224,11665,10305],{},[49,11666,10304],{},[11,11668,10125,11669,10129],{},[49,11670,10128],{},[11,11672,10125,11673,11675],{},[49,11674,10134],{}," field, click the toggle switch and enter 'A10'. You have limited the bot to read ten rows. This is fine for now, you can increase the amount later once you’ve tested it.",[11,11677,9766,11678,13],{},[39,11679,9770],{"href":9769},[129,11681,9383],{"id":9382},[175,11683],{"alt":7676,"src":7677},[11,11685,7680,11686,7684],{},[49,11687,7683],{},[175,11689],{"alt":11690,"src":11691},"axiom.ai configure loop step","\u002Fblog\u002Faxiom-step-loop.jpg",[129,11693,11695],{"id":11694},"_5-add-the-go-to-url-step-inside-the-loop","5. Add the ‘Go to url’ step inside the loop",[11,11697,11698,11699,11701,11702,11705,11706,11708],{},"Add the ",[49,11700,228],{}," step, in the ",[49,11703,11704],{},"'URL’"," field, select ",[49,11707,7701],{}," and select the data from your Google Sheet, so that the bot knows which data to loop through.",[175,11710],{"alt":9104,"src":7706},[129,11712,11714],{"id":11713},"_6-add-the-get-data-from-bots-current-page-step","6. Add the ‘Get data from bot's current page’ step",[175,11716],{"alt":7718,"src":11717},"\u002Fblog\u002Faxiom-get-data-current-page.jpg",[11,11719,11720,11721,11724,11725,11727,11728,11730,11731,11734,11735,13],{},"Because we want to scrape many different webpages, we need to use a custom selector to scrape a common element found on every page. This common element will be ",[49,11722,11723],{},"‘body’",". Select it by clicking ",[49,11726,10187],{}," and in column A, selecting ‘Custom selector’ and typing in the word ",[49,11729,11723],{},". Then click on ",[49,11732,11733],{},"‘Confirm selector’"," and then ",[49,11736,11737],{},"‘Complete’",[175,11739],{"alt":11740,"src":11741},"axiom.ai adding a custom selector","\u002Fblog\u002Fcustom-selector-choice-body.jpg",[11,11743,11145,11744,11746],{},[49,11745,11148],{}," setting to ‘1’.",[129,11748,11750],{"id":11749},"_7-add-the-extract-data-with-chatgpt-step","7. Add the ‘Extract data with ChatGPT’ step",[11,11752,11753],{},"You will need to enter your API key for this step to work, so make sure you have it to hand.",[175,11755],{"alt":11756,"src":11757},"axiom.ai adding the ChatGPT step","\u002Fblog\u002Faxiom-chatgpt-data-extract.jpg",[11,11759,11760],{},"Then, in the Data field, set it to ‘Scrape data’.",[11,11762,11763,11764,11767],{},"Next, in the ",[49,11765,11766],{},"‘Extract values’"," field, tell the AI what data you want to extract, by entering a comma-separated list of items, for example email, address, dates, URL etc. You may want to experiment a little here.",[129,11769,11771],{"id":11770},"_8-write-data-to-a-google-sheet","8. Write data to a Google Sheet",[11,11773,11774],{},"Now we’re going to write the data that ChatGPT AI extracted, to a Google Sheet.",[175,11776],{"alt":9131,"src":9132},[11,11778,11135,11779,11782,11783,11785],{},[49,11780,11781],{},"'Add a new step'",". In the ",[49,11784,10117],{}," field, search for the sheet you created at the beginning of this tutorial.",[11,11787,10125,11788,11705,11790,13],{},[49,11789,10304],{},[49,11791,11792],{},"'Data'",[11,11794,9914,11795,8833],{},[236,11796,11797],{},"chat-gpt",[11,11799,11800,11801,11804],{},"Finally, in the ‘Write options’ field, click the ",[49,11802,11803],{},"‘Add to existing Data’"," option.",[129,11806,11808],{"id":11807},"_9-within-the-loop-step-add-delete-rows-from-a-google-sheet-step","9. Within the loop step, add ‘Delete rows from a Google Sheet’ step",[175,11810],{"alt":9522,"src":9523},[11,11812,11813],{},"Add the step 'Delete rows from a Google Sheet' to delete the URL just scraped. This is to prevent the same row from being scraped repeatedly. Using the Step Finder, search for and select ‘Delete rows from a Google Sheet’.",[11,11815,11816],{},"In 'Spreadsheet URL' click to add the spreadsheet.",[11,11818,11819,11820,11823,11824,11827,11828,11831],{},"Then, in  ",[49,11821,11822],{},"‘First row to delete'"," enter the number 1 and repeat this in ",[49,11825,11826],{},"'Last row to delete'",", so that both are set to ",[49,11829,11830],{},"'1'",". We only want to delete one row per loop.",[11,11833,11834],{},"Set the ‘Sheet name’ to the original spreadsheet set up.",[129,11836,9923],{"id":9922},[11,11838,11839,11840,13],{},"👩‍🔬 Now you’re ready to test with the desktop app, by clicking ",[49,11841,10657],{},[11,11843,11844],{},"When you’re done testing and you want to increase the size of your loop, edit the ‘Last cell’ field mentioned in step 3, and run again.",[129,11846,11848],{"id":11847},"_11-running-the-bot","11. Running the bot",[11,11850,11851,11852,13],{},"🚀🚀🚀🚀🚀 You can run this bot in the cloud and the desktop app. If you want to learn more about scheduling, ",[39,11853,9178],{"href":5090},[63,11855,11857],{"id":11856},"design-pattern-for-your-bot","Design pattern for your bot",[11,11859,11860],{},"Your assembled ChatGPT bot should resemble this image.",[175,11862],{"alt":11863,"src":11864},"axiom.ai design pattern for a ChatGPT web scraper","\u002Fblog\u002Faxiom-chat-gpt-scraper-d-pattern.jpg",[63,11866,11868],{"id":11867},"issues-you-may-encounter-with-your-chatgpt-web-scraper","Issues you may encounter with your ChatGPT web scraper",[187,11870,11871,11881,11884],{},[190,11872,11873,11874,11877,11878,2139],{},"The bot only scrapes 10 rows, In the ",[49,11875,11876],{},"'Read data from a Google Sheet'"," change the ",[49,11879,11880],{},"'last cell'",[190,11882,11883],{},"ChatGPT returns no data, try adjusting your extract values",[190,11885,11886],{},"No data or incorrect data being written to Google Sheets. Check the ChatGPT data has been inserted into the 'Write data to a Google Sheet' step",[11,11888,9205,11889],{},[39,11890,9208],{"href":521},[63,11892,526],{"id":525},[11,11894,11895],{},"Congratulations 🥳👨‍🎓🥳, you've learned how to make and use a ChatGPT AI bot to extract data. With this newly acquired skill, you know how to scrape data, loop through actions, and extract data to a Google Sheet. The sky's the limit with your new AI super powers. 🦸",[63,11897,11899],{"id":11898},"what-else-can-i-automate-with-chatgpt-and-axiom","What else can I automate with ChatGPT and Axiom?",[11,11901,11902,11903],{},"If you're excited, here are some ideas for other bots: extract data from your email app (such as Gmail), generate content, and send direct messages on Instagram. We have steps to extract data with AI and to generate text with AI. Take a look at our ",[39,11904,11905],{"href":9692},"templates.",{"title":15,"searchDepth":16,"depth":16,"links":11907},[11908,11909,11910,11911,11912,11913,11914,11915,11928,11929,11930,11931],{"id":11554,"depth":542,"text":11555},{"id":11563,"depth":542,"text":11564},{"id":11570,"depth":542,"text":11571},{"id":11577,"depth":542,"text":11578},{"id":11584,"depth":542,"text":11585},{"id":11591,"depth":542,"text":11592},{"id":11603,"depth":542,"text":11604},{"id":11618,"depth":542,"text":11619,"children":11916},[11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927],{"id":9324,"depth":16,"text":9325},{"id":9736,"depth":16,"text":9737},{"id":9746,"depth":16,"text":9747},{"id":9382,"depth":16,"text":9383},{"id":11694,"depth":16,"text":11695},{"id":11713,"depth":16,"text":11714},{"id":11749,"depth":16,"text":11750},{"id":11770,"depth":16,"text":11771},{"id":11807,"depth":16,"text":11808},{"id":9922,"depth":16,"text":9923},{"id":11847,"depth":16,"text":11848},{"id":11856,"depth":542,"text":11857},{"id":11867,"depth":542,"text":11868},{"id":525,"depth":542,"text":526},{"id":11898,"depth":542,"text":11899},"2023-10-24","Learn how to create a bot that utilizes AI to scrape websites.",{"read":10741,"type":578,"tool":11935,"category":11936,"tags":11937,"location":587,"featuredimg":11942,"landingimg":11943,"video":11944,"summary":11933},[580],[4752],[7903,11938,11939,11940,11941],"chatGPT","LLM","structured data","unstructured data","\u002Fblog\u002Fchatcpt-scraper-hero.jpg","\u002Fblog\u002Fchatcpt-scraper.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8Llq6EYiSuo?rel=0",{"title":11540,"description":11933},"blog\u002Fchatgpt-web-scraping","y8p426fL2QwXRVsiyat7fPFWSARTndnHwdz5M9PRkao",{"id":11949,"title":11950,"author":23,"body":11951,"date":11932,"description":11955,"draft":575,"extension":19,"meta":12281,"navigation":24,"path":10380,"seo":12288,"stem":12289,"__hash__":12290},"blog\u002Fblog\u002Fhow-to-scrape-emails.md","How to scrape emails from a website (with chatGpt)",{"type":8,"value":11952,"toc":12255},[11953,11956,11959,11962,11967,11971,11974,11978,11981,11985,11988,11992,11995,11999,12002,12006,12009,12011,12015,12022,12026,12033,12035,12040,12042,12046,12048,12050,12052,12056,12060,12064,12070,12074,12079,12084,12087,12089,12097,12099,12101,12103,12115,12119,12121,12123,12125,12127,12131,12133,12135,12137,12147,12153,12161,12163,12165,12174,12176,12182,12185,12191,12193,12198,12200,12202,12206,12208,12210,12212,12216,12228,12232,12234,12237,12241,12248],[11,11954,11955],{},"✉️ Scraping emails from websites can be challenging since they may not be present or in consistent locations on webpages. If you're looking to gain skills to automate and build bots with powerful 🧠 ➕ 🤖 AI capabilities, you've come to the right place. We'll show you how to create a bot that utilizes AI to scrape emails from websites.",[60,11957],{"alt":11958},"How to scrape emails with ai",[11,11960,11961],{},"This guide is for the new version of Axiom v4 🧨, which is coming soon. Email support if you’d like to try it. This guide applies to both versions of Axiom. If using the Axiom v3 use the interact step instead of the loop.",[11,11963,11964,11965],{},"Looking for a ChatGPT web scraper try this ",[39,11966,11551],{"href":6609},[63,11968,11970],{"id":11969},"why-would-you-want-to-scrape-emails-from-websites","Why would you want to scrape emails from websites?",[11,11972,11973],{},"To install this Gmail template click 'Install template'. If you are a new user click 'Install Chrome extension' you will be need to create a Free axiom.ai account before you can edit the template.",[63,11975,11977],{"id":11976},"why-use-chatgpt","Why use ChatGPT?",[11,11979,11980],{},"No one webpage is the same, and this is especially true if you want to scrape thousands of websites for emails. Traditional scraper tools rely on CSS Selectors to locate specific content and so to scrape at scale, you’d need to set thousands of individual selectors or use complicated code. That's where AI comes in handy, capable of finding content regardless of structure. AI’s can go to any webpage and search for data such as email, dates, and URLs - you simply need to tell it what to look for.",[63,11982,11984],{"id":11983},"what-exactly-is-a-chatgpt-bot","What exactly is a ChatGPT bot?",[11,11986,11987],{},"A ChatGPT web scraper bot 🧠 ➕ 🤖 combines browser automation technology and AI ChatGPT tech. It's like a robot, but for the browser",[63,11989,11991],{"id":11990},"how-does-the-email-scraper-bot-work","How does the email scraper bot work?",[11,11993,11994],{},"The bot does the hard graft 🤖 🦾 - it's a digital version of you. This digital assistant works through a list of URLs from a Google Sheet, visits each page, and extracts the data you need using its AI capabilities. The bot then writes the scraped data (in this case email addresses) to another Google Sheet, leaving you with plenty of free time to sit back and enjoy a cup of coffee!",[63,11996,11998],{"id":11997},"do-i-need-my-own-chatgpt-api-key","Do I need my own ChatGPT API Key?",[11,12000,12001],{},"You probably already have one, but they are simple to get hold of if you don't. Just follow OpenAI's instructions.",[63,12003,12005],{"id":12004},"is-it-legal-to-scrape-thousands-of-websites-for-emails","Is it legal to scrape thousands of websites for emails?",[11,12007,12008],{},"The short answer is that there’s no law or rule banning web scraping, but that doesn’t mean that you can scrape everything. Web scraping is completely legal if you scrape data that is publicly available online.",[11,12010,11615],{},[63,12012,12014],{"id":12013},"how-do-you-make-an-email-scraper-bot","How do you make an email scraper bot?",[11,12016,12017,12018,12021],{},"With axiom.ai's no-code bot builder, you can create bots for web scraping without having to code. Use a simple point and click interface to create as many bots as you want! If you follow the steps below, you'll have a working bot using ChatGPT to extract ",[39,12019,12020],{"href":9644},"emails"," in no time.",[63,12023,12025],{"id":12024},"lets-learn-how-to-build-a-bot-to-scrape-emails","Let’s learn how to build a bot to scrape emails",[11,12027,12028,12029],{},"We also have a template you can ",[39,12030,12032],{"href":12031},"\u002Fguides\u002Fchatgpt-web-scraper.html","try.",[129,12034,9325],{"id":9324},[11,12036,10080,12037,12039],{},[49,12038,10083],{}," into the address bar. Don’t forget to name your sheet something like 'Websites to scrape’. Add two tabs; one named ‘URLs’ and another named ‘Data’.",[129,12041,9737],{"id":9736},[11,12043,10095,12044,10099],{},[49,12045,10098],{},[129,12047,9747],{"id":9746},[175,12049],{"alt":9337,"src":9338},[11,12051,9341],{},[11,12053,10114,12054,11662],{},[49,12055,10117],{},[11,12057,5224,12058,10305],{},[49,12059,10304],{},[11,12061,10125,12062,10129],{},[49,12063,10128],{},[11,12065,10125,12066,10524,12068,10528],{},[49,12067,10134],{},[49,12069,10527],{},[11,12071,9766,12072,13],{},[39,12073,9770],{"href":9769},[129,12075,12076,12077,11093],{"id":9382},"4. Add the ",[49,12078,7683],{},[11,12080,7680,12081,12083],{},[49,12082,7683],{}," into the Step Finder, and adding it. This step will allow your bot to loop through the rows of data stored in the Google Sheet.  Make sure to add the steps you want to repeat inside the loop.",[175,12085],{"alt":12086,"src":9081},"axiom.ai adding a  loop step",[129,12088,11695],{"id":11694},[11,12090,11698,12091,11701,12093,11705,12095,11708],{},[49,12092,228],{},[49,12094,11704],{},[49,12096,7701],{},[175,12098],{"alt":9104,"src":7706},[129,12100,11714],{"id":11713},[175,12102],{"alt":7718,"src":11717},[11,12104,11720,12105,11724,12107,11727,12109,11730,12111,11734,12113,13],{},[49,12106,11723],{},[49,12108,10187],{},[49,12110,11723],{},[49,12112,11733],{},[49,12114,11737],{},[11,12116,11145,12117,11746],{},[49,12118,11148],{},[129,12120,11750],{"id":11749},[11,12122,11753],{},[175,12124],{"alt":11756,"src":11757},[11,12126,11760],{},[11,12128,11763,12129,11767],{},[49,12130,11766],{},[129,12132,11771],{"id":11770},[11,12134,11774],{},[175,12136],{"alt":9131,"src":9132},[11,12138,11135,12139,12141,12142,11782,12145,11785],{},[49,12140,460],{}," in the loop and search for ",[49,12143,12144],{},"'Write data to a Google Sheet'",[49,12146,10117],{},[11,12148,10125,12149,11705,12151,13],{},[49,12150,10304],{},[49,12152,11792],{},[11,12154,10125,12155,11705,12157,13],{},[49,12156,11792],{},[49,12158,7780,12159,7780],{},[236,12160,11797],{},[11,12162,9150],{},[129,12164,11808],{"id":11807},[11,12166,12167,12168,12170,12171,13],{},"Add the step ",[49,12169,466],{}," to delete the URL just scraped. This is to prevent the same row from being scraped repeatedly. Using the Step Finder, search for and select ",[49,12172,12173],{},"‘Delete rows from a Google Sheet’",[175,12175],{"alt":9522,"src":9523},[11,12177,12178,12179,12181],{},"In ",[49,12180,10117],{}," click to add the spreadsheet.",[11,12183,12184],{},"Then, in 'First row to delete' enter the number 1 and repeat this in 'Last row to delete', so that both are set to 1. We only want to delete one row per loop.",[11,12186,11145,12187,12190],{},[49,12188,12189],{},"‘Sheet name’"," to the original spreadsheet set up.",[129,12192,9923],{"id":9922},[11,12194,11175,12195,13],{},[49,12196,12197],{},"‘Run w\u002Fdekstop app’",[11,12199,11844],{},[129,12201,11848],{"id":11847},[11,12203,10675,12204,13],{},[39,12205,9178],{"href":5184},[63,12207,11857],{"id":11856},[11,12209,11860],{},[175,12211],{"alt":11863,"src":11864},[63,12213,12215],{"id":12214},"issues-you-may-encounter-with-your-email-scraper","Issues you may encounter with your email scraper",[187,12217,12218,12224,12226],{},[190,12219,11873,12220,11877,12222,2139],{},[49,12221,11876],{},[49,12223,11880],{},[190,12225,11883],{},[190,12227,11886],{},[11,12229,9205,12230],{},[39,12231,9208],{"href":521},[63,12233,526],{"id":525},[11,12235,12236],{},"Congratulations, 🥳👨‍🎓🥳, you've learned how to make and use a ChatGPT AI bot to extract data. With this newly acquired skill, you know how to scrape data, loop through actions, and extract data to a Google Sheet. The sky's the limit with your new AI super powers. 🦸",[63,12238,12240],{"id":12239},"what-else-can-i-automate-with-chatgpt-and-axiomai","What else can I automate with ChatGPT and axiom.ai?",[11,12242,12243,12244,12247],{},"If you're excited, here are some ideas for other bots: extract data from your email app (such as Gmail), generate content, and send direct messages on Instagram. We have steps to extract data with AI and to generate text with AI. If you are looking to do an ",[39,12245,12246],{"href":9644},"email blast on Gmail"," we have a gudie for that.",[11,12249,12250,12251],{},"If you want to read more about ",[39,12252,12254],{"href":12253},"\u002Fblog\u002Fchatgpt-bot-ai-automation","browser automation and AI read this post.",{"title":15,"searchDepth":16,"depth":16,"links":12256},[12257,12258,12259,12260,12261,12262,12263,12264,12277,12278,12279,12280],{"id":11969,"depth":542,"text":11970},{"id":11976,"depth":542,"text":11977},{"id":11983,"depth":542,"text":11984},{"id":11990,"depth":542,"text":11991},{"id":11997,"depth":542,"text":11998},{"id":12004,"depth":542,"text":12005},{"id":12013,"depth":542,"text":12014},{"id":12024,"depth":542,"text":12025,"children":12265},[12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276],{"id":9324,"depth":16,"text":9325},{"id":9736,"depth":16,"text":9737},{"id":9746,"depth":16,"text":9747},{"id":9382,"depth":16,"text":9383},{"id":11694,"depth":16,"text":11695},{"id":11713,"depth":16,"text":11714},{"id":11749,"depth":16,"text":11750},{"id":11770,"depth":16,"text":11771},{"id":11807,"depth":16,"text":11808},{"id":9922,"depth":16,"text":9923},{"id":11847,"depth":16,"text":11848},{"id":11856,"depth":542,"text":11857},{"id":12214,"depth":542,"text":12215},{"id":525,"depth":542,"text":526},{"id":12239,"depth":542,"text":12240},{"read":10741,"type":578,"tool":12282,"category":12283,"tags":12284,"location":587,"featuredimg":12285,"landingimg":12286,"summary":12287},[580],[4752],[9638,9639,11938],"\u002Fblog\u002Femail-scraper-hero.jpg","\u002Fblog\u002Femail-scraper-box.jpg","We'll show you how to create a bot that utilizes AI to scrape emails.",{"title":11950,"description":11955},"blog\u002Fhow-to-scrape-emails","-Q5EIJKLU3bE_CtNGzbPv1ulCxBlICYgtWgovYW_IS4",{"id":12292,"title":12293,"author":23,"body":12294,"date":12585,"description":12586,"draft":575,"extension":19,"meta":12587,"navigation":24,"path":12597,"seo":12598,"stem":12599,"__hash__":12600},"blog\u002Fblog\u002Fautomate-chrome-browser.md","Top tips for web automation in the chrome browser",{"type":8,"value":12295,"toc":12572},[12296,12303,12306,12309,12313,12316,12319,12333,12337,12340,12344,12351,12354,12358,12362,12365,12368,12379,12382,12386,12389,12392,12395,12412,12416,12419,12423,12426,12429,12433,12437,12440,12454,12458,12461,12465,12468,12471,12475,12479,12482,12490,12494,12497,12501,12504,12507,12518,12522,12525,12529,12532,12535,12543,12547,12550,12552,12566,12569],[11,12297,12298,12299,12302],{},"There's nothing quite like the magic of seeing a bot automate Chrome and do your boring, repetitive tasks for you. Happily, anyone can automate the browser with ",[39,12300,4988],{"href":4986,"rel":12301},[43],"'s no-code tool – you really don't need to know how to code. Sure, sometimes you'll need to have the patience to learn a new skill, but these top tips will help you take your web automation skills from novice to pro status quickly.",[60,12304],{"alt":12305},"how to automate the chrome browser with axiom.ai",[11,12307,12308],{},"This post includes methods for speeding up web scraping 🚀, web automation with key presses ⌨️, and appending data from separate steps in axiom.ai's builder.",[63,12310,12312],{"id":12311},"_1-how-to-select-button-clicks-using-text","1. How to select button clicks using text",[11,12314,12315],{},"When using the 'Click Element' step to automate button clicks, did you know that if a button has unique text (such as \"Send Message\"), you can select the button by its text instead of using a CSS selector? By using this option, Axiom will search for the string rather than a CSS selector to find the element on the page.",[11,12317,12318],{},"It's really simple:",[187,12320,12321,12324,12327,12330],{},[190,12322,12323],{},"Click \"Select\" in your \"Click Element\" step",[190,12325,12326],{},"Click on 'Custom'",[190,12328,12329],{},"Tick the box labeled \"Use element text instead of HTML”",[190,12331,12332],{},"Enter the text inside the box and click \"Complete”",[175,12334],{"src":12335,"alt":12336},"\u002Fblog\u002Ftext-slector-chrome-blog.jpg","How to select button clicks using text with axiom.ai",[11,12338,12339],{},"This trick is often used when automating Instagram. For instance, an annoying pop-up that can only be closed with a 'Not Now' button appears during runtime when running an Instagram bot. Since it cannot be selected using the selector tool, the text method should be used instead. This method works perfectly and allows the pop-up that appears on Instagram to be removed every time.",[63,12341,12343],{"id":12342},"_2-how-to-prevent-errors-when-buttons-are-not-always-present","2. How to prevent errors when buttons are not always present",[11,12345,12346,12347,12350],{},"In the 'Click element' step, there is a useful checkbox labeled 'Optional click' that you may have overlooked. Check this box if the button you are selecting is not always present. Normally, ",[39,12348,4988],{"href":4986,"rel":12349},[43]," will throw an error stopping your bot if a button is missing. This option is particularly useful if you are creating an automation that loops through pages in Chrome clicking buttons.",[11,12352,12353],{},"To use the Optional click open your click element step and tick the box.",[175,12355],{"src":12356,"alt":12357},"\u002Fblog\u002Foptional-click.jpg","continue on error in axiom.ai",[63,12359,12361],{"id":12360},"_3-how-to-keep-axiom-running-despite-errors","3. How to keep Axiom running despite errors",[11,12363,12364],{},"Occasionally, when automating a browser, your bot may encounter an error that halts its run - for instance, an empty selector when scraping data. In such cases, you may want your bot to keep running, ignoring the error.",[11,12366,12367],{},"To achieve this, simply tick the ‘Continue on Error’ box. Here’s how to find it:",[187,12369,12370,12373,12376],{},[190,12371,12372],{},"Click on the menu icon with three dots located in the top right corner",[190,12374,12375],{},"Click on \"Settings\"",[190,12377,12378],{},"Click \"Continue on error\" in the sidebar and tick the box",[175,12380],{"src":12381,"alt":12357},"\u002Fblog\u002Fcontinue-on-error.jpg",[63,12383,12385],{"id":12384},"_4-how-to-speed-up-your-web-scraper-in-chrome","4. How to speed up your web scraper in Chrome",[11,12387,12388],{},"We have worked really hard on our scraping tool, and we think it's pretty good. It has undergone many updates, so you may not have noticed the configuration options we recently added. These options can be used to optimize your scrapers and make them run even faster.",[11,12390,12391],{},"Warning: If you run the scraper too quickly, it may execute before the data is fully loaded. Some experimentation may be required to determine the optimal speed for the site you are using or your internet connection.",[11,12393,12394],{},"In the \"Get data\" step, look for the \"Configuration\" section and click to expand your options. These are the settings you will see:",[187,12396,12397,12400,12403,12406,12409],{},[190,12398,12399],{},"Wait time between scrolls (ms) - if scraping a content of a page (not a listing) reduce this down to 2000",[190,12401,12402],{},"No. of retry attempts when results not found - if your page loads quickly and no additional content is loading try as low as 0",[190,12404,12405],{},"Minimum wait before scraping (ms) - we often leave this unchanged, would recommend focusing on step 1-2",[190,12407,12408],{},"Page number to start scraping on - N\u002FA",[190,12410,12411],{},"Force a re-scrape - Untick unless you get an issue with missing page data after the first page",[175,12413],{"src":12414,"alt":12415},"\u002Fblog\u002Fconfig-scraper.jpg","speed your web scraping up in axiom.ai",[11,12417,12418],{},"Experiment and see what works best!",[63,12420,12422],{"id":12421},"_5-how-to-use-the-keyboard-to-unstick-your-automations","5. How to use the keyboard to unstick your automations",[11,12424,12425],{},"There are times when automating the browser using the ‘Click element’ or ‘Enter text’ step just does not work. That's when the Keypress step can prove to be very handy. This step lets you record keystrokes, which is useful because a tab can switch between inputs, a down arrow can scroll the page down, and a return can click a button. If you ever get stuck, give this step a try.",[11,12427,12428],{},"To use the \"Press Key(s)\" step, add the step, click \"Record\", and type the key(s).",[175,12430],{"src":12431,"alt":12432},"\u002Fblog\u002Fblog-press-keys-axiom.jpg","automate chrome with a key press using axiom.ai",[63,12434,12436],{"id":12435},"_6-how-to-get-the-last-day-of-the-previous-month-as-a-variable","6. How to get the last day of the previous month as a variable",[11,12438,12439],{},"Getting the last day of the month is a useful feature for automating report generation. Our date and time step includes a neat feature that allows you to do this in seconds. Here’s how to use it:",[187,12441,12442,12445,12448,12451],{},[190,12443,12444],{},"Add new step in the builder and search for ‘Get and date time’",[190,12446,12447],{},"Select \"custom\"",[190,12449,12450],{},"Choose 'Last day of previous month' from the select list",[190,12452,12453],{},"Choose your preferred format",[175,12455],{"src":12456,"alt":12457},"\u002Fblog\u002Flast-day-month.jpg","get the last day of the month using axiom.ai",[11,12459,12460],{},"A word to the wise: if you ever use the date or time to write file names, remember that a '\u002F' is not permitted. Instead, use dashes '-'.",[63,12462,12464],{"id":12463},"_7-how-to-upload-or-download-files-in-the-cloud","7. How to upload or download files in the cloud",[11,12466,12467],{},"Axiom features steps for uploading and downloading files via our desktop app. Recently, we added two new steps that allow you to upload or download files to your Google Drive, which is incredibly convenient. And yes, they work in the cloud!",[11,12469,12470],{},"To use the Google Drive steps, simply click the ‘+’ button, search for ‘Google Drive’, and add the step you wish to use.",[175,12472],{"src":12473,"alt":12474},"\u002Fblog\u002Fgoogle-drive-files.jpg","manage files in the cloud with google drive using axiom.ai",[63,12476,12478],{"id":12477},"_8-how-to-tell-axiom-to-switch-to-a-new-window-or-pop-up","8. How to tell Axiom to switch to a new window or pop up",[11,12480,12481],{},"This is a common issue that people get stuck with when creating an Axiom. If you automate a click that opens a new tab or pop-up, Axiom does not automatically switch to that new window. It is important to explicitly tell Axiom to switch to the new window (both tabs and pop-ups are considered new windows). If you do not do this, your Axiom will not work. Fortunately, we have a step to help you accomplish this task:",[187,12483,12484,12487],{},[190,12485,12486],{},"Add a new step and search for “Switch browser tab”",[190,12488,12489],{},"Set the tab selection to \"Last opened\" or specify a tab number (1 being the first tab in the browser)",[175,12491],{"src":12492,"alt":12493},"\u002Fblog\u002Fswitch-tabs.jpg","how to switch tabs in axiom.ai",[11,12495,12496],{},"This step is pretty easy to use; just leave it on the \"newest tab\" setting. However, remember that you may need to add another one of these steps to go back to the original window! We also have steps for closing a tab.",[63,12498,12500],{"id":12499},"_9-how-to-join-two-separate-pieces-of-data-in-axiom","9. How to join two separate pieces of data in Axiom",[11,12502,12503],{},"If you are building an Axiom and you want to join the data output of different steps, you can use the handy Append step. This allows you to join data either vertically or horizontally.",[11,12505,12506],{},"To do this, simply:",[187,12508,12509,12512,12515],{},[190,12510,12511],{},"Add a new step in the builder and search for “Append”",[190,12513,12514],{},"Select the sources for 'Data A' and 'Data B'",[190,12516,12517],{},"Choose whether you want to append the data vertically or horizontally. ‘Horizontal’ adds the second set of data as new columns, while ‘vertical’ adds it as new rows.",[175,12519],{"src":12520,"alt":12521},"\u002Fblog\u002Fappend-data-step-blog.jpg","how to append data in axiom.ai",[11,12523,12524],{},"You can chain multiple append steps together if you need to join more than one data source. To do this, choose the previous ‘Append’ step as the ‘Data A’ source and add your new data to ‘Data B’.",[63,12526,12528],{"id":12527},"_10-how-to-combine-several-axioms-into-one","10. How to combine several Axioms into one",[11,12530,12531],{},"Axiom comes complete with a ‘Run Another Axiom’ step. This allows you to import Axioms into a single controller Axiom. This step is really useful for building complex Axioms with many steps. It can be handy to break complex Axioms down into several parts that you can run independently and maintain.",[11,12533,12534],{},"To use the ‘Run Another Axiom’ step simply:",[187,12536,12537,12540],{},[190,12538,12539],{},"Add a new step in the builder and search for “Run”",[190,12541,12542],{},"Inside the step, select the Axiom you want to load",[175,12544],{"src":12545,"alt":12546},"\u002Fblog\u002Fanother-axiom.jpg","how to run multi axioms inside another axiom with axiom.ai",[11,12548,12549],{},"During runtime, any external Axioms will be triggered in the order they appear.",[63,12551,526],{"id":525},[11,12553,12554,12555,12558,12559,12562,12563,13],{},"We hope you find these tips useful for developing your axioms and improving your browser automation skills. If you are interested in learning more, you can watch ",[39,12556,12557],{"href":9692},"our video guides"," or read our ",[39,12560,12561],{"href":11271},"documentation",". Also keep an eye on our release notes to discover new features and ",[39,12564,12565],{"href":4717},"updates",[11,12567,12568],{},"Please always feel free to reach out and ask support if you need it.",[11,12570,12571],{},"Keep an eye out for tips on structuring your Axioms, coming soon.",{"title":15,"searchDepth":16,"depth":16,"links":12573},[12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584],{"id":12311,"depth":542,"text":12312},{"id":12342,"depth":542,"text":12343},{"id":12360,"depth":542,"text":12361},{"id":12384,"depth":542,"text":12385},{"id":12421,"depth":542,"text":12422},{"id":12435,"depth":542,"text":12436},{"id":12463,"depth":542,"text":12464},{"id":12477,"depth":542,"text":12478},{"id":12499,"depth":542,"text":12500},{"id":12527,"depth":542,"text":12528},{"id":525,"depth":542,"text":526},"2023-03-28","There's nothing quite like the magic of seeing a bot automate Chrome and do your boring, repetitive tasks for you. Happily, anyone can automate the browser with axiom.ai's no-code tool – you really don't need to know how to code. Sure, sometimes you'll need to have the patience to learn a new skill, but these top tips will help you take your web automation skills from novice to pro status quickly.",{"read":4749,"type":578,"tool":12588,"category":12589,"tags":12590,"location":587,"featuredimg":18,"landingimg":12594,"summary":12595,"video":12596},[580],[5787],[12591,12592,12593],"button clicks","keyboard actions","chrome","\u002Fblog\u002Ftop-tips.png","Learn how to automate the Chrome browser - take your browser automation skills from novice to pro quickly","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTPF54t24Cjo?rel=0","\u002Fblog\u002Fautomate-chrome-browser",{"title":12293,"description":12586},"blog\u002Fautomate-chrome-browser","FcqHiwyr3mah8na2YmEz2mViS-rDSCFQb0WOVmLklpE",{"id":12602,"title":12603,"author":23,"body":12604,"date":13010,"description":13011,"draft":575,"extension":19,"meta":13012,"navigation":24,"path":13023,"seo":13024,"stem":13025,"__hash__":13026},"blog\u002Fblog\u002Fautomate-translations-in-youtube-studio.md","How to translate titles and descriptions in YouTube Studio",{"type":8,"value":12605,"toc":12984},[12606,12609,12611,12614,12618,12621,12624,12631,12635,12638,12642,12645,12649,12652,12656,12659,12662,12665,12668,12672,12675,12679,12683,12686,12689,12692,12706,12710,12713,12717,12721,12724,12727,12730,12733,12737,12740,12746,12750,12754,12757,12765,12769,12772,12776,12784,12788,12796,12800,12811,12815,12823,12826,12830,12834,12837,12841,12855,12859,12867,12871,12888,12891,12895,12898,12902,12913,12916,12920,12923,12926,12929,12932,12943,12945,12949,12952,12955,12958,12963,12965,12968,12972,12977,12981],[11,12607,12608],{},"Translating your YouTube descriptions (the title and text describing your content) into other languages is likely to increase your views. Yet translation is costly and time consuming, and let’s face it, many of us simply don’t bother. But what if you could do it with a bot using Google Translate?",[60,12610],{},[11,12612,12613],{},"In this guide, we’ll teach you how to automate translating your YouTube descriptions without a single line of code, using Axiom’s no-code bot building tool. If you’re interested in learning more about browser automation and how it can be used to automate tasks throughout the YouTube ecosystem, this guide is a great starting point.",[63,12615,12617],{"id":12616},"why-build-a-bot","Why build a bot?",[11,12619,12620],{},"Have you ever seen a bot do your work for you? This was one user’s reaction on Twitter:",[11,12622,12623],{},"“Help! I’m addicted to writing bots with @browserbots that make my job and life easier”",[11,12625,12626,12627,12630],{},"YouTube automation ",[49,12628,12629],{},"frees up time and resources normally spent on routine tasks that can instead be used to focus on growing and scaling your business."," Of course there’s a learning curve when it comes to building bots, but once mastered, you can automate much more than just translations for YouTube.",[63,12632,12634],{"id":12633},"what-is-a-bot","What is a bot?",[11,12636,12637],{},"A bot is a program that automatically performs tasks for you on the Internet. Like a physical robot, you’ll need to give it instructions, telling it how to automate translating descriptions in YouTube Studio.",[63,12639,12641],{"id":12640},"how-are-bots-made-using-axiomai","How are bots made using axiom.ai?",[11,12643,12644],{},"With the help of Axiom’s no-code bot builder, you can easily make bots that combine steps to replicate your actions in YouTube Studio. You can build as many bots as you want for any web-based application, not just YouTube, without a single line of code!",[63,12646,12648],{"id":12647},"can-anyone-make-a-bot-to-automate-actions-in-youtube-studio","Can anyone make a bot to automate actions in YouTube Studio?",[11,12650,12651],{},"The answer is yes! You don’t need to know how to code. If you’re completely new to this, keep following the guide and by the end you’ll have made a bot that automates translations in YouTube Studio. Don’t forget that all new accounts get 2 free hours of runtime to test your bots - no credit card required.",[63,12653,12655],{"id":12654},"how-does-the-bot-automate-translations-in-youtube-studio","How does the bot automate translations in YouTube Studio?",[11,12657,12658],{},"The bot you’re about to make will read a YouTube ID from a Google Sheet, as well as the text and language you want to translate it into.",[11,12660,12661],{},"Then the bot will load the Google Translate page into a browser, paste the text into the translate box and click translate. Once that's done, the bot scrapes the translated text.",[11,12663,12664],{},"Its next action is to use the YouTube ID to open the correct video’s ‘translate’ page. It then clicks ‘create translation’, sets the language, enters the translation and saves.",[11,12666,12667],{},"And it won’t stop there: it will continue looping through any additional rows in the Google Sheet.",[63,12669,12671],{"id":12670},"what-else-can-you-automate-using-bots-in-youtube-studio","What else can you automate using bots in YouTube Studio?",[11,12673,12674],{},"YouTube Studio users have plenty of repetitive tasks that bots can automate. For example, extracting data for reporting or even creating new posts. Plus you can extend the same bot to multiple YouTube accounts.",[63,12676,12678],{"id":12677},"get-started-the-first-steps-for-building-your-bot","Get started: the first steps for building your bot",[129,12680,12682],{"id":12681},"set-up-google-sheet","Set up Google Sheet",[11,12684,12685],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut 'sheet.new', presuming you already have an account.",[11,12687,12688],{},"First, name your sheet something like 'Automate YouTube translations’, then set up two tabs titled 'Translate' and 'Translated.’",[11,12690,12691],{},"Add data to the ‘Translate’ tab on your sheet. Each translation should be added to a new row, in this format:",[648,12693,12694,12697,12700,12703],{},[190,12695,12696],{},"Column A: add the YouTube video ID",[190,12698,12699],{},"Column B: add the title you wish to translate",[190,12701,12702],{},"Column C: add the description you wish to translate",[190,12704,12705],{},"Column D: specify the language you wish to translate the text into (Match how the languages are listed on Google Translate).",[129,12707,12709],{"id":12708},"start-from-blank","Start from blank",[11,12711,12712],{},"To build your bot from scratch, click on 'Start blank.’",[175,12714],{"src":12715,"alt":12716},"\u002Fblog\u002Fstartfromblank.png","Start from blank - build a bot to automate amazon posts",[129,12718,12720],{"id":12719},"add-a-read-data-from-a-google-sheet-step","Add a ‘Read data from a Google Sheet’ step",[11,12722,12723],{},"Find the ‘Read data from a Google Sheet’ step (you can use the search function to do so). Add the step to Axiom for you to configure.",[11,12725,12726],{},"In the field called 'Spreadsheet', you can search for the Google Sheet you created. Once found, click to select.",[11,12728,12729],{},"For 'Sheet name' click on the drop-down and select the tab 'Translate'.",[11,12731,12732],{},"On the first cell, toggle the switch and enter 'A1'. This setting tells the bot where to start reading data.",[175,12734],{"src":12735,"alt":12736},"\u002Fblog\u002Fg-sheet-youtube.png","set up your google sheet to automate youtube studio translations for titles and descriptions",[11,12738,12739],{},"On the last cell, click the toggle switch and enter 'AD1'. You have limited the bot to read a single row. We can set the bot to loop later on.",[11,12741,12742,12743],{},"If you want to learn more about ",[39,12744,12745],{"href":9769},"Google Sheet steps watch these videos.",[63,12747,12749],{"id":12748},"part-one-automate-translations-of-titles-and-descriptions-using-google-translate","Part One: Automate translations of titles and descriptions using Google Translate",[129,12751,12753],{"id":12752},"_1-add-an-loop-through-data-step","1. Add an ‘Loop through data’ step",[11,12755,12756],{},"This ‘interact’ step will be used to automate Google Translate by inputting data and extracting the resulting translations.",[11,12758,12759,12760],{},"In the ‘Enter URL’ field, enter the URL for Google Translate ",[39,12761,12764],{"href":12762,"rel":12763},"https:\u002F\u002Fwww.google.com\u002Fsearch?q=google+translate",[43],"https:\u002F\u002Fwww.google.com\u002Fsearch?q=google+translate ",[129,12766,12768],{"id":12767},"_2-set-up-sub-steps","2. Set up sub-steps",[11,12770,12771],{},"Now add the following sub-steps to populate the google translate form.",[175,12773],{"src":12774,"alt":12775},"\u002Fblog\u002Ftranslate.png","Enter the text to be tranlated into Google Translate",[187,12777,12778,12781],{},[190,12779,12780],{},"Add a new sub-step called ‘Enter Text’. Click ‘Select’ then select the ‘Enter text’ field on the Google Translate page. Click on ‘Insert Data’ and pass the title text to be translated.",[190,12782,12783],{},"Add a ‘Click Element’ sub-step and select the language drop down.",[175,12785],{"src":12786,"alt":12787},"\u002Fblog\u002Fselect-lang-ui.png","Select the language to tranlate the text to",[187,12789,12790,12793],{"start":16},[190,12791,12792],{},"Add an ‘Enter Text’ step, click ‘Select Data’ and choose the column with the language choice, ensuring it matches Google’s own language listing.",[190,12794,12795],{},"Add a ‘Press Key(s)’ step and record a return to submit the choice made in step 3",[175,12797],{"src":12798,"alt":12799},"\u002Fblog\u002Fgetdata-translate.png","scrape translated content",[187,12801,12802,12805,12808],{"start":961},[190,12803,12804],{},"Add a ‘Get data from a webpage’ step and select the translated title",[190,12806,12807],{},"Add a ‘Click element’ sub-step and select the ‘x’ to clear the translated text ready to input the description text for translation",[190,12809,12810],{},"Then add an ‘Enter Text’ sub-step, click on the yellow ‘Enter data’ button and select the column with the description in the data preview that appears on-click.",[175,12812],{"src":12813,"alt":12814},"\u002Fblog\u002Fsteps-translate.png","add last steps to automate Google Translate",[187,12816,12817,12820],{"start":1015},[190,12818,12819],{},"Now add a ‘Get data from a webpage’ sub-step. Select the translated description.",[190,12821,12822],{},"Add a ‘Display a message’ step, insert data from ‘Interact’ step to check it’s working. Hit run to test it. The content should appear in a pop up like this add image",[11,12824,12825],{},"Awesome work! You have built the first part of the bot. We will now teach you how to pass the translated titles and descriptions to the next ‘Interact’ step that will automate the translations.",[63,12827,12829],{"id":12828},"part-two-automate-translations-in-youtube-studio","Part Two: Automate translations in YouTube Studio",[129,12831,12833],{"id":12832},"_1-add-a-new-loop-through-data-below-display-a-message-step","1. Add a new ‘Loop through data’ below ‘Display a message’ step",[11,12835,12836],{},"This ‘Interact’ step will be used to automate the generation of the translations in YouTube. Once set up, it will select the language and enter the translated title and description.",[175,12838],{"src":12839,"alt":12840},"\u002Fblog\u002Furl-youtube-stuido.png","add url to the sub step",[187,12842,12843],{},[190,12844,12845,12846,12850,12851],{},"In the ‘Enter URL’ add this partial URL ‘",[39,12847,12848],{"href":12848,"rel":12849},"https:\u002F\u002Fstudio.YouTube.com\u002Fvideo\u002F",[43],", then click on ‘Insert data’ and select the Google Sheet variable. The data preview will slide up: select the unique YouTube ID. Then add ‘\u002Ftranslations’. Congratulations! You have learned to construct URLs with variables. A very useful trick for automating the browser. Your URL should look a little like this: ",[39,12852,12853],{"href":12853,"rel":12854},"https:\u002F\u002Fstudio.YouTube.com\u002Fvideo\u002FPebeNFAKbEU\u002Ftranslations",[43],[175,12856],{"src":12857,"alt":12858},"\u002Fblog\u002Fclick-select-youtube.png","Add click step and select add lanuage in youtube",[187,12860,12861,12864],{"start":542},[190,12862,12863],{},"Next, we need to use a ‘Click Element’ sub-step and click on ‘ADD LANGUAGE’",[190,12865,12866],{},"Then input the language used for the translation. Use the ‘Enter Text’ sub-step, then click ‘Enter data’ and select the language.",[175,12868],{"src":12869,"alt":12870},"\u002Fblog\u002Fkeypress-youtube-studio.png","Add a Press Key step",[187,12872,12873,12876,12879,12882,12885],{"start":571},[190,12874,12875],{},"Now add a ‘Press Key(s)’’ step. Record a press of the ‘Return’ key to submit the language.",[190,12877,12878],{},"Now add a ‘Click Element’, select ‘ADD’ in the Title & Description column. The language fields will appear in a pop-up.",[190,12880,12881],{},"Now add two ‘Enter Text’ steps for the ‘Title’ and ‘Description’ fields. Pass the content from the Google Sheet by selecting 'Insert data’ then in the preview that pops up, select the title and description. If you see no data preview, column A should be the title and column B the description.",[190,12883,12884],{},"Add ‘Click Element’ step to publish the translation. Note you will need to add some text to make the button active when selecting it.",[190,12886,12887],{},"Add a ‘Wait’ step of 3000ms to ensure the content saves.",[11,12889,12890],{},"Okay, you’re almost done and getting good at building bots!",[63,12892,12894],{"id":12893},"loop-the-bot","Loop the bot",[11,12896,12897],{},"All you need to do now is to set the bot up to loop.",[175,12899],{"src":12900,"alt":12901},"\u002Fblog\u002Fyoutube-loop.png","How to loop your youtube studio axiom",[187,12903,12904,12907,12910],{},[190,12905,12906],{},"Add a ‘Write data to a Google Sheet’ step and select the sheet called ‘Translated.’ Pass the Google Sheet data to log the completed translations.",[190,12908,12909],{},"Add ‘Delete Google Sheet’ step and choose the ‘Translated’ sheet to remove the completed row so that the bot loops onto a new row.",[190,12911,12912],{},"Finally, add ‘Jump to another step’’ and enter the number of steps to jump to (in this case 1) and enter the number of loops you want in ‘Maximum cycles’.",[11,12914,12915],{},"The bot is now ready and will loop through its tasks. You can automate!",[63,12917,12919],{"id":12918},"test-run-your-youtube-studio-bot","Test run your Youtube Studio bot",[11,12921,12922],{},"Before you do a test run, cdisable the sub-step that clicks ‘Publish’. If not, make sure you do this now.",[11,12924,12925],{},"It's best practice to test every bot to check it’s production-ready. With the ‘Publish’ button disabled, you can do a test run that will not add a translation.",[11,12927,12928],{},"We recommend test running your bot with the desktop app.",[11,12930,12931],{},"Things to check for:",[187,12933,12934,12937,12940],{},[190,12935,12936],{},"Is the text translated?",[190,12938,12939],{},"Is the text entered in the correct language?",[190,12941,12942],{},"Is the translation saving?",[11,12944,501],{},[63,12946,12948],{"id":12947},"debugging-your-youtube-studio-bot","Debugging your Youtube Studio bot",[11,12950,12951],{},"If you experience any issues with the bot not clicking buttons, try re-selecting the button or text input. To change the selection, move the cursor slowly over the object and re-select.",[11,12953,12954],{},"The Click step also has a handy feature that allows you to select the button by the text, which can resolve many issues.",[11,12956,12957],{},"If the Publish button is clicked, but the Translation is not saving. Make sure you have added the 'Wait' at the end of the sub-step in the second 'Interact' step.",[11,12959,12960,12961],{},"Don't forget we have excellent customer support. If you need help, get in touch.",[39,12962,522],{"href":521},[63,12964,526],{"id":525},[11,12966,12967],{},"Bots can save you hours of time and resources normally spent on repetitive tasks. Now you’ve built and run your first bot, why not use your new super power to automate other tasks? Another popular use of Axiom in the YouTube ecosystem is to automate the Add text",[63,12969,12971],{"id":12970},"axiom-support","Axiom Support",[11,12973,12974,12975],{},"If you do get stuck or need some guidance, we are here to help. Simply post your request here ",[39,12976,522],{"href":521},[63,12978,12980],{"id":12979},"need-to-scale-your-youtube-sutido-bot","Need to scale your YouTube Sutido bot?",[11,12982,12983],{},"If you have multiple YouTube accounts to manage, with hundreds of videos to translate, one bot may not be enough. You can run two or three bots concurrently with our Pro Max and Ultimate subscriptions.",{"title":15,"searchDepth":16,"depth":16,"links":12985},[12986,12987,12988,12989,12990,12991,12992,12997,13001,13004,13005,13006,13007,13008,13009],{"id":12616,"depth":542,"text":12617},{"id":12633,"depth":542,"text":12634},{"id":12640,"depth":542,"text":12641},{"id":12647,"depth":542,"text":12648},{"id":12654,"depth":542,"text":12655},{"id":12670,"depth":542,"text":12671},{"id":12677,"depth":542,"text":12678,"children":12993},[12994,12995,12996],{"id":12681,"depth":16,"text":12682},{"id":12708,"depth":16,"text":12709},{"id":12719,"depth":16,"text":12720},{"id":12748,"depth":542,"text":12749,"children":12998},[12999,13000],{"id":12752,"depth":16,"text":12753},{"id":12767,"depth":16,"text":12768},{"id":12828,"depth":542,"text":12829,"children":13002},[13003],{"id":12832,"depth":16,"text":12833},{"id":12893,"depth":542,"text":12894},{"id":12918,"depth":542,"text":12919},{"id":12947,"depth":542,"text":12948},{"id":525,"depth":542,"text":526},{"id":12970,"depth":542,"text":12971},{"id":12979,"depth":542,"text":12980},"2022-10-11","Learn how to use browser automation to translate titles and descriptions in YouTube Studio with a bot.",{"read":10412,"type":578,"tool":13013,"category":13014,"tags":13015,"location":587,"featuredimg":13018,"landingimg":13019,"summary":13020,"metaTitle":13021,"video":13022},[580],[6055],[13016,13017],"translation","translate","\u002Fblog\u002Famazon-post-large.png","\u002Fblog\u002Ftranslate-youtube.jpg","Learn how to build a bot step by step.","How to automate translation of titles and descriptions in YouTube Studio","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fy43BPE7IDwU?rel=0","\u002Fblog\u002Fautomate-translations-in-youtube-studio",{"title":12603,"description":13011},"blog\u002Fautomate-translations-in-youtube-studio","k7kJ2By7Vl91jXVt15gdsYbL2v5son7GVCyZKw__HTQ",{"id":13028,"title":13029,"author":23,"body":13030,"date":13393,"description":13394,"draft":575,"extension":19,"meta":13395,"navigation":24,"path":8979,"seo":13402,"stem":13403,"__hash__":13404},"blog\u002Fblog\u002Famazon-posts.md","How to automate Amazon Posts",{"type":8,"value":13031,"toc":13368},[13032,13035,13038,13042,13045,13048,13058,13060,13063,13065,13068,13070,13073,13077,13080,13084,13087,13091,13100,13109,13113,13122,13125,13129,13132,13135,13138,13142,13145,13149,13152,13154,13158,13161,13163,13166,13169,13172,13176,13184,13188,13191,13195,13198,13201,13204,13211,13214,13218,13221,13225,13228,13231,13234,13238,13241,13245,13248,13252,13255,13258,13262,13269,13272,13275,13278,13282,13286,13289,13292,13295,13298,13301,13305,13308,13311,13313,13315,13326,13328,13332,13334,13336,13339,13345,13347,13353,13359,13361],[11,13033,13034],{},"In this guide, we’ll show you how to automate an Amazon Post in the Beta app. If you’re interested in learning more about browser automation and how it can be used to automate tasks throughout the Amazon ecosystem, this guide is a great starting point. It’s a simple bot that can be built in under five minutes - even if you’re a novice!",[60,13036],{"alt":13037},"how to automate Amazon posts with axiom.ai",[63,13039,13041],{"id":13040},"why-learn-to-build-bots-to-automate-amazon-posts","Why learn to build bots to automate Amazon Posts?",[11,13043,13044],{},"Have you ever seen a bot do your work for you? This was one user’s reaction:",[11,13046,13047],{},"“Axiom is a wonderful no-code solution for automation. When my first Axiom worked successfully, I was so happy I did a little dance!” 💃👇",[11,13049,13050,13051,13053,13054],{},"Amazon automation ",[49,13052,12629],{}," Of course there’s a learning curve when it comes to building bots, but once mastered, you can automate much more than just ",[39,13055,13057],{"href":13056},"\u002Fblog\u002Fwhat-is-amazon-automation","Amazon Posts.",[63,13059,12634],{"id":12633},[11,13061,13062],{},"A bot is a program that automatically performs tasks for you on the Internet. Like a physical robot, it needs instructions, so you need to  give it a set of instructions that tell it how to automate creating Amazon Posts.",[63,13064,12641],{"id":12640},[11,13066,13067],{},"With the help of Axiom’s no-code bot builder, you can easily make bots that combine steps to replicate  your actions.. You can build as many bots as you want for any web-based application, not just Amazon. Without a single line of code!",[63,13069,6110],{"id":6109},[11,13071,13072],{},"The answer is yes! You don’t need to know how to code. If you’re completely new to this, keep following the guide and by the end you’ll have made a bot that automates Amazon Posts. We’re here to help if you get stuck.",[63,13074,13076],{"id":13075},"how-do-bots-automate-amazon-posts","How do bots automate Amazon Posts?",[11,13078,13079],{},"The bot you’re about to make will automate the same web actions you perform when creating an Amazon Post. Bots work just like you: they open the browser window, click on the new post button, upload an image and insert the text before finally clicking the ‘Post’ button to complete the task.",[63,13081,13083],{"id":13082},"what-else-can-you-automate-using-bots-in-amazon","What else can you automate using bots in Amazon?",[11,13085,13086],{},"Don’t stop at your first bot, build yourself a workforce! Bots can be used to automate a range of tasks on Amazon from uploading an inventor to downloading reports. You can even automate posting to other social media platforms such as Facebook, Twitter or Instagram (add link to post). Once you master the art of bot building, you'll be able to automate any task.",[63,13088,13090],{"id":13089},"dive-in-and-make-a-bot-to-automate-amazon-posts","Dive in and make a bot to automate Amazon posts",[11,13092,13093,13094],{},"Before you start, you need to install axiom.ai’s desktop app as this automation requires files to be uploaded. ",[49,13095,13096],{},[39,13097,13099],{"href":13098},"\u002Fguide-part-two","Click here to install.(opens new window)",[11,13101,13102,13103,13],{},"Currently, bots can only work with files on the desktop. If you would like to see this feature on the cloud or elsewhere, ",[49,13104,13105],{},[39,13106,13108],{"href":13107},"\u002Froadmap","please vote here (opens new window)",[129,13110,13112],{"id":13111},"_1-install-axiomai-in-your-chrome-browser","1. Install axiom.ai in your Chrome browser",[11,13114,13115,13116,13],{},"If you haven’t yet installed axiom.ai and created an account, please go to the Chrome store and ",[49,13117,13118],{},[39,13119,13121],{"href":140,"rel":13120},[43],"install Axiom now (opens new window)",[11,13123,13124],{},"By the way, we give all new users 2 hours of free runtime. This means you can build and run this bot a couple of times on us 🙂",[129,13126,13128],{"id":13127},"_2-set-up-your-google-sheet","2. Set up your Google Sheet",[11,13130,13131],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut 'sheet.new'.",[11,13133,13134],{},"First name your sheet 'Automate posting on Amazon', then add two new tabs to the sheet titled 'Post' and 'Posted.’",[11,13136,13137],{},"Finally add data to the ‘Post’ tab on your sheet. Each Post should be on a new row. In Colum A add the image path, Column B add the caption and lastly in Column C add upto 10 ASINS separated by commas.",[129,13139,13141],{"id":13140},"_3-launch-amazon-post-and-open-axiomai","3. Launch Amazon Post and open axiom.ai",[11,13143,13144],{},"First, make sure you’re logged into Amazon Post in your Chrome browser. Then open up axiom.ai and click the '+ New Automation' button. You’re now going to start combining steps to build your automation.",[129,13146,13148],{"id":13147},"_4-start-from-blank","4. Start from blank",[11,13150,13151],{},"To build your bot from scratch, click on 'Start blank.'",[175,13153],{"src":12715,"alt":12716},[129,13155,13157],{"id":13156},"_5-add-your-first-step-read-data-from-a-google-sheet","5. Add your first step, ‘Read data from a Google Sheet’",[11,13159,13160],{},"Using the Step Finder, click ‘Read data from a Google Sheet’. The step will be added to Axiom for you to configure.",[11,13162,12726],{},[11,13164,13165],{},"For 'Sheet name' click on the drop-down and select the tab 'Post' with the test data.",[11,13167,13168],{},"On the first cell, toggle the switch and enter 'A1'. This setting tells the bot where to start reading data. In the example below, you would start with 'My first automated post' as the column titles fill row one.",[11,13170,13171],{},"On the last cell, click the toggle switch and enter 'AC1'. You have limited the bot to read a single row. We will set the boot to loop later on.",[175,13173],{"src":13174,"alt":13175},"\u002Fblog\u002Fgoogle-sheet-post.png","set up your google sheet to automate amazon posts",[11,13177,13178,13179],{},"If you want to learn more about Google Sheet steps ",[49,13180,13181],{},[39,13182,13183],{"href":9769},"watch these videos.(opens new window)",[129,13185,13187],{"id":13186},"_6-loop-through-data","6. Loop through data",[11,13189,13190],{},"Click ‘Add a step’ below the ‘Read’ step. Using the Step Finder, click on 'Loop through data' to add the step.",[175,13192],{"src":13193,"alt":13194},"\u002Fblog\u002Finteract-post.png","Use axiom.ai's interact step to automate creating an amazon post",[11,13196,13197],{},"In the ‘Go to Url’ add Amazon’s Post url.",[11,13199,13200],{},"Inside the Interact step, click on the 'Add a sub step' button. The Interact step features a set of sub steps for automating browser actions like clicking a button.",[11,13202,13203],{},"Add the 'Click element' sub step.",[11,13205,13206,13207,13210],{},"Then, click on 'Select' and use our selector tool to highlight the ‘Create Post’ button on ",[39,13208,13209],{"href":9264},"Amazon"," and click confirm.",[11,13212,13213],{},"Well done, you have automated a web action!",[129,13215,13217],{"id":13216},"_7-add-further-sub-steps","7. Add further sub steps",[11,13219,13220],{},"Your browser window should now be on the Create Post page. Add an 'Upload file’ sub step and select the button 'Upload image'.",[175,13222],{"src":13223,"alt":13224},"\u002Fblog\u002Fimport-image-to-post.png","Use axiom.ai's Upload Step to automate image uploads to automate Amazon Post",[11,13226,13227],{},"In 'File path' click on the yellow icon 'Insert data' and select ‘Google-Sheet-Data’. A data preview will open. Select column A with the image path and save and close the preview.",[11,13229,13230],{},"Next, add a new sub-step called 'Enter text' and select the ‘Caption’ text field.",[11,13232,13233],{},"Now pass your caption from the sheet into the 'Enter text' step. Next, click on the yellow icon 'Insert data' and select 'Google-Sheet-Data'. A data preview will open. Select column B and save and close the preview.",[175,13235],{"src":13236,"alt":13237},"\u002Fblog\u002Fcaption-amazon-post.png","Use axiom.ai's Enter Text Step to automate text entry to the captions on Amazon Post",[11,13239,13240],{},"Add one more 'Enter text' sub-step to pass in the ASINs from column C of the spreadsheet.",[129,13242,13244],{"id":13243},"_8-now-add-a-sub-step-to-submit-the-new-amazon-post","8. Now add a sub-step to submit the new Amazon Post",[11,13246,13247],{},"Add a last sub-step 'Click Element' and select the 'Submit for review' button.",[129,13249,13251],{"id":13250},"_9-add-a-wait-sub-step-after-the-submit","9. Add a wait sub-step after the submit",[11,13253,13254],{},"Just for good measure, add a 'wait' sub-step after the bot clicks submit. Wait steps pause the bot to allow web apps time to finish saving. You may need to increase the wait if uploading a very large image.",[175,13256],{"src":13257,"alt":13237},"\u002Fblog\u002Fwait-post.png",[129,13259,13261],{"id":13260},"_10-add-a-new-step-write-data-to-a-google-sheet-to-record-posts-sent","10. Add a new step ‘Write data to a Google Sheet’ to record Posts sent",[11,13263,13264,13265,13268],{},"Add a new step (",[5314,13266,13267],{},"not"," a sub step) below the ‘Interact’ step by choosing ‘Write data to a Google Sheet’.",[11,13270,13271],{},"In the ‘Spreadsheet url’ field, search for the sheet you previously created.",[11,13273,13274],{},"For ‘Sheet Name’, select the tab called 'Posted'. This tab will keep a record of the Posts sent.",[11,13276,13277],{},"To do this in 'Data' select ‘Google-Sheet-data’.",[129,13279,13281],{"id":13280},"_11-delete-rows-from-a-google-sheet","11. Delete rows from a Google Sheet",[175,13283],{"src":13284,"alt":13285},"\u002Fblog\u002Fdelete-rows.png","Delete rows after posted in your Google Sheet",[11,13287,13288],{},"Add the step ‘Delete rows from a Google Sheet' to delete the row of data that has been used to create the post. This is to prevent it from being posted repeatedly.",[11,13290,13291],{},"Using the Step Finder, search for and click ‘Delete rows from a Google Sheet’ in 'Spreadsheet url' to add the spreadsheet.",[11,13293,13294],{},"Then, in ‘First row to delete’ enter the number ‘1’ and repeat this in ‘Last row to delete’.",[11,13296,13297],{},"Set the ‘Sheet name’ to 'Post'.",[11,13299,13300],{},"Well done! The bot is complete and ready to test 👍",[63,13302,13304],{"id":13303},"test-run-your-amazon-post-bot","Test run your Amazon Post bot",[11,13306,13307],{},"Before you do a test run, check that you disabled the sub-step that clicks ‘Post’. If not, make sure you do this now.",[11,13309,13310],{},"It's best practice to test every bot to check it’s production-ready. With the ‘Post’ button disabled, you can do a test run that will not send a Post.",[11,13312,495],{},[11,13314,12931],{},[187,13316,13317,13320,13323],{},[190,13318,13319],{},"Does the image upload into the Post?",[190,13321,13322],{},"Is the text entered into the Post?",[190,13324,13325],{},"Is the Post saving?",[11,13327,501],{},[63,13329,13331],{"id":13330},"debugging-your-amazon-post-bot","Debugging your Amazon Post bot",[11,13333,12951],{},[11,13335,12954],{},[11,13337,13338],{},"If the submit button is clicked, but the Post is not saving. Make sure you have added the wait in step 9, increasing the time until the Post saves.",[11,13340,13341,13342,13344],{},"Don't forget we have excellent customer support. If you need help, ",[39,13343,9208],{"href":521},"(opens new window)**",[63,13346,526],{"id":525},[11,13348,13349,13350,13352],{},"Now you’ve built and run your first bot automating ",[39,13351,13209],{"href":8989},", why not use your new super power to automate other tasks? Another popular use of Axiom in the Amazon ecosystem is to automate the download of reports.",[11,13354,13355,13356],{},"If you do get stuck or need some guidance, we are here to help. Simply post your ",[39,13357,13358],{"href":521},"request here.",[63,13360,9217],{"id":9216},[11,13362,9220,13363,9227,13365,9232],{},[39,13364,9226],{"href":8989},[39,13366,13367],{"href":9264},"scraping Amazon book",{"title":15,"searchDepth":16,"depth":16,"links":13369},[13370,13371,13372,13373,13374,13375,13376,13389,13390,13391,13392],{"id":13040,"depth":542,"text":13041},{"id":12633,"depth":542,"text":12634},{"id":12640,"depth":542,"text":12641},{"id":6109,"depth":542,"text":6110},{"id":13075,"depth":542,"text":13076},{"id":13082,"depth":542,"text":13083},{"id":13089,"depth":542,"text":13090,"children":13377},[13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388],{"id":13111,"depth":16,"text":13112},{"id":13127,"depth":16,"text":13128},{"id":13140,"depth":16,"text":13141},{"id":13147,"depth":16,"text":13148},{"id":13156,"depth":16,"text":13157},{"id":13186,"depth":16,"text":13187},{"id":13216,"depth":16,"text":13217},{"id":13243,"depth":16,"text":13244},{"id":13250,"depth":16,"text":13251},{"id":13260,"depth":16,"text":13261},{"id":13280,"depth":16,"text":13281},{"id":13303,"depth":542,"text":13304},{"id":13330,"depth":542,"text":13331},{"id":525,"depth":542,"text":526},{"id":9216,"depth":542,"text":9217},"2022-09-15","A guide showing you how to make a bot without code to automate Amazon Posts.",{"read":10955,"type":578,"tool":13396,"category":13397,"tags":13398,"location":587,"featuredimg":13018,"landingimg":13399,"summary":13400,"metaTitle":13401},[580],[6055],[7249,9258,8152],"\u002Fblog\u002Famaazon-post.jpg","A step by step guide showing you how to make bots without code to automate sending Amazon posts in the browser","How to automate an Amazon Posts without code",{"title":13029,"description":13394},"blog\u002Famazon-posts","Md9GpNAkjTceu8XcB9BbShsRGZMBerwiApV_mCqkFZg",{"id":13406,"title":13407,"author":23,"body":13408,"date":16170,"description":16171,"draft":575,"extension":19,"meta":16172,"navigation":24,"path":16178,"seo":16179,"stem":16180,"__hash__":16181},"blog\u002Fblog\u002Fcss-attribute-selectors.md","How can CSS attribute selectors be used for web scraping?",{"type":8,"value":13409,"toc":16142},[13410,13420,13422,13425,13477,13483,13486,13489,13493,13504,13507,13533,13536,13583,13586,13590,13600,13603,13683,13686,13704,13707,13710,13713,13717,13720,13724,13727,13730,13781,13784,13787,13821,13825,13828,13831,13860,13867,13876,13880,13883,13886,13912,13919,13928,13931,13937,13943,13949,13953,13956,13960,13963,14177,14180,14183,14221,14225,14228,14254,14257,14284,14291,14295,14298,14301,14309,14313,14316,14320,14323,14326,14526,14529,14549,14552,14556,14559,14562,14756,14759,14778,14781,14801,14804,14808,14811,14814,15521,15524,15557,15560,15563,15571,15575,15578,15604,15610,15614,15617,15620,15624,15627,15631,15634,15638,15644,15647,15651,15655,15658,15661,15665,15668,15671,15684,15687,15691,15695,15698,15701,15703,15706,15886,15889,15925,15928,15932,15935,15938,15942,15945,15948,15951,16064,16067,16087,16091,16094,16097,16101,16104,16107,16123,16125,16128,16131,16136,16139],[11,13411,13412,13413,13416,13417,13419],{},"Want to ",[39,13414,13415],{"href":2363},"scrape data from a web page?"," axiom.ai makes it easy with our 'Get data from the webpage' Step. Our ",[39,13418,5074],{"href":2004}," lets you easily select the content you want to scrape by pointing and clicking.",[60,13421],{},[11,13423,13424],{},"However, occasionally the selector tool can fail to return the correct results. When this happens, will display an error message such as this:",[708,13426,13430],{"className":13427,"code":13428,"language":13429,"meta":15,"style":15},"language-jsx shiki shiki-themes github-light-default github-dark-default","Error in step 1 - \"Get data from a webpage\": Your chosen selectors have failed to find any content on page 'https:\u002F\u002Fwww.bbc.co.uk\u002F'. If the page is loading too slowly, try adding a min wait. Use Continue on error if you want your Axiom to continue.\nLearn more about common errors\n","jsx",[714,13431,13432,13472],{"__ignoreMap":15},[236,13433,13434,13437,13440,13443,13445,13448,13451,13454,13457,13460,13463,13466,13469],{"class":718,"line":719},[236,13435,13436],{"class":736},"Error ",[236,13438,13439],{"class":722},"in",[236,13441,13442],{"class":736}," step ",[236,13444,3263],{"class":726},[236,13446,13447],{"class":722}," -",[236,13449,13450],{"class":752}," \"Get data from a webpage\"",[236,13452,13453],{"class":736},": Your chosen selectors have failed to find any content on page ",[236,13455,13456],{"class":752},"'https:\u002F\u002Fwww.bbc.co.uk\u002F'",[236,13458,13459],{"class":736},". If the page is loading too slowly, ",[236,13461,13462],{"class":722},"try",[236,13464,13465],{"class":736}," adding a min wait. Use Continue on error ",[236,13467,13468],{"class":722},"if",[236,13470,13471],{"class":736}," you want your Axiom to continue.\n",[236,13473,13474],{"class":718,"line":542},[236,13475,13476],{"class":736},"Learn more about common errors\n",[11,13478,13479,13480,13],{},"If you experience this issue, you can try using a different selection - but sometimes the problem still persists. In that case, you need a custom selector! One of the most useful custom selectors to know about is the ",[49,13481,13482],{},"attribute selector",[11,13484,13485],{},"In this guide, we'll show you how to find attribute selectors on a webpage. We'll provide some examples of when this may be necessary, and teach you how to use custom selectors with axiom.aii.",[11,13487,13488],{},"So if you follow this guide, you'll be well on your way to becoming a web scraping pro. If you're new at the game, we start with a primer on CSS selectors.",[63,13490,13492],{"id":13491},"what-is-a-css-selector","What is a CSS selector?",[11,13494,13495,13496,13499,13500,13503],{},"CSS selectors are one of the two parts of a CSS rule, which are for creating the visual style of HTML elements. These two parts are the ",[5314,13497,13498],{},"selector",", which determines which element to apply the style to, and the ",[5314,13501,13502],{},"declaration",", which is a set of instructions for specifying the appearance of the element.",[11,13505,13506],{},"Here, the CSS selector called \".xl-red-font” is applied to a html element inside a class.",[708,13508,13510],{"className":13427,"code":13509,"language":13429,"meta":15,"style":15},"\u003Ch1 class=\"xl-red-font\">Makes this text large and red\u003C\u002Fh1>\n",[714,13511,13512],{"__ignoreMap":15},[236,13513,13514,13516,13519,13521,13523,13526,13529,13531],{"class":718,"line":719},[236,13515,2043],{"class":736},[236,13517,13518],{"class":2046},"h1",[236,13520,2131],{"class":726},[236,13522,2053],{"class":722},[236,13524,13525],{"class":752},"\"xl-red-font\"",[236,13527,13528],{"class":736},">Makes this text large and red\u003C\u002F",[236,13530,13518],{"class":2046},[236,13532,2186],{"class":736},[11,13534,13535],{},"If we wanted this header text to be shown as a gigantic red font, the entire rule would be as follows:",[708,13537,13539],{"className":13427,"code":13538,"language":13429,"meta":15,"style":15},".xl-red-font {\n    color: red;\n    font-size: 1090px;\n}\n",[714,13540,13541,13557,13565,13578],{"__ignoreMap":15},[236,13542,13543,13546,13549,13552,13554],{"class":718,"line":719},[236,13544,13545],{"class":736},".xl",[236,13547,13548],{"class":722},"-",[236,13550,13551],{"class":736},"red",[236,13553,13548],{"class":722},[236,13555,13556],{"class":736},"font {\n",[236,13558,13559,13562],{"class":718,"line":542},[236,13560,13561],{"class":1890},"    color",[236,13563,13564],{"class":736},": red;\n",[236,13566,13567,13570,13572,13575],{"class":718,"line":16},[236,13568,13569],{"class":736},"    font",[236,13571,13548],{"class":722},[236,13573,13574],{"class":1890},"size",[236,13576,13577],{"class":736},": 1090px;\n",[236,13579,13580],{"class":718,"line":571},[236,13581,13582],{"class":736},"}\n",[11,13584,13585],{},"The CSS selector is the “.xl-red-font” part that appears in the HTML, specifying which element should be selected - hence its name. The declaration lives within the curly braces and sets the visual style. In this case, it’s big and red!",[63,13587,13589],{"id":13588},"what-is-a-css-attribute-selector","What is a CSS attribute selector?",[11,13591,13592,13593,767,13596,13599],{},"These selectors allow you to choose elements based on their HTML attributes. Much like with CSS, HTML is split into component parts. In this case we can think of HTML as consisting of ",[5314,13594,13595],{},"elements",[5314,13597,13598],{},"attributes",". The element is the type of HTML entity to render, such as a link (”a”) or a button (”button”) or a header (”h1”, “h2” etc.). The attributes are everything else.",[11,13601,13602],{},"The following example HTML specifies an “input” element with a number of attributes - “class”, “autocapitalize”, “autocomplete” etc. are all HTML attributes.",[708,13604,13606],{"className":3195,"code":13605,"language":3197,"meta":15,"style":15},"\u003Cinput class=\"\" autocapitalize=\"none\" autocomplete=\"off\" autocorrect=\"off\" id=\"react-select-choose-a-tone-input\" spellcheck=\"false\" tabindex=\"0\" type=\"text\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-haspopup=\"true\" aria-label=\"choose-a-tone\" aria-labelledby=\"choose-a-tone\" role=\"combobox\" value=\"\" style=\"color: inherit; background: 0px center; opacity: 1; width: 100%; grid-area: 1 \u002F 2 \u002F auto \u002F auto; font: inherit; min-width: 2px; border: 0px; margin: 0px; outline: 0px; padding: 0px;\">\n",[714,13607,13608],{"__ignoreMap":15},[236,13609,13610,13612,13614,13617,13620,13623,13626,13629,13632,13635,13638,13641,13644,13647,13650,13653,13656,13658,13660,13663,13666,13669,13672,13675,13678,13681],{"class":718,"line":719},[236,13611,2043],{"class":736},[236,13613,2047],{"class":2046},[236,13615,13616],{"class":736}," class=\"\" autocapitalize=\"none\" autocomplete=\"off\" autocorrect=\"off\" id=\"",[236,13618,13619],{"class":2046},"react-select-choose-a-tone-input",[236,13621,13622],{"class":736},"\" spellcheck=\"false\" tabindex=\"0\" type=\"text\" ",[236,13624,13625],{"class":2046},"aria-autocomplete",[236,13627,13628],{"class":736},"=\"list\" ",[236,13630,13631],{"class":2046},"aria-expanded",[236,13633,13634],{"class":736},"=\"false\" ",[236,13636,13637],{"class":2046},"aria-haspopup",[236,13639,13640],{"class":736},"=\"true\" ",[236,13642,13643],{"class":2046},"aria-label",[236,13645,13646],{"class":736},"=\"",[236,13648,13649],{"class":2046},"choose-a-tone",[236,13651,13652],{"class":736},"\" ",[236,13654,13655],{"class":2046},"aria-labelledby",[236,13657,13646],{"class":736},[236,13659,13649],{"class":2046},[236,13661,13662],{"class":736},"\" role=\"combobox\" value=\"\" style=\"color: inherit; background: 0px center; opacity: 1; width: 100%; ",[236,13664,13665],{"class":2046},"grid-area",[236,13667,13668],{"class":736},": 1 \u002F 2 \u002F auto \u002F auto; ",[236,13670,13671],{"class":2046},"font",[236,13673,13674],{"class":736},": inherit; ",[236,13676,13677],{"class":2046},"min-width",[236,13679,13680],{"class":736},": 2px; border: 0px; margin: 0px; outline: 0px; padding: 0px;\"",[236,13682,2186],{"class":722},[11,13684,13685],{},"In order to create an attribute selector, simply take the attribute as it appears in the HTML and wrap it in square brackets. That’s it!",[708,13687,13689],{"className":3195,"code":13688,"language":3197,"meta":15,"style":15},"[aria-labelledby=\"choose-a-tone\"]\n",[714,13690,13691],{"__ignoreMap":15},[236,13692,13693,13695,13697,13699,13702],{"class":718,"line":719},[236,13694,3075],{"class":736},[236,13696,13655],{"class":726},[236,13698,2053],{"class":722},[236,13700,13701],{"class":752},"\"choose-a-tone\"",[236,13703,3085],{"class":736},[11,13705,13706],{},"When choosing an attribute to select on, make sure you choose one that uniquely specifies the element you want - otherwise you might end up with the wrong element. In the above example, the “aria-labelledby” attribute is a unique selector that is only present on this element.",[11,13708,13709],{},"Identifying the right attribute can be a bit of an art, but when they contain human-readable text (as above) it’s a lot easier.",[11,13711,13712],{},"Because these selectors contain human readable text, they can often be very useful! For example, Google Maps contains zip codes as attribute selectors in its HTML, which lets you find locations there very conveniently.",[63,13714,13716],{"id":13715},"are-there-other-kinds-of-css-selectors","Are there other kinds of CSS selectors?",[11,13718,13719],{},"There are many other types of CSS selectors, including the ones listed below. Often when constructing a selector, you will use one or more of these selectors in combination with an Attribute selector.",[129,13721,13723],{"id":13722},"the-css-element-selector","The CSS element Selector",[11,13725,13726],{},"We’ve already met elements, and the element selector allows you to target all elements which share a tag name.",[11,13728,13729],{},"Example of HTML element selectors:",[708,13731,13733],{"className":3195,"code":13732,"language":3197,"meta":15,"style":15},"\u003Ch1>,\u003Cspan>,\u003Cdiv>,\u003Cstrong>,\u003Ca>,\u003Cinput>,\u003Cbutton>\n",[714,13734,13735],{"__ignoreMap":15},[236,13736,13737,13739,13741,13743,13746,13748,13750,13752,13754,13756,13758,13760,13762,13764,13766,13768,13770,13772,13774,13776,13779],{"class":718,"line":719},[236,13738,2043],{"class":736},[236,13740,13518],{"class":2046},[236,13742,2199],{"class":722},[236,13744,13745],{"class":736},",\u003C",[236,13747,236],{"class":2046},[236,13749,2199],{"class":722},[236,13751,13745],{"class":736},[236,13753,2149],{"class":2046},[236,13755,2199],{"class":722},[236,13757,13745],{"class":736},[236,13759,49],{"class":2046},[236,13761,2199],{"class":722},[236,13763,13745],{"class":736},[236,13765,39],{"class":2046},[236,13767,2199],{"class":722},[236,13769,13745],{"class":736},[236,13771,2047],{"class":2046},[236,13773,2199],{"class":722},[236,13775,13745],{"class":736},[236,13777,13778],{"class":2046},"button",[236,13780,2186],{"class":722},[11,13782,13783],{},"In order to specify an element selector, just use the name of the element tag (without any attributes or angle brackets).",[11,13785,13786],{},"For example, the above elements can be selected like this:",[708,13788,13790],{"className":3195,"code":13789,"language":3197,"meta":15,"style":15},"h1,span,div,strong,a,input,button\n",[714,13791,13792],{"__ignoreMap":15},[236,13793,13794,13796,13798,13800,13802,13804,13806,13808,13810,13812,13814,13816,13818],{"class":718,"line":719},[236,13795,13518],{"class":2046},[236,13797,4948],{"class":736},[236,13799,236],{"class":2046},[236,13801,4948],{"class":736},[236,13803,2149],{"class":2046},[236,13805,4948],{"class":736},[236,13807,49],{"class":2046},[236,13809,4948],{"class":736},[236,13811,39],{"class":2046},[236,13813,4948],{"class":736},[236,13815,2047],{"class":2046},[236,13817,4948],{"class":736},[236,13819,13820],{"class":2046},"button\n",[129,13822,13824],{"id":13823},"the-css-id-selector","The CSS id Selector",[11,13826,13827],{},"The id attribute gives an HTML element a name that can be used to reference the element from other parts of the document, or from external documents. The name must be unique within the HTML document.",[11,13829,13830],{},"Here’s some example HTML with an id specified:",[708,13832,13834],{"className":3195,"code":13833,"language":3197,"meta":15,"style":15},"\u003Ch1 id=\"page-title\"> Browser automation is so cool\u003C\u002Fh1>\n",[714,13835,13836],{"__ignoreMap":15},[236,13837,13838,13840,13842,13845,13848,13851,13853,13856,13858],{"class":718,"line":719},[236,13839,2043],{"class":736},[236,13841,13518],{"class":2046},[236,13843,13844],{"class":736}," id=\"",[236,13846,13847],{"class":2046},"page-title",[236,13849,13850],{"class":736},"\"",[236,13852,2199],{"class":722},[236,13854,13855],{"class":736}," Browser automation is so cool\u003C\u002F",[236,13857,13518],{"class":2046},[236,13859,2186],{"class":722},[11,13861,13862,13863,13866],{},"The id attribute has some special convenient syntax. Instead of typing ",[236,13864,13865],{},"id=”page-title”",", you can use a # instead, like this:",[708,13868,13870],{"className":3195,"code":13869,"language":3197,"meta":15,"style":15},"#page-title\n",[714,13871,13872],{"__ignoreMap":15},[236,13873,13874],{"class":718,"line":719},[236,13875,13869],{"class":726},[129,13877,13879],{"id":13878},"the-css-class-selector","The CSS class Selector",[11,13881,13882],{},"The class attribute tags an HTML element with a re-usable name that can be used to identify it and similar elements like it. They are usually not unique within a document, but specify a set of related elements.",[11,13884,13885],{},"Here’s some HTML with a class specified:",[708,13887,13889],{"className":3195,"code":13888,"language":3197,"meta":15,"style":15},"\u003Ch1 class=\"page-title\"> Browser automation is so cool\u003C\u002Fh1>\n",[714,13890,13891],{"__ignoreMap":15},[236,13892,13893,13895,13897,13900,13902,13904,13906,13908,13910],{"class":718,"line":719},[236,13894,2043],{"class":736},[236,13896,13518],{"class":2046},[236,13898,13899],{"class":736}," class=\"",[236,13901,13847],{"class":2046},[236,13903,13850],{"class":736},[236,13905,2199],{"class":722},[236,13907,13855],{"class":736},[236,13909,13518],{"class":2046},[236,13911,2186],{"class":722},[11,13913,13914,13915,13918],{},"Similarly to the id attribute, instead of using the usual ",[236,13916,13917],{},"class=”page-title”"," syntax you can use a dot:",[708,13920,13922],{"className":3195,"code":13921,"language":3197,"meta":15,"style":15},".page-title\n",[714,13923,13924],{"__ignoreMap":15},[236,13925,13926],{"class":718,"line":719},[236,13927,13921],{"class":726},[11,13929,13930],{},"To learn more about this topic, you can check out the following resource:",[11,13932,13933],{},[39,13934,13935],{"href":13935,"rel":13936},"https:\u002F\u002Fwww.w3schools.com\u002Fcss\u002Fcss_selectors.asp",[43],[11,13938,13939],{},[39,13940,13941],{"href":13941,"rel":13942},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FLearn\u002FCSS\u002FBuilding_blocks\u002FSelectors",[43],[11,13944,13945],{},[39,13946,13947],{"href":13947,"rel":13948},"http:\u002F\u002Fweb.simmons.edu\u002F~grabiner\u002Fcomm244\u002Fweekfour\u002Fselectors",[43],[63,13950,13952],{"id":13951},"attribute-selectors-can-be-combined-with-other-css-selectors","Attribute selectors can be combined with other CSS selectors",[11,13954,13955],{},"It can be very handy to combine attribute selectors in combination with other kinds of selectors. Doing this allows you to create more precise rules that target just that one element you want from a page, without pulling in any others.",[129,13957,13959],{"id":13958},"linkedin-in-pager-button","LinkedIn in pager button",[11,13961,13962],{},"Here is the HTML from a LinkedIn pager button:",[708,13964,13966],{"className":2033,"code":13965,"language":2035,"meta":15,"style":15},"\u003Cbutton aria-label=\"Next\" id=\"ember1951\" class=\"artdeco-pagination__button artdeco-pagination__button--next artdeco-button artdeco-button--muted artdeco-button--icon-right artdeco-button--1 artdeco-button--tertiary ember-view\" type=\"button\">  \u003Cli-icon aria-hidden=\"true\" type=\"chevron-right-icon\" class=\"artdeco-button__icon\" size=\"small\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 16 16\" class=\"mercado-match\" data-supported-dps=\"16x16\" fill=\"currentColor\" width=\"16\" height=\"16\" focusable=\"false\">\n  \u003Cpath d=\"M5 15l4.61-7L5 1h2.39L12 8l-4.61 7z\">\u003C\u002Fpath>\n\u003C\u002Fsvg>\u003C\u002Fli-icon>\n\n\u003Cspan class=\"artdeco-button__text\">\n    Next\n\u003C\u002Fspan>\u003C\u002Fbutton>\n",[714,13967,13968,14106,14128,14141,14145,14160,14165],{"__ignoreMap":15},[236,13969,13970,13972,13974,13976,13978,13981,13983,13985,13988,13990,13992,13995,13997,13999,14002,14005,14008,14011,14013,14016,14018,14020,14023,14025,14027,14030,14033,14035,14038,14040,14043,14046,14048,14051,14054,14056,14059,14061,14063,14066,14069,14071,14074,14077,14079,14082,14085,14087,14090,14093,14095,14097,14100,14102,14104],{"class":718,"line":719},[236,13971,2043],{"class":736},[236,13973,13778],{"class":2046},[236,13975,2407],{"class":726},[236,13977,2053],{"class":736},[236,13979,13980],{"class":752},"\"Next\"",[236,13982,2099],{"class":726},[236,13984,2053],{"class":736},[236,13986,13987],{"class":752},"\"ember1951\"",[236,13989,2131],{"class":726},[236,13991,2053],{"class":736},[236,13993,13994],{"class":752},"\"artdeco-pagination__button artdeco-pagination__button--next artdeco-button artdeco-button--muted artdeco-button--icon-right artdeco-button--1 artdeco-button--tertiary ember-view\"",[236,13996,2444],{"class":726},[236,13998,2053],{"class":736},[236,14000,14001],{"class":752},"\"button\"",[236,14003,14004],{"class":736},">  \u003C",[236,14006,14007],{"class":2046},"li-icon",[236,14009,14010],{"class":726}," aria-hidden",[236,14012,2053],{"class":736},[236,14014,14015],{"class":752},"\"true\"",[236,14017,2444],{"class":726},[236,14019,2053],{"class":736},[236,14021,14022],{"class":752},"\"chevron-right-icon\"",[236,14024,2131],{"class":726},[236,14026,2053],{"class":736},[236,14028,14029],{"class":752},"\"artdeco-button__icon\"",[236,14031,14032],{"class":726}," size",[236,14034,2053],{"class":736},[236,14036,14037],{"class":752},"\"small\"",[236,14039,2146],{"class":736},[236,14041,14042],{"class":2046},"svg",[236,14044,14045],{"class":726}," xmlns",[236,14047,2053],{"class":736},[236,14049,14050],{"class":752},"\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\"",[236,14052,14053],{"class":726}," viewBox",[236,14055,2053],{"class":736},[236,14057,14058],{"class":752},"\"0 0 16 16\"",[236,14060,2131],{"class":726},[236,14062,2053],{"class":736},[236,14064,14065],{"class":752},"\"mercado-match\"",[236,14067,14068],{"class":726}," data-supported-dps",[236,14070,2053],{"class":736},[236,14072,14073],{"class":752},"\"16x16\"",[236,14075,14076],{"class":726}," fill",[236,14078,2053],{"class":736},[236,14080,14081],{"class":752},"\"currentColor\"",[236,14083,14084],{"class":726}," width",[236,14086,2053],{"class":736},[236,14088,14089],{"class":752},"\"16\"",[236,14091,14092],{"class":726}," height",[236,14094,2053],{"class":736},[236,14096,14089],{"class":752},[236,14098,14099],{"class":726}," focusable",[236,14101,2053],{"class":736},[236,14103,2080],{"class":752},[236,14105,2186],{"class":736},[236,14107,14108,14111,14114,14117,14119,14122,14124,14126],{"class":718,"line":542},[236,14109,14110],{"class":736},"  \u003C",[236,14112,14113],{"class":2046},"path",[236,14115,14116],{"class":726}," d",[236,14118,2053],{"class":736},[236,14120,14121],{"class":752},"\"M5 15l4.61-7L5 1h2.39L12 8l-4.61 7z\"",[236,14123,2180],{"class":736},[236,14125,14113],{"class":2046},[236,14127,2186],{"class":736},[236,14129,14130,14133,14135,14137,14139],{"class":718,"line":16},[236,14131,14132],{"class":736},"\u003C\u002F",[236,14134,14042],{"class":2046},[236,14136,2180],{"class":736},[236,14138,14007],{"class":2046},[236,14140,2186],{"class":736},[236,14142,14143],{"class":718,"line":571},[236,14144,1043],{"emptyLinePlaceholder":24},[236,14146,14147,14149,14151,14153,14155,14158],{"class":718,"line":961},[236,14148,2043],{"class":736},[236,14150,236],{"class":2046},[236,14152,2131],{"class":726},[236,14154,2053],{"class":736},[236,14156,14157],{"class":752},"\"artdeco-button__text\"",[236,14159,2186],{"class":736},[236,14161,14162],{"class":718,"line":982},[236,14163,14164],{"class":736},"    Next\n",[236,14166,14167,14169,14171,14173,14175],{"class":718,"line":988},[236,14168,14132],{"class":736},[236,14170,236],{"class":2046},[236,14172,2180],{"class":736},[236,14174,13778],{"class":2046},[236,14176,2186],{"class":736},[11,14178,14179],{},"We could extract the following attribute ‘aria-label=\"Next\"’ to make this selector. The aria-label attribute seems to be human readable text, so it looks like a great choice for identifying that “Next” button.",[11,14181,14182],{},"We can then combine this with other selectors to make sure we have exactly the element we want. Here are a couple of examples of this in action:",[708,14184,14186],{"className":3195,"code":14185,"language":3197,"meta":15,"style":15},"button[aria-label=\"Next\"]\n\n.artdeco-pagination__button[aria-label=\"Next\"]\n",[714,14187,14188,14202,14206],{"__ignoreMap":15},[236,14189,14190,14192,14194,14196,14198,14200],{"class":718,"line":719},[236,14191,13778],{"class":2046},[236,14193,3075],{"class":736},[236,14195,13643],{"class":726},[236,14197,2053],{"class":722},[236,14199,13980],{"class":752},[236,14201,3085],{"class":736},[236,14203,14204],{"class":718,"line":542},[236,14205,1043],{"emptyLinePlaceholder":24},[236,14207,14208,14211,14213,14215,14217,14219],{"class":718,"line":16},[236,14209,14210],{"class":726},".artdeco-pagination__button",[236,14212,3075],{"class":736},[236,14214,13643],{"class":726},[236,14216,2053],{"class":722},[236,14218,13980],{"class":752},[236,14220,3085],{"class":736},[129,14222,14224],{"id":14223},"facebook-group","Facebook group",[11,14226,14227],{},"Below is the outer wrapper div from an article from a Facebook Group page.",[708,14229,14231],{"className":3195,"code":14230,"language":3197,"meta":15,"style":15},"\u003Cdiv aria-describedby=\"jsc_c_jb jsc_c_jc jsc_c_jd jsc_c_jf jsc_c_je\" \naria-labelledby=\"jsc_c_ja\" class=\"lzcic4wl\" role=\"article\">\n",[714,14232,14233,14245],{"__ignoreMap":15},[236,14234,14235,14237,14239,14242],{"class":718,"line":719},[236,14236,2043],{"class":736},[236,14238,2149],{"class":2046},[236,14240,14241],{"class":2046}," aria-describedby",[236,14243,14244],{"class":736},"=\"jsc_c_jb jsc_c_jc jsc_c_jd jsc_c_jf jsc_c_je\" \n",[236,14246,14247,14249,14252],{"class":718,"line":542},[236,14248,13655],{"class":2046},[236,14250,14251],{"class":736},"=\"jsc_c_ja\" class=\"lzcic4wl\" role=\"article\"",[236,14253,2186],{"class":722},[11,14255,14256],{},"We could use ‘role=\"article\"’ to target elements in the Article. The selector below would extract the name of the author. In this example we have combined four selectors: an element, an attribute, and then two more elements.",[708,14258,14260],{"className":3195,"code":14259,"language":3197,"meta":15,"style":15},"div[role=\"article\"] a strong\n",[714,14261,14262],{"__ignoreMap":15},[236,14263,14264,14266,14268,14271,14273,14276,14279,14281],{"class":718,"line":719},[236,14265,2149],{"class":2046},[236,14267,3075],{"class":736},[236,14269,14270],{"class":726},"role",[236,14272,2053],{"class":722},[236,14274,14275],{"class":752},"\"article\"",[236,14277,14278],{"class":736},"] ",[236,14280,39],{"class":2046},[236,14282,14283],{"class":2046}," strong\n",[11,14285,14286,14287,14290],{},"Here, the spaces indicate that the “a” and “strong” elements are ",[5314,14288,14289],{},"children"," of the div with the attribute role=”article”. This means that the selector will look for an “a” element, inside a “strong” element, inside a “div” element with the attribute role=”article”.",[63,14292,14294],{"id":14293},"how-do-i-find-selectors-on-a-web-page","How do I find selectors on a web page?",[11,14296,14297],{},"Google Chrome has a built-in tool for inspecting the webpage that makes this easy. Web developers like to show off by making it seem like magic, but it's actually pretty simple to learn! Here's a short video that shows you how it works.",[11,14299,14300],{},"💡 To search for anything on a web page, right-click on an element and select Inspect. This will open Developer Tools. Then use Ctrl+F or Command+F to search for anything within the source code of the page.",[11,14302,14303,14304,13],{},"Learn more about Chrome Developer tools and the ",[39,14305,14308],{"href":14306,"rel":14307},"https:\u002F\u002Fwww.hostinger.co.uk\u002Ftutorials\u002Fwebsite\u002Fhow-to-inspect-and-change-style-using-google-chrome",[43],"web inspector",[63,14310,14312],{"id":14311},"how-do-you-define-your-own-css-selectors","How do you define your own CSS selectors?",[11,14314,14315],{},"Here are three methods for generating custom selectors. Ultimately, you will want to master the art of combining these methods.",[129,14317,14319],{"id":14318},"_1-identify-a-selector-unique-to-the-element-you-want","1. Identify a selector unique to the element you want",[11,14321,14322],{},"Look for selectors that are unique to the element. If it has a unique attribute, use that.",[11,14324,14325],{},"For example, if you wanted to click the Tweet button on my Twitter feed, here's the HTML:",[708,14327,14329],{"className":3195,"code":14328,"language":3197,"meta":15,"style":15},"\u003Cdiv role=\"button\" class=\"css-18t94o4 css-1dbjc4n r-l5o3uw r-42olwf r-sdzlij r-1phboty r-rs99b7 r-19u6a5r r-2yi16 r-1qi8awa r-1ny4l3l r-ymttw5 r-o7ynqc r-6416eg r-lrvibr\" \ndata-testid=\"tweetButtonInline\" tabindex=\"0\">\u003Cdiv dir=\"auto\" class=\"css-901oao r-1awozwy r-jwli3a r-6koalj r-18u37iz r-16y2uox r-37j5jr r-a023e6 r-b88u0q r-1777fci r-rjixqe r-bcqeeo r-q4m81j r-qvutc0\">\n\u003Cspan class=\"css-901oao css-16my406 css-bfa6kz r-poiln3 r-a023e6 r-rjixqe r-bcqeeo r-qvutc0\">\u003Cspan class=\"css-901oao css-16my406 r-poiln3 r-bcqeeo r-qvutc0\">Tweet\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fdiv>\n",[714,14330,14331,14388,14450],{"__ignoreMap":15},[236,14332,14333,14335,14337,14340,14343,14346,14349,14352,14355,14358,14361,14364,14367,14370,14373,14376,14379,14382,14385],{"class":718,"line":719},[236,14334,2043],{"class":736},[236,14336,2149],{"class":2046},[236,14338,14339],{"class":736}," role=\"button\" class=\"",[236,14341,14342],{"class":2046},"css-18t94o4",[236,14344,14345],{"class":2046}," css-1dbjc4n",[236,14347,14348],{"class":2046}," r-l5o3uw",[236,14350,14351],{"class":2046}," r-42olwf",[236,14353,14354],{"class":2046}," r-sdzlij",[236,14356,14357],{"class":2046}," r-1phboty",[236,14359,14360],{"class":2046}," r-rs99b7",[236,14362,14363],{"class":2046}," r-19u6a5r",[236,14365,14366],{"class":2046}," r-2yi16",[236,14368,14369],{"class":2046}," r-1qi8awa",[236,14371,14372],{"class":2046}," r-1ny4l3l",[236,14374,14375],{"class":2046}," r-ymttw5",[236,14377,14378],{"class":2046}," r-o7ynqc",[236,14380,14381],{"class":2046}," r-6416eg",[236,14383,14384],{"class":2046}," r-lrvibr",[236,14386,14387],{"class":736},"\" \n",[236,14389,14390,14392,14395,14397,14399,14401,14404,14407,14410,14413,14416,14419,14422,14425,14428,14431,14434,14437,14440,14443,14446,14448],{"class":718,"line":542},[236,14391,3078],{"class":2046},[236,14393,14394],{"class":736},"=\"tweetButtonInline\" tabindex=\"0\"",[236,14396,2199],{"class":722},[236,14398,2043],{"class":736},[236,14400,2149],{"class":2046},[236,14402,14403],{"class":736}," dir=\"auto\" class=\"",[236,14405,14406],{"class":2046},"css-901oao",[236,14408,14409],{"class":2046}," r-1awozwy",[236,14411,14412],{"class":2046}," r-jwli3a",[236,14414,14415],{"class":2046}," r-6koalj",[236,14417,14418],{"class":2046}," r-18u37iz",[236,14420,14421],{"class":2046}," r-16y2uox",[236,14423,14424],{"class":2046}," r-37j5jr",[236,14426,14427],{"class":2046}," r-a023e6",[236,14429,14430],{"class":2046}," r-b88u0q",[236,14432,14433],{"class":2046}," r-1777fci",[236,14435,14436],{"class":2046}," r-rjixqe",[236,14438,14439],{"class":2046}," r-bcqeeo",[236,14441,14442],{"class":2046}," r-q4m81j",[236,14444,14445],{"class":2046}," r-qvutc0",[236,14447,13850],{"class":736},[236,14449,2186],{"class":722},[236,14451,14452,14454,14456,14458,14460,14463,14466,14469,14471,14473,14475,14477,14479,14481,14483,14485,14487,14489,14491,14493,14495,14497,14499,14501,14504,14506,14508,14510,14512,14514,14516,14518,14520,14522,14524],{"class":718,"line":16},[236,14453,2043],{"class":736},[236,14455,236],{"class":2046},[236,14457,13899],{"class":736},[236,14459,14406],{"class":2046},[236,14461,14462],{"class":2046}," css-16my406",[236,14464,14465],{"class":2046}," css-bfa6kz",[236,14467,14468],{"class":2046}," r-poiln3",[236,14470,14427],{"class":2046},[236,14472,14436],{"class":2046},[236,14474,14439],{"class":2046},[236,14476,14445],{"class":2046},[236,14478,13850],{"class":736},[236,14480,2199],{"class":722},[236,14482,2043],{"class":736},[236,14484,236],{"class":2046},[236,14486,13899],{"class":736},[236,14488,14406],{"class":2046},[236,14490,14462],{"class":2046},[236,14492,14468],{"class":2046},[236,14494,14439],{"class":2046},[236,14496,14445],{"class":2046},[236,14498,13850],{"class":736},[236,14500,2199],{"class":722},[236,14502,14503],{"class":736},"Tweet\u003C\u002F",[236,14505,236],{"class":2046},[236,14507,2199],{"class":722},[236,14509,14132],{"class":736},[236,14511,236],{"class":2046},[236,14513,2199],{"class":722},[236,14515,14132],{"class":736},[236,14517,2149],{"class":2046},[236,14519,2199],{"class":722},[236,14521,14132],{"class":736},[236,14523,2149],{"class":2046},[236,14525,2186],{"class":722},[11,14527,14528],{},"We would use the div element with an attribute selector.",[708,14530,14532],{"className":3195,"code":14531,"language":3197,"meta":15,"style":15},"div[data-testid=\"tweetButtonInline\"]\n",[714,14533,14534],{"__ignoreMap":15},[236,14535,14536,14538,14540,14542,14544,14547],{"class":718,"line":719},[236,14537,2149],{"class":2046},[236,14539,3075],{"class":736},[236,14541,3078],{"class":726},[236,14543,2053],{"class":722},[236,14545,14546],{"class":752},"\"tweetButtonInline\"",[236,14548,3085],{"class":736},[11,14550,14551],{},"Sometimes, websites strip out unique selectors to make them more difficult to scrape. If this is the case for your target site, you’ll need to use more devious methods….",[129,14553,14555],{"id":14554},"_2-find-a-unique-grouping-selector","2. Find a unique grouping selector",[11,14557,14558],{},"All HTML is ordered in a hierarchy. This means you can often find the element you want by finding a parent, i.e. an element which wraps around and contains your desired target.",[11,14560,14561],{},"For example, if you wanted to scrape the related trends from Google Trends search, you will see that the related trends are grouped in a block of HTML that defines a widget. First, you find a unique selector for that widget:",[708,14563,14565],{"className":3195,"code":14564,"language":3197,"meta":15,"style":15},"\u003Cwidget type=\"fe_related_queries\" version=\"1\" template=\"fe\" on-event=\"onEvent({'event': event})\" embed=\"embed\" share=\"share\" export=\"export\" explore-query=\"exploreQuery\" fields=\"[\n        {'name': 'topic', 'value': title},\n        {'name': 'color', 'value': color}\n    ]\" apis=\"[\n        {\n          'name': 'fe_relatedsearches',\n          'url': config.pathPrefix + '\u002Fapi\u002Fwidgetdata\u002Frelatedsearches',\n          'params': {'req': request, 'token': token}\n        }\n    ]\" story-title=\"storyTitle\" story-country=\"storyCountry\" story-time-range=\"storyTimeRange\" show-mode-picker=\"true\" palette=\"palette\" forced-color=\"\" help-dialog=\"helpDialog\" widget-name=\"widgetName\" ve-tracking=\"\" jslog=\"39387; track:impression\">\u003C!---->\n",[714,14566,14567,14590,14612,14630,14635,14640,14652,14665,14685,14690],{"__ignoreMap":15},[236,14568,14569,14572,14575,14578,14581,14584,14587],{"class":718,"line":719},[236,14570,14571],{"class":736},"\u003Cwidget type=\"fe_related_queries\" version=\"1\" template=\"fe\" ",[236,14573,14574],{"class":2046},"on-event",[236,14576,14577],{"class":736},"=\"onEvent({'",[236,14579,14580],{"class":726},"event",[236,14582,14583],{"class":736},"': event})\" embed=\"embed\" share=\"share\" export=\"export\" ",[236,14585,14586],{"class":2046},"explore-query",[236,14588,14589],{"class":736},"=\"exploreQuery\" fields=\"[\n",[236,14591,14592,14595,14598,14601,14604,14606,14609],{"class":718,"line":542},[236,14593,14594],{"class":736},"        {",[236,14596,14597],{"class":752},"'name'",[236,14599,14600],{"class":736},": ",[236,14602,14603],{"class":752},"'topic'",[236,14605,1140],{"class":736},[236,14607,14608],{"class":752},"'value'",[236,14610,14611],{"class":736},": title},\n",[236,14613,14614,14616,14618,14620,14623,14625,14627],{"class":718,"line":16},[236,14615,14594],{"class":736},[236,14617,14597],{"class":752},[236,14619,14600],{"class":736},[236,14621,14622],{"class":752},"'color'",[236,14624,1140],{"class":736},[236,14626,14608],{"class":752},[236,14628,14629],{"class":736},": color}\n",[236,14631,14632],{"class":718,"line":571},[236,14633,14634],{"class":736},"    ]\" apis=\"[\n",[236,14636,14637],{"class":718,"line":961},[236,14638,14639],{"class":736},"        {\n",[236,14641,14642,14645,14647,14650],{"class":718,"line":982},[236,14643,14644],{"class":752},"          'name'",[236,14646,14600],{"class":736},[236,14648,14649],{"class":752},"'fe_relatedsearches'",[236,14651,9982],{"class":736},[236,14653,14654,14657,14660,14663],{"class":718,"line":988},[236,14655,14656],{"class":752},"          'url'",[236,14658,14659],{"class":736},": config.pathPrefix + ",[236,14661,14662],{"class":752},"'\u002Fapi\u002Fwidgetdata\u002Frelatedsearches'",[236,14664,9982],{"class":736},[236,14666,14667,14670,14673,14676,14679,14682],{"class":718,"line":1015},[236,14668,14669],{"class":752},"          'params'",[236,14671,14672],{"class":736},": {",[236,14674,14675],{"class":752},"'req'",[236,14677,14678],{"class":736},": request, ",[236,14680,14681],{"class":752},"'token'",[236,14683,14684],{"class":736},": token}\n",[236,14686,14687],{"class":718,"line":1021},[236,14688,14689],{"class":736},"        }\n",[236,14691,14692,14695,14698,14701,14704,14707,14710,14713,14716,14719,14722,14725,14728,14731,14734,14737,14740,14743,14746,14749,14751,14754],{"class":718,"line":1040},[236,14693,14694],{"class":736},"    ]\" ",[236,14696,14697],{"class":2046},"story-title",[236,14699,14700],{"class":736},"=\"storyTitle\" ",[236,14702,14703],{"class":2046},"story-country",[236,14705,14706],{"class":736},"=\"storyCountry\" ",[236,14708,14709],{"class":2046},"story-time-range",[236,14711,14712],{"class":736},"=\"storyTimeRange\" ",[236,14714,14715],{"class":2046},"show-mode-picker",[236,14717,14718],{"class":736},"=\"true\" palette=\"palette\" ",[236,14720,14721],{"class":2046},"forced-color",[236,14723,14724],{"class":736},"=\"\" ",[236,14726,14727],{"class":2046},"help-dialog",[236,14729,14730],{"class":736},"=\"helpDialog\" ",[236,14732,14733],{"class":2046},"widget-name",[236,14735,14736],{"class":736},"=\"widgetName\" ",[236,14738,14739],{"class":2046},"ve-tracking",[236,14741,14742],{"class":736},"=\"\" jslog=\"39387; ",[236,14744,14745],{"class":2046},"track",[236,14747,14748],{"class":736},":impression\"",[236,14750,2199],{"class":722},[236,14752,14753],{"class":736},"\u003C!----",[236,14755,2186],{"class":722},[11,14757,14758],{},"In this case, you can use the element ‘widget’ and the following attribute selector:",[708,14760,14762],{"className":3195,"code":14761,"language":3197,"meta":15,"style":15},"widget[type=\"fe_related_queries\"]\n",[714,14763,14764],{"__ignoreMap":15},[236,14765,14766,14769,14771,14773,14776],{"class":718,"line":719},[236,14767,14768],{"class":736},"widget[",[236,14770,1104],{"class":726},[236,14772,2053],{"class":722},[236,14774,14775],{"class":752},"\"fe_related_queries\"",[236,14777,3085],{"class":736},[11,14779,14780],{},"Then to scrape the topics we can add an “a” element selector, separated by a space, to find the “a” element within the widget HTML.",[708,14782,14784],{"className":3195,"code":14783,"language":3197,"meta":15,"style":15},"widget[type=\"fe_related_queries\"] a\n\n",[714,14785,14786],{"__ignoreMap":15},[236,14787,14788,14790,14792,14794,14796,14798],{"class":718,"line":719},[236,14789,14768],{"class":736},[236,14791,1104],{"class":726},[236,14793,2053],{"class":722},[236,14795,14775],{"class":752},[236,14797,14278],{"class":736},[236,14799,14800],{"class":2046},"a\n",[11,14802,14803],{},"Still, it can be the case that it’s hard to even find a grouping element with a unique selector. So what do we do then?",[129,14805,14807],{"id":14806},"_3-look-for-the-unique-positioning-of-your-content-within-the-page","3. Look for the unique positioning of your content within the page",[11,14809,14810],{},"Webpages are made up of different elements, all of which are contained by other elements. Some elements are parents and others children; some elements can be both. Every element occupies exactly one position within this hierarchy, and this can be specified uniquely with a selector - which means if you can figure out that selector, you can pinpoint your target. Bullseye! 🎯",[11,14812,14813],{},"In this example we want to work out a custom selector to click the like button of the first Instagram post on my feed. Heres the html from that article:",[708,14815,14817],{"className":3195,"code":14816,"language":3197,"meta":15,"style":15},"\u003Carticle class=\" _ab6k _ab6l _ab6m _aatb _aatc _aate _aatf _aath _aati\" role=\"presentation\" tabindex=\"-1\">\u003Cdiv class=\"_ab8w  _ab94 _ab99 _ab9h _ab9m _ab9p _abcm\" style=\"max-height: inherit; max-width: inherit;\">\u003Cdiv class=\"_aasi _aasj\">\u003Cdiv class=\"_ab8w  _ab94 _ab97 _ab9i _ab9k _ab9p _abcm\">\u003Cheader class=\"_aaqw _aaqx\">\u003Cdiv class=\"_aap6 _aap7 _aapa\">\u003Cdiv class=\"_aarf _aarg _aaqq\" aria-disabled=\"false\" role=\"button\" tabindex=\"0\" style=\"cursor: pointer;\">\u003Ccanvas class=\"_aarh\" height=\"84\" width=\"84\" style=\"position: absolute; top: -5px; left: -5px; width: 42px; height: 42px;\">\u003C\u002Fcanvas>\u003Cspan class=\"_aa8h\" role=\"link\" tabindex=\"-1\" style=\"width: 32px; height: 32px;\">\u003Cimg alt=\"zoeandbrodsforeheadkisses's profile picture\" class=\"_aa8j\" crossorigin=\"anonymous\" draggable=\"false\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"_aaqy _aaq-\">\u003Cdiv class=\" _aar1\">\u003Cdiv class=\"_aaqt\">\u003Cdiv class=\"_ab8w  _ab94 _ab97 _ab9f _ab9k _ab9p _abcm\">\u003Cdiv class=\"_aacl _aaco _aacw _aacx _aad6 _aade\">\u003Cspan class=\"_aap6 _aap7 _aap8\">\u003Ca class=\"oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz rq0escxv nhd2j8a9 nc684nl6 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys rz4wbd8a qt6c0cv9 a8nywdso i1ao9s8h esuyzwwr f1sip0of lzcic4wl _acan _acao _acat _acaw _a6hd\" href=\"\u002Fzoeandbrodsforeheadkisses\" role=\"link\" tabindex=\"0\">zoeandbrodsforeheadkisses\u003C\u002Fa>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"_aaql\">\u003Cdiv class=\"_aacl _aacn _aacu _aacx _aad6 _aade\">\u003Cdiv>\u003C\u002Fdiv>\u003Cdiv class=\"_aaqm\">\u003Cdiv class=\"_aacl _aacn _aacu _aacy _aada _aade\">\u003Ca class=\"oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz rq0escxv nhd2j8a9 nc684nl6 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys rz4wbd8a qt6c0cv9 a8nywdso i1ao9s8h esuyzwwr f1sip0of lzcic4wl _aaqk _a6hd\" href=\"\u002Fexplore\u002Flocations\u002F235395557\u002Fthredbo-resort\" role=\"link\" tabindex=\"0\">Thredbo Resort\u003C\u002Fa>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fheader>\u003Cdiv class=\"_aasm _aasn\">\u003Cbutton class=\"_abl-\" type=\"button\">\u003Cdiv class=\"_abm0\">\u003Cdiv class=\"_ab8w  _ab94 _ab97 _ab9h _ab9m _ab9p _abcm\" style=\"height: 24px; width: 24px;\">\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"_aatk\">\u003Cdiv class=\"_aamm\">\u003Cdiv class=\"_aamn\">\u003Cdiv class=\"_aami\" style=\"padding-bottom: 125%;\">\u003C\u002Fdiv>\u003Cdiv class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcf _abcg _abch _abck _abcl _abcm\">\u003Cdiv class=\"_aao_\">\u003Cdiv class=\"_aap0\" role=\"presentation\">\u003Cdiv class=\"_aap1\">\u003Cul class=\"_acay\">\u003Cli style=\"transform: translateX(3289px); width: 1px;\">\u003C\u002Fli>\u003Cli class=\"_acaz\" tabindex=\"-1\" style=\"transform: translateX(0px);\">\u003Cdiv class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcm\" style=\"width: 470px;\">\u003Cdiv role=\"button\" class=\"_aa06\" tabindex=\"0\">\u003Cdiv>\u003Cdiv class=\"_aagu _aamh\">\u003Cdiv class=\"_aagv\" style=\"padding-bottom: 125%;\">\u003Cimg alt=\"Photo by Zoe Sandell on July 21, 2022. May be an image of 7 people, people standing, nature and people skiing.\" class=\"_aagt\" crossorigin=\"anonymous\" decoding=\"auto\" sizes=\"470px\" \u003C\u002Fdiv>\u003Cdiv class=\"_aagw\">\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fli>\u003Cli class=\"_acaz\" tabindex=\"-1\" style=\"transform: translateX(470px);\">\u003Cdiv class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcm\" style=\"width: 470px;\">\u003Cdiv role=\"button\" class=\"_aa06\" tabindex=\"0\">\u003Cdiv>\u003Cdiv class=\"_aagu _aamh\">\u003Cdiv class=\"_aagv\" style=\"padding-bottom: 125%;\">\n",[714,14818,14819],{"__ignoreMap":15},[236,14820,14821,14823,14826,14829,14831,14833,14835,14838,14841,14843,14846,14849,14851,14853,14855,14858,14860,14862,14864,14867,14869,14871,14874,14877,14879,14881,14883,14886,14888,14890,14892,14895,14898,14901,14904,14907,14909,14911,14914,14917,14919,14921,14923,14925,14927,14929,14932,14934,14936,14938,14941,14944,14947,14949,14951,14953,14955,14957,14959,14961,14963,14965,14967,14969,14971,14974,14976,14978,14980,14983,14985,14987,14989,14992,14994,14996,14998,15001,15003,15005,15007,15010,15012,15014,15016,15019,15021,15023,15025,15028,15030,15033,15035,15037,15039,15041,15043,15045,15047,15049,15051,15053,15055,15057,15059,15061,15063,15065,15067,15069,15071,15074,15076,15078,15080,15083,15085,15087,15089,15091,15093,15095,15097,15099,15101,15104,15106,15108,15110,15113,15115,15117,15119,15122,15125,15128,15130,15133,15135,15137,15139,15141,15143,15145,15147,15149,15151,15153,15155,15157,15159,15161,15163,15165,15167,15169,15171,15173,15175,15177,15180,15182,15184,15186,15189,15191,15193,15195,15198,15200,15202,15204,15207,15209,15211,15213,15215,15217,15219,15221,15223,15225,15227,15229,15231,15233,15235,15237,15239,15241,15243,15245,15247,15249,15252,15254,15256,15258,15261,15263,15265,15267,15270,15272,15274,15276,15279,15282,15285,15287,15289,15291,15293,15295,15297,15300,15302,15304,15306,15309,15311,15313,15315,15318,15320,15322,15324,15327,15329,15331,15333,15336,15338,15340,15342,15345,15347,15349,15351,15353,15355,15357,15360,15362,15364,15366,15369,15371,15373,15375,15378,15380,15382,15384,15386,15388,15390,15393,15395,15397,15399,15402,15404,15406,15408,15410,15412,15415,15418,15421,15423,15425,15427,15429,15432,15434,15436,15438,15440,15442,15444,15446,15448,15450,15452,15454,15456,15458,15460,15462,15464,15466,15468,15470,15472,15474,15477,15479,15481,15483,15485,15487,15489,15491,15493,15495,15497,15499,15501,15503,15505,15507,15509,15511,15513,15515,15517,15519],{"class":718,"line":719},[236,14822,2043],{"class":736},[236,14824,14825],{"class":2046},"article",[236,14827,14828],{"class":736}," class=\" _ab6k _ab6l _ab6m _aatb _aatc _aate _aatf _aath _aati\" role=\"presentation\" tabindex=\"-1\"",[236,14830,2199],{"class":722},[236,14832,2043],{"class":736},[236,14834,2149],{"class":2046},[236,14836,14837],{"class":736}," class=\"_ab8w  _ab94 _ab99 _ab9h _ab9m _ab9p _abcm\" style=\"",[236,14839,14840],{"class":2046},"max-height",[236,14842,13674],{"class":736},[236,14844,14845],{"class":2046},"max-width",[236,14847,14848],{"class":736},": inherit;\"",[236,14850,2199],{"class":722},[236,14852,2043],{"class":736},[236,14854,2149],{"class":2046},[236,14856,14857],{"class":736}," class=\"_aasi _aasj\"",[236,14859,2199],{"class":722},[236,14861,2043],{"class":736},[236,14863,2149],{"class":2046},[236,14865,14866],{"class":736}," class=\"_ab8w  _ab94 _ab97 _ab9i _ab9k _ab9p _abcm\"",[236,14868,2199],{"class":722},[236,14870,2043],{"class":736},[236,14872,14873],{"class":2046},"header",[236,14875,14876],{"class":736}," class=\"_aaqw _aaqx\"",[236,14878,2199],{"class":722},[236,14880,2043],{"class":736},[236,14882,2149],{"class":2046},[236,14884,14885],{"class":736}," class=\"_aap6 _aap7 _aapa\"",[236,14887,2199],{"class":722},[236,14889,2043],{"class":736},[236,14891,2149],{"class":2046},[236,14893,14894],{"class":736}," class=\"_aarf _aarg _aaqq\" ",[236,14896,14897],{"class":2046},"aria-disabled",[236,14899,14900],{"class":736},"=\"false\" role=\"button\" tabindex=\"0\" style=\"",[236,14902,14903],{"class":2046},"cursor",[236,14905,14906],{"class":736},": pointer;\"",[236,14908,2199],{"class":722},[236,14910,2043],{"class":736},[236,14912,14913],{"class":2046},"canvas",[236,14915,14916],{"class":736}," class=\"_aarh\" height=\"84\" width=\"84\" style=\"position: absolute; top: -5px; left: -5px; width: 42px; height: 42px;\"",[236,14918,2199],{"class":722},[236,14920,14132],{"class":736},[236,14922,14913],{"class":2046},[236,14924,2199],{"class":722},[236,14926,2043],{"class":736},[236,14928,236],{"class":2046},[236,14930,14931],{"class":736}," class=\"_aa8h\" role=\"link\" tabindex=\"-1\" style=\"width: 32px; height: 32px;\"",[236,14933,2199],{"class":722},[236,14935,2043],{"class":736},[236,14937,175],{"class":2046},[236,14939,14940],{"class":736}," alt=\"zoeandbrodsforeheadkisses'",[236,14942,14943],{"class":2046},"s",[236,14945,14946],{"class":736}," profile picture\" class=\"_aa8j\" crossorigin=\"anonymous\" draggable=\"false\"",[236,14948,2199],{"class":722},[236,14950,14132],{"class":736},[236,14952,236],{"class":2046},[236,14954,2199],{"class":722},[236,14956,14132],{"class":736},[236,14958,2149],{"class":2046},[236,14960,2199],{"class":722},[236,14962,14132],{"class":736},[236,14964,2149],{"class":2046},[236,14966,2199],{"class":722},[236,14968,2043],{"class":736},[236,14970,2149],{"class":2046},[236,14972,14973],{"class":736}," class=\"_aaqy _aaq-\"",[236,14975,2199],{"class":722},[236,14977,2043],{"class":736},[236,14979,2149],{"class":2046},[236,14981,14982],{"class":736}," class=\" _aar1\"",[236,14984,2199],{"class":722},[236,14986,2043],{"class":736},[236,14988,2149],{"class":2046},[236,14990,14991],{"class":736}," class=\"_aaqt\"",[236,14993,2199],{"class":722},[236,14995,2043],{"class":736},[236,14997,2149],{"class":2046},[236,14999,15000],{"class":736}," class=\"_ab8w  _ab94 _ab97 _ab9f _ab9k _ab9p _abcm\"",[236,15002,2199],{"class":722},[236,15004,2043],{"class":736},[236,15006,2149],{"class":2046},[236,15008,15009],{"class":736}," class=\"_aacl _aaco _aacw _aacx _aad6 _aade\"",[236,15011,2199],{"class":722},[236,15013,2043],{"class":736},[236,15015,236],{"class":2046},[236,15017,15018],{"class":736}," class=\"_aap6 _aap7 _aap8\"",[236,15020,2199],{"class":722},[236,15022,2043],{"class":736},[236,15024,39],{"class":2046},[236,15026,15027],{"class":736}," class=\"oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz rq0escxv nhd2j8a9 nc684nl6 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys rz4wbd8a qt6c0cv9 a8nywdso i1ao9s8h esuyzwwr f1sip0of lzcic4wl _acan _acao _acat _acaw _a6hd\" href=\"\u002Fzoeandbrodsforeheadkisses\" role=\"link\" tabindex=\"0\"",[236,15029,2199],{"class":722},[236,15031,15032],{"class":736},"zoeandbrodsforeheadkisses\u003C\u002F",[236,15034,39],{"class":2046},[236,15036,2199],{"class":722},[236,15038,14132],{"class":736},[236,15040,236],{"class":2046},[236,15042,2199],{"class":722},[236,15044,14132],{"class":736},[236,15046,2149],{"class":2046},[236,15048,2199],{"class":722},[236,15050,14132],{"class":736},[236,15052,2149],{"class":2046},[236,15054,2199],{"class":722},[236,15056,14132],{"class":736},[236,15058,2149],{"class":2046},[236,15060,2199],{"class":722},[236,15062,14132],{"class":736},[236,15064,2149],{"class":2046},[236,15066,2199],{"class":722},[236,15068,2043],{"class":736},[236,15070,2149],{"class":2046},[236,15072,15073],{"class":736}," class=\"_aaql\"",[236,15075,2199],{"class":722},[236,15077,2043],{"class":736},[236,15079,2149],{"class":2046},[236,15081,15082],{"class":736}," class=\"_aacl _aacn _aacu _aacx _aad6 _aade\"",[236,15084,2199],{"class":722},[236,15086,2043],{"class":736},[236,15088,2149],{"class":2046},[236,15090,2199],{"class":722},[236,15092,14132],{"class":736},[236,15094,2149],{"class":2046},[236,15096,2199],{"class":722},[236,15098,2043],{"class":736},[236,15100,2149],{"class":2046},[236,15102,15103],{"class":736}," class=\"_aaqm\"",[236,15105,2199],{"class":722},[236,15107,2043],{"class":736},[236,15109,2149],{"class":2046},[236,15111,15112],{"class":736}," class=\"_aacl _aacn _aacu _aacy _aada _aade\"",[236,15114,2199],{"class":722},[236,15116,2043],{"class":736},[236,15118,39],{"class":2046},[236,15120,15121],{"class":736}," class=\"oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz rq0escxv nhd2j8a9 nc684nl6 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys rz4wbd8a qt6c0cv9 a8nywdso i1ao9s8h esuyzwwr f1sip0of lzcic4wl _aaqk _a6hd\" href=\"\u002Fexplore\u002Flocations\u002F235395557\u002F",[236,15123,15124],{"class":2046},"thredbo-resort",[236,15126,15127],{"class":736},"\" role=\"link\" tabindex=\"0\"",[236,15129,2199],{"class":722},[236,15131,15132],{"class":736},"Thredbo Resort\u003C\u002F",[236,15134,39],{"class":2046},[236,15136,2199],{"class":722},[236,15138,14132],{"class":736},[236,15140,2149],{"class":2046},[236,15142,2199],{"class":722},[236,15144,14132],{"class":736},[236,15146,2149],{"class":2046},[236,15148,2199],{"class":722},[236,15150,14132],{"class":736},[236,15152,2149],{"class":2046},[236,15154,2199],{"class":722},[236,15156,14132],{"class":736},[236,15158,2149],{"class":2046},[236,15160,2199],{"class":722},[236,15162,14132],{"class":736},[236,15164,2149],{"class":2046},[236,15166,2199],{"class":722},[236,15168,14132],{"class":736},[236,15170,14873],{"class":2046},[236,15172,2199],{"class":722},[236,15174,2043],{"class":736},[236,15176,2149],{"class":2046},[236,15178,15179],{"class":736}," class=\"_aasm _aasn\"",[236,15181,2199],{"class":722},[236,15183,2043],{"class":736},[236,15185,13778],{"class":2046},[236,15187,15188],{"class":736}," class=\"_abl-\" type=\"button\"",[236,15190,2199],{"class":722},[236,15192,2043],{"class":736},[236,15194,2149],{"class":2046},[236,15196,15197],{"class":736}," class=\"_abm0\"",[236,15199,2199],{"class":722},[236,15201,2043],{"class":736},[236,15203,2149],{"class":2046},[236,15205,15206],{"class":736}," class=\"_ab8w  _ab94 _ab97 _ab9h _ab9m _ab9p _abcm\" style=\"height: 24px; width: 24px;\"",[236,15208,2199],{"class":722},[236,15210,14132],{"class":736},[236,15212,2149],{"class":2046},[236,15214,2199],{"class":722},[236,15216,14132],{"class":736},[236,15218,2149],{"class":2046},[236,15220,2199],{"class":722},[236,15222,14132],{"class":736},[236,15224,13778],{"class":2046},[236,15226,2199],{"class":722},[236,15228,14132],{"class":736},[236,15230,2149],{"class":2046},[236,15232,2199],{"class":722},[236,15234,14132],{"class":736},[236,15236,2149],{"class":2046},[236,15238,2199],{"class":722},[236,15240,14132],{"class":736},[236,15242,2149],{"class":2046},[236,15244,2199],{"class":722},[236,15246,2043],{"class":736},[236,15248,2149],{"class":2046},[236,15250,15251],{"class":736}," class=\"_aatk\"",[236,15253,2199],{"class":722},[236,15255,2043],{"class":736},[236,15257,2149],{"class":2046},[236,15259,15260],{"class":736}," class=\"_aamm\"",[236,15262,2199],{"class":722},[236,15264,2043],{"class":736},[236,15266,2149],{"class":2046},[236,15268,15269],{"class":736}," class=\"_aamn\"",[236,15271,2199],{"class":722},[236,15273,2043],{"class":736},[236,15275,2149],{"class":2046},[236,15277,15278],{"class":736}," class=\"_aami\" style=\"",[236,15280,15281],{"class":2046},"padding-bottom",[236,15283,15284],{"class":736},": 125%;\"",[236,15286,2199],{"class":722},[236,15288,14132],{"class":736},[236,15290,2149],{"class":2046},[236,15292,2199],{"class":722},[236,15294,2043],{"class":736},[236,15296,2149],{"class":2046},[236,15298,15299],{"class":736}," class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcf _abcg _abch _abck _abcl _abcm\"",[236,15301,2199],{"class":722},[236,15303,2043],{"class":736},[236,15305,2149],{"class":2046},[236,15307,15308],{"class":736}," class=\"_aao_\"",[236,15310,2199],{"class":722},[236,15312,2043],{"class":736},[236,15314,2149],{"class":2046},[236,15316,15317],{"class":736}," class=\"_aap0\" role=\"presentation\"",[236,15319,2199],{"class":722},[236,15321,2043],{"class":736},[236,15323,2149],{"class":2046},[236,15325,15326],{"class":736}," class=\"_aap1\"",[236,15328,2199],{"class":722},[236,15330,2043],{"class":736},[236,15332,648],{"class":2046},[236,15334,15335],{"class":736}," class=\"_acay\"",[236,15337,2199],{"class":722},[236,15339,2043],{"class":736},[236,15341,190],{"class":2046},[236,15343,15344],{"class":736}," style=\"transform: translateX(3289px); width: 1px;\"",[236,15346,2199],{"class":722},[236,15348,14132],{"class":736},[236,15350,190],{"class":2046},[236,15352,2199],{"class":722},[236,15354,2043],{"class":736},[236,15356,190],{"class":2046},[236,15358,15359],{"class":736}," class=\"_acaz\" tabindex=\"-1\" style=\"transform: translateX(0px);\"",[236,15361,2199],{"class":722},[236,15363,2043],{"class":736},[236,15365,2149],{"class":2046},[236,15367,15368],{"class":736}," class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcm\" style=\"width: 470px;\"",[236,15370,2199],{"class":722},[236,15372,2043],{"class":736},[236,15374,2149],{"class":2046},[236,15376,15377],{"class":736}," role=\"button\" class=\"_aa06\" tabindex=\"0\"",[236,15379,2199],{"class":722},[236,15381,2043],{"class":736},[236,15383,2149],{"class":2046},[236,15385,2199],{"class":722},[236,15387,2043],{"class":736},[236,15389,2149],{"class":2046},[236,15391,15392],{"class":736}," class=\"_aagu _aamh\"",[236,15394,2199],{"class":722},[236,15396,2043],{"class":736},[236,15398,2149],{"class":2046},[236,15400,15401],{"class":736}," class=\"_aagv\" style=\"",[236,15403,15281],{"class":2046},[236,15405,15284],{"class":736},[236,15407,2199],{"class":722},[236,15409,2043],{"class":736},[236,15411,175],{"class":2046},[236,15413,15414],{"class":736}," alt=\"Photo by Zoe Sandell on July 21, 2022. May be an ",[236,15416,15417],{"class":2046},"image",[236,15419,15420],{"class":736}," of 7 people, people standing, nature and people skiing.\" class=\"_aagt\" crossorigin=\"anonymous\" decoding=\"auto\" sizes=\"470px\" \u003C\u002F",[236,15422,2149],{"class":2046},[236,15424,2199],{"class":722},[236,15426,2043],{"class":736},[236,15428,2149],{"class":2046},[236,15430,15431],{"class":736}," class=\"_aagw\"",[236,15433,2199],{"class":722},[236,15435,14132],{"class":736},[236,15437,2149],{"class":2046},[236,15439,2199],{"class":722},[236,15441,14132],{"class":736},[236,15443,2149],{"class":2046},[236,15445,2199],{"class":722},[236,15447,14132],{"class":736},[236,15449,2149],{"class":2046},[236,15451,2199],{"class":722},[236,15453,14132],{"class":736},[236,15455,2149],{"class":2046},[236,15457,2199],{"class":722},[236,15459,14132],{"class":736},[236,15461,2149],{"class":2046},[236,15463,2199],{"class":722},[236,15465,14132],{"class":736},[236,15467,190],{"class":2046},[236,15469,2199],{"class":722},[236,15471,2043],{"class":736},[236,15473,190],{"class":2046},[236,15475,15476],{"class":736}," class=\"_acaz\" tabindex=\"-1\" style=\"transform: translateX(470px);\"",[236,15478,2199],{"class":722},[236,15480,2043],{"class":736},[236,15482,2149],{"class":2046},[236,15484,15368],{"class":736},[236,15486,2199],{"class":722},[236,15488,2043],{"class":736},[236,15490,2149],{"class":2046},[236,15492,15377],{"class":736},[236,15494,2199],{"class":722},[236,15496,2043],{"class":736},[236,15498,2149],{"class":2046},[236,15500,2199],{"class":722},[236,15502,2043],{"class":736},[236,15504,2149],{"class":2046},[236,15506,15392],{"class":736},[236,15508,2199],{"class":722},[236,15510,2043],{"class":736},[236,15512,2149],{"class":2046},[236,15514,15401],{"class":736},[236,15516,15281],{"class":2046},[236,15518,15284],{"class":736},[236,15520,2186],{"class":722},[11,15522,15523],{},"The first article and button haven't been given any unique selectors, but the positioning of those elements must be unique. We want to click the first button in the first article.",[708,15525,15527],{"className":3195,"code":15526,"language":3197,"meta":15,"style":15},"article:nth-child(1) section span:nth-child(1) button\n",[714,15528,15529],{"__ignoreMap":15},[236,15530,15531,15533,15535,15537,15539,15541,15544,15547,15549,15551,15553,15555],{"class":718,"line":719},[236,15532,14825],{"class":2046},[236,15534,3258],{"class":726},[236,15536,1031],{"class":736},[236,15538,3263],{"class":726},[236,15540,3266],{"class":736},[236,15542,15543],{"class":2046},"section",[236,15545,15546],{"class":2046}," span",[236,15548,3258],{"class":726},[236,15550,1031],{"class":736},[236,15552,3263],{"class":726},[236,15554,3266],{"class":736},[236,15556,13820],{"class":2046},[11,15558,15559],{},"Above I use the position of the ‘article’ by adding ‘nth-child(1)’, you can target any child by changing the number. So nth-child(2) will select the second article within its parent, and so on. Repeat the trick to find and click the correct button.",[11,15561,15562],{},"Downside: elements can change in their relative positions on the page when data is added or removed. For example, property websites tend to have lots of changing data on a page-by-page basis. This can cause the absolute precision of your hierarchical selectors to work against you!",[11,15564,15565,15566],{},"You can learn ",[39,15567,15570],{"href":15568,"rel":15569},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F:nth-child",[43],"about children here.",[63,15572,15574],{"id":15573},"what-axiomai-steps-can-custom-selectors-be-used-with","What axiom.ai steps can custom selectors be used with?",[11,15576,15577],{},"The following steps in axiom.ai feature our no-code selector tool and can be used in conjunction with custom css selectors:",[648,15579,15580,15583,15586,15589,15592,15595,15598,15601],{},[190,15581,15582],{},"Get data from a URL\u002FGet data from bot's current page",[190,15584,15585],{},"Get a list of links to pages from a URL\u002FGet a list of links to pages from bot's current page",[190,15587,15588],{},"Click Element\u002FClick Multiple Elements",[190,15590,15591],{},"Enter Text",[190,15593,15594],{},"Select List",[190,15596,15597],{},"Download File\u002FFiles",[190,15599,15600],{},"Upload a file",[190,15602,15603],{},"Upload a file from Google Drive\u002FDownload a file to Google Drive",[11,15605,15606,15607],{},"You can learn more about ",[39,15608,15609],{"href":7961},"axiom.ai’s Steps here.",[63,15611,15613],{"id":15612},"how-do-i-use-custom-selectors-with-axiomai","How do I use custom selectors with axiom.ai?",[11,15615,15616],{},"axiom.ai provides a no-code interface for adding custom selectors.",[11,15618,15619],{},"Click on the button ‘\u003C> set custom selector’.",[175,15621],{"src":15622,"alt":15623},"\u002Fblog\u002F1-axiom-custom-css-selector.png","Custom selector axiom.ai",[11,15625,15626],{},"Delete any code you see inside the box.",[175,15628],{"src":15629,"alt":15630},"\u002Fblog\u002F2-delete-data-css-selector.png","remove css code from axiom.ai",[11,15632,15633],{},"Add you custom selector and save.",[175,15635],{"src":15636,"alt":15637},"\u002Fblog\u002F3-add-css-selector.png","add you attribte selector into axiom.ai",[11,15639,15640,15643],{},[49,15641,15642],{},"Please note ‘Get data from a web page’"," can handle multiple selectors, to use more than one selector separate them with commas. These types of selector will also only return text results.",[11,15645,15646],{},"To use custom selectors you will need to edit the selector data model (we’ll get to that in a second).",[175,15648],{"src":15649,"alt":15650},"\u002Fblog\u002F4-css-selector.png","add multipile custom selectors",[63,15652,15654],{"id":15653},"setting-advanced-custom-selectors-using-axiomai","Setting advanced custom selectors using axiom.ai",[11,15656,15657],{},"If you're really interested in getting into the nitty-gritty with axiom.ai, you can edit the selector data model manually to tweak the selectors. However, this does require a degree of knowledge. The good news is that we are working on a no-code interface that makes it easy 😀",[11,15659,15660],{},"The selector data is specified in JSON, which is a standard format used for storing data on the web. If you’re familiar with JSON, great! If not here’s a quick cheat sheet:",[175,15662],{"src":15663,"alt":15664},"\u002Fblog\u002F5-advanced-css-selector.png","edit data object for css selectors",[11,15666,15667],{},"To change the selectors edit the code highlighted in green",[11,15669,15670],{},"To change the result type change the value in pink to one of these: “link”, “textContent” or “innerHTML”",[11,15672,15673,15674,15676,15677,15680,15681,15683],{},"Add new selectors by adding ‘{\"selector\":\"\",\"selections\":",[236,15675],{},",\"selectedElements\":",[236,15678,15679],{},"{}",",\"rejectedElements\":",[236,15682],{},",\"resultType\":\"innerHTML\"}’ and do separate with a comma.",[11,15685,15686],{},"Be warned any syntax errors can stop the selector from working! However, if you do mess it up you can always switch back to axiom.ai’s selector tool and re-select some data, which will regenerate the object so you can try again.",[63,15688,15690],{"id":15689},"when-should-you-use-attribute-selectors-with-axiomai","When should you use attribute selectors with axiom.ai?",[129,15692,15694],{"id":15693},"if-the-bot-fails-to-click-the-next-button-when-scraping-a-listing-page","If the bot fails to click the \"next\" button when scraping a listing page",[11,15696,15697],{},"Let’s say you have created a bot to scrape all the data from a web page using the ‘Get data from a webpage’ step. You have set up the select and pager rows in the step and you see green ticks next to them. The scraper should retrieve all results, but when you run the bot, it fails to move onto the next page.",[11,15699,15700],{},"This is what the step looks like when it’s correctly configured:",[175,15702],{"src":15663,"alt":15664},[11,15704,15705],{},"If you run your automation and the listing doesn't advance to the next page, try adjusting the selection of the pager button. For example, try selecting it several times or try selecting it in a slightly different way each time. If that doesn't work, it’s custom selector time! See this Linkedin example:",[708,15707,15708],{"className":2033,"code":13965,"language":2035,"meta":15,"style":15},[714,15709,15710,15822,15840,15852,15856,15870,15874],{"__ignoreMap":15},[236,15711,15712,15714,15716,15718,15720,15722,15724,15726,15728,15730,15732,15734,15736,15738,15740,15742,15744,15746,15748,15750,15752,15754,15756,15758,15760,15762,15764,15766,15768,15770,15772,15774,15776,15778,15780,15782,15784,15786,15788,15790,15792,15794,15796,15798,15800,15802,15804,15806,15808,15810,15812,15814,15816,15818,15820],{"class":718,"line":719},[236,15713,2043],{"class":736},[236,15715,13778],{"class":2046},[236,15717,2407],{"class":726},[236,15719,2053],{"class":736},[236,15721,13980],{"class":752},[236,15723,2099],{"class":726},[236,15725,2053],{"class":736},[236,15727,13987],{"class":752},[236,15729,2131],{"class":726},[236,15731,2053],{"class":736},[236,15733,13994],{"class":752},[236,15735,2444],{"class":726},[236,15737,2053],{"class":736},[236,15739,14001],{"class":752},[236,15741,14004],{"class":736},[236,15743,14007],{"class":2046},[236,15745,14010],{"class":726},[236,15747,2053],{"class":736},[236,15749,14015],{"class":752},[236,15751,2444],{"class":726},[236,15753,2053],{"class":736},[236,15755,14022],{"class":752},[236,15757,2131],{"class":726},[236,15759,2053],{"class":736},[236,15761,14029],{"class":752},[236,15763,14032],{"class":726},[236,15765,2053],{"class":736},[236,15767,14037],{"class":752},[236,15769,2146],{"class":736},[236,15771,14042],{"class":2046},[236,15773,14045],{"class":726},[236,15775,2053],{"class":736},[236,15777,14050],{"class":752},[236,15779,14053],{"class":726},[236,15781,2053],{"class":736},[236,15783,14058],{"class":752},[236,15785,2131],{"class":726},[236,15787,2053],{"class":736},[236,15789,14065],{"class":752},[236,15791,14068],{"class":726},[236,15793,2053],{"class":736},[236,15795,14073],{"class":752},[236,15797,14076],{"class":726},[236,15799,2053],{"class":736},[236,15801,14081],{"class":752},[236,15803,14084],{"class":726},[236,15805,2053],{"class":736},[236,15807,14089],{"class":752},[236,15809,14092],{"class":726},[236,15811,2053],{"class":736},[236,15813,14089],{"class":752},[236,15815,14099],{"class":726},[236,15817,2053],{"class":736},[236,15819,2080],{"class":752},[236,15821,2186],{"class":736},[236,15823,15824,15826,15828,15830,15832,15834,15836,15838],{"class":718,"line":542},[236,15825,14110],{"class":736},[236,15827,14113],{"class":2046},[236,15829,14116],{"class":726},[236,15831,2053],{"class":736},[236,15833,14121],{"class":752},[236,15835,2180],{"class":736},[236,15837,14113],{"class":2046},[236,15839,2186],{"class":736},[236,15841,15842,15844,15846,15848,15850],{"class":718,"line":16},[236,15843,14132],{"class":736},[236,15845,14042],{"class":2046},[236,15847,2180],{"class":736},[236,15849,14007],{"class":2046},[236,15851,2186],{"class":736},[236,15853,15854],{"class":718,"line":571},[236,15855,1043],{"emptyLinePlaceholder":24},[236,15857,15858,15860,15862,15864,15866,15868],{"class":718,"line":961},[236,15859,2043],{"class":736},[236,15861,236],{"class":2046},[236,15863,2131],{"class":726},[236,15865,2053],{"class":736},[236,15867,14157],{"class":752},[236,15869,2186],{"class":736},[236,15871,15872],{"class":718,"line":982},[236,15873,14164],{"class":736},[236,15875,15876,15878,15880,15882,15884],{"class":718,"line":988},[236,15877,14132],{"class":736},[236,15879,236],{"class":2046},[236,15881,2180],{"class":736},[236,15883,13778],{"class":2046},[236,15885,2186],{"class":736},[11,15887,15888],{},"We would extract the following attribute ‘aria-label=\"Next\"’ to make this selector. Combining both element and attribute selectors, we can come up with one of the following:",[708,15890,15891],{"className":3195,"code":14185,"language":3197,"meta":15,"style":15},[714,15892,15893,15907,15911],{"__ignoreMap":15},[236,15894,15895,15897,15899,15901,15903,15905],{"class":718,"line":719},[236,15896,13778],{"class":2046},[236,15898,3075],{"class":736},[236,15900,13643],{"class":726},[236,15902,2053],{"class":722},[236,15904,13980],{"class":752},[236,15906,3085],{"class":736},[236,15908,15909],{"class":718,"line":542},[236,15910,1043],{"emptyLinePlaceholder":24},[236,15912,15913,15915,15917,15919,15921,15923],{"class":718,"line":16},[236,15914,14210],{"class":726},[236,15916,3075],{"class":736},[236,15918,13643],{"class":726},[236,15920,2053],{"class":722},[236,15922,13980],{"class":752},[236,15924,3085],{"class":736},[11,15926,15927],{},"Either one of these should work to find the button on every page.",[129,15929,15931],{"id":15930},"if-the-bot-does-nothing-when-entering-text-into-an-input-form","If the bot does nothing when entering text into an input form",[11,15933,15934],{},"You've created a bot that enters data into a webform. The bot opens the correct page and selects the correct form input, but no text is input.",[11,15936,15937],{},"Let’s see how the enter text step is configured. You should see a green tick in the File field, and some example text in the Text field. This looks like it should work:",[175,15939],{"src":15940,"alt":15941},"\u002Fblog\u002F7-not-text-entered.png","Entering text into inputs browser automation",[11,15943,15944],{},"However, when you run the automation nothing happens - no text is entered.",[11,15946,15947],{},"As always, the simple solution is to try re-selecting the input field. But if that doesn't work, you can try using a custom selector.",[11,15949,15950],{},"For example, if the HTML of your text field looks like this:",[708,15952,15954],{"className":3195,"code":15953,"language":3197,"meta":15,"style":15},"\u003Ctextarea data-testid=\"project-desc\" placeholder=\"Your sentence goes here\" class=\"flex flex-1 py-2.5 px-3.5 border-purple-100 rounded shadow-sm resize-none w-full placeholder-purple-200 focus:outline-none focus:ring-0 focus:border-turquoise-700 text-gray-800\" type=\"text\" autocomplete=\"off\" id=\"what-sentence-would-you-like-to-rewrite\" style=\"min-height: 128px; max-height: unset; height: 126px;\">For example if you wanted to scrape Zillow listings and not the sponsored content you could use this selector:\u003C\u002Ftextarea>\n\n",[714,15955,15956],{"__ignoreMap":15},[236,15957,15958,15960,15962,15964,15966,15969,15972,15975,15978,15981,15984,15986,15989,15992,15995,15998,16001,16004,16007,16010,16012,16015,16017,16020,16023,16026,16029,16032,16035,16038,16040,16043,16045,16048,16051,16054,16057,16060,16062],{"class":718,"line":719},[236,15959,2043],{"class":736},[236,15961,2715],{"class":2046},[236,15963,2800],{"class":2046},[236,15965,13646],{"class":736},[236,15967,15968],{"class":2046},"project-desc",[236,15970,15971],{"class":736},"\" placeholder=\"Your sentence goes here\" class=\"flex ",[236,15973,15974],{"class":2046},"flex-1",[236,15976,15977],{"class":2046}," py-2",[236,15979,15980],{"class":726},".5",[236,15982,15983],{"class":2046}," px-3",[236,15985,15980],{"class":726},[236,15987,15988],{"class":2046}," border-purple-100",[236,15990,15991],{"class":736}," rounded ",[236,15993,15994],{"class":2046},"shadow-sm",[236,15996,15997],{"class":2046}," resize-none",[236,15999,16000],{"class":2046}," w-full",[236,16002,16003],{"class":2046}," placeholder-purple-200",[236,16005,16006],{"class":736}," focus:",[236,16008,16009],{"class":2046},"outline-none",[236,16011,16006],{"class":736},[236,16013,16014],{"class":2046},"ring-0",[236,16016,16006],{"class":736},[236,16018,16019],{"class":2046},"border-turquoise-700",[236,16021,16022],{"class":2046}," text-gray-800",[236,16024,16025],{"class":736},"\" type=\"text\" autocomplete=\"off\" id=\"",[236,16027,16028],{"class":2046},"what-sentence-would-you-like-to-rewrite",[236,16030,16031],{"class":736},"\" style=\"",[236,16033,16034],{"class":2046},"min-height",[236,16036,16037],{"class":736},": 128px; ",[236,16039,14840],{"class":2046},[236,16041,16042],{"class":736},": unset; height: 126px;\"",[236,16044,2199],{"class":722},[236,16046,16047],{"class":736},"For example if you wanted to scrape Zillow listings and not the sponsored ",[236,16049,16050],{"class":2046},"content",[236,16052,16053],{"class":736}," you could ",[236,16055,16056],{"class":2046},"use",[236,16058,16059],{"class":736}," this selector:\u003C\u002F",[236,16061,2715],{"class":2046},[236,16063,2186],{"class":722},[11,16065,16066],{},"Then the following attribute selector looks like a good solution:",[708,16068,16070],{"className":3195,"code":16069,"language":3197,"meta":15,"style":15},"textarea[data-testid=\"project-desc\"]\n",[714,16071,16072],{"__ignoreMap":15},[236,16073,16074,16076,16078,16080,16082,16085],{"class":718,"line":719},[236,16075,2715],{"class":2046},[236,16077,3075],{"class":736},[236,16079,3078],{"class":726},[236,16081,2053],{"class":722},[236,16083,16084],{"class":752},"\"project-desc\"",[236,16086,3085],{"class":736},[129,16088,16090],{"id":16089},"if-your-scrape-works-inconsistently-or-does-not-get-all-the-results-you-want","If your scrape works inconsistently, or does not get all the results you want",[11,16092,16093],{},"You've made a bot to scrape multiple real estate pages on a website such as Zillow. It seems simple enough: select the content and write it to a Google Sheet. For 90% of use cases, it is in fact that simple!",[11,16095,16096],{},"However, property websites have varying content and layouts. Not all content is present on every page. This type of problem can break any and all web scrapers scrambling the results returned.",[175,16098],{"src":16099,"alt":16100},"\u002Fblog\u002F8-scrape-does-not-work.png","selecting data to scrape",[11,16102,16103],{},"To solve this problem, call on custom selectors to give you a helping hand!",[11,16105,16106],{},"For example, to scrape Zillow listings and not any sponsored content you could use this selector:",[708,16108,16110],{"className":3195,"code":16109,"language":3197,"meta":15,"style":15},".result-list-container .list-card-info a\n",[714,16111,16112],{"__ignoreMap":15},[236,16113,16114,16117,16120],{"class":718,"line":719},[236,16115,16116],{"class":726},".result-list-container",[236,16118,16119],{"class":726}," .list-card-info",[236,16121,16122],{"class":2046}," a\n",[63,16124,526],{"id":525},[11,16126,16127],{},"With the right methods, web scraping is a simple way to collect important data. If you're comfortable using custom selectors, there will be no web page that you can't extract content from. You'll become an expert in no time. Attribute selectors in particular are often unique and can be useful if you want to create custom selectors quickly.",[11,16129,16130],{},"Good luck!",[11,16132,16133],{},[49,16134,16135],{},"UPDATE!!!",[11,16137,16138],{},"In the next couple of release we will be introducing a no-code tool that provide hints and helps you set custom selectors. Watch this space!",[802,16140,16141],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}",{"title":15,"searchDepth":16,"depth":16,"links":16143},[16144,16145,16146,16151,16155,16156,16161,16162,16163,16164,16169],{"id":13491,"depth":542,"text":13492},{"id":13588,"depth":542,"text":13589},{"id":13715,"depth":542,"text":13716,"children":16147},[16148,16149,16150],{"id":13722,"depth":16,"text":13723},{"id":13823,"depth":16,"text":13824},{"id":13878,"depth":16,"text":13879},{"id":13951,"depth":542,"text":13952,"children":16152},[16153,16154],{"id":13958,"depth":16,"text":13959},{"id":14223,"depth":16,"text":14224},{"id":14293,"depth":542,"text":14294},{"id":14311,"depth":542,"text":14312,"children":16157},[16158,16159,16160],{"id":14318,"depth":16,"text":14319},{"id":14554,"depth":16,"text":14555},{"id":14806,"depth":16,"text":14807},{"id":15573,"depth":542,"text":15574},{"id":15612,"depth":542,"text":15613},{"id":15653,"depth":542,"text":15654},{"id":15689,"depth":542,"text":15690,"children":16165},[16166,16167,16168],{"id":15693,"depth":16,"text":15694},{"id":15930,"depth":16,"text":15931},{"id":16089,"depth":16,"text":16090},{"id":525,"depth":542,"text":526},"2022-07-29","A practical guide to using CSS selectors, including the attribute selector, for browser automation.",{"read":10019,"type":578,"tool":16173,"category":16174,"tags":16175,"location":587,"featuredimg":16176,"landingimg":16176,"summary":16171,"video":16177,"metaTitle":13407},[580],[4752],[13598,2920,3197],"\u002Fblog\u002Fcss-attribute-selector.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FbZ48quIx6jg?rel=0","\u002Fblog\u002Fcss-attribute-selectors",{"title":13407,"description":16171},"blog\u002Fcss-attribute-selectors","t1F3rhSXP2AQLmjOv4hmkDeMtb1m3ImodF4cTAmv_9A",{"id":16183,"title":16184,"author":23,"body":16185,"date":16541,"description":16189,"draft":575,"extension":19,"meta":16542,"navigation":24,"path":16550,"seo":16551,"stem":16552,"__hash__":16553},"blog\u002Fblog\u002Fautomate-instagram-post.md","Automate posts to Instagram",{"type":8,"value":16186,"toc":16517},[16187,16190,16192],[11,16188,16189],{},"Do you spend much of your working day on Instagram, posting across multiple accounts? If so, this guide is perfect for you. In a few simple steps, we’ll teach you how to build a bot that will post to Instagram for you - without a single line of code. What's more, you will pick up a skill that empowers you to automate just about anything on the web. How awesome is that? ✋",[60,16191],{},[9660,16193,16194,16198,16201,16204,16206,16209,16215,16219,16222,16225,16229,16232,16236,16239,16248,16252,16262,16266,16272,16275,16277,16280,16283,16286,16290,16294,16297,16299,16302,16306,16312,16315,16317,16319,16322,16325,16330,16334,16340,16343,16347,16355,16357,16359,16363,16366,16369,16371,16375,16378,16381,16384,16387,16389,16392,16395,16397,16400,16405,16408,16411,16414,16418,16421,16423,16426,16428,16437,16440,16442,16444,16446,16451,16455,16459,16461,16463,16465,16467,16484,16486,16490,16493,16495,16499,16501,16504,16513],{},[63,16195,16197],{"id":16196},"why-build-a-bot-for-automatic-posting-on-instagram","Why build a bot for automatic posting on Instagram?",[11,16199,16200],{},"Have you ever seen a bot do your work? You can sit back and watch it working its magic on your screen. Before you know it, you’ll find your Instagram posts up and attracting likes - all without touching the keyboard.",[11,16202,16203],{},"There’s a learning curve to building bots to automate the browser. If you’ve used Zapier, then Axiom will be easy for you to pick up. If you’re a newbie, this guide takes you through the steps to program a bot without a single line of code. Once you’ve mastered that, you can start automating a whole range of tedious tasks!",[63,16205,12634],{"id":12633},[11,16207,16208],{},"A bot is the software cousin of the robot. Like a robot, its job is to do the tedious work for us. Just like a physical robot, it needs instructions, so it knows how to do the job. In this case, you’ll give the bot a set of instructions that tells it how to automate posting to Instagram.",[11,16210,16211,16212,90],{},"Check out our blog on bots ",[39,16213,16214],{"href":88},"click here",[63,16216,16218],{"id":16217},"how-are-bots-made","How are bots made?",[11,16220,16221],{},"You make bots by combining steps to replicate your actions using Axiom’s no-code bot builder. You can build as many bots as you want for any web-based application, not just Instagram.",[11,16223,16224],{},"If you are completely new to this, keep following the guide and by the end you’ll have made a working bot.",[63,16226,16228],{"id":16227},"how-do-bots-automate-posting-on-instagram","How do bots automate posting on Instagram?",[11,16230,16231],{},"The bot you’re about to make will automate the same web actions you perform to create an Instagram post. Bots work just like you: they open the browser window, click on the new post button, upload an image and insert the text before finally clicking the post button to complete the task.",[63,16233,16235],{"id":16234},"will-my-instagram-account-get-blocked","Will my Instagram account get blocked?",[11,16237,16238],{},"The short answer is no, Instagram does not currently limit posting. However, if you created an army of bots automating Instagram 24\u002F7, then yes, you would be blocked. And to be honest, you would deserve it.",[11,16240,16241,16242,16247],{},"We believe bots should be used responsibly and shouldn’t be used to spam websites and degrade other users' experiences. To avoid getting blocked, read about ",[39,16243,16246],{"href":16244,"rel":16245},"https:\u002F\u002Fthepreviewapp.com\u002Finstagram-limits",[43],"Instagram’s rate limits"," and don’t exceed them. Don’t use Axiom to abuse the system.",[63,16249,16251],{"id":16250},"lets-dive-in-and-make-a-bot-to-automate-instagram-posting","Let’s dive in and make a bot to automate Instagram posting",[11,16253,16254,16255,16258,16259,13],{},"Before we you start, please note you need to use Axiom’s desktop app as this automation requires files to be uploaded, ",[39,16256,16257],{"href":13098},"Click here to install.","\nCurrently, bots can only work with files on the desktop. If you would like to see this feature on the cloud or elsewhere, ",[39,16260,16261],{"href":13107},"please vote here",[129,16263,16265],{"id":16264},"_1-install-axiom-in-your-chrome-browser","1. Install Axiom in your chrome browser",[11,16267,16268,16269,13],{},"If you haven’t yet installed Axiom, and created an account please goto the chrome store and ",[39,16270,142],{"href":140,"rel":16271},[43],[11,16273,16274],{},"By the way, we give all new users 2 hours of runtime. This means you can build and run this bot a few times on us 🙂",[129,16276,13128],{"id":13127},[11,16278,16279],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering shortcut 'sheet.new'.",[11,16281,16282],{},"First name your sheet 'Automate posting on Instagram’, then add two new tabs to the sheet titled 'Post' and 'Posted.’",[11,16284,16285],{},"Set up your sheet on the first ‘Post’ tab as seen below. Add some dummy posts for testing the bot and add the image path and name.",[175,16287],{"src":16288,"alt":16289},"\u002Fblog\u002Finstgram-sheet.jpg","Set up a google sheet to read data and write data to from Instagram",[129,16291,16293],{"id":16292},"_3-launch-instagram-and-open-axiom","3. Launch Instagram and open Axiom",[11,16295,16296],{},"First, log in to Instagram in your chrome browser. Then open up Axiom and click the '+ New Automation' button. You’re now going to start combining steps to build your automation.",[129,16298,13148],{"id":13147},[11,16300,16301],{},"To build your bot from scratch, click on 'Start blank.' You can make as many bots as you want.",[175,16303],{"src":16304,"alt":16305},"\u002Fblog\u002Fstart-from-blank.jpg","Start from blank - build a bot to automate Instagram posting",[129,16307,16308,16309],{"id":13156},"5. Add your first step, ‘",[49,16310,16311],{},"Read data from a Google Sheet’",[11,16313,16314],{},"Using the Step Finder click ‘Read data from a Google Sheet’. The step will be added to Axiom for you to configure.",[11,16316,12726],{},[11,16318,13165],{},[11,16320,16321],{},"On the first cell, toggle the switch and enter 'A2'. This setting tells the bot where to start reading data. In the example below, you would start with 'My first automated post' as the column titles fill row one.",[11,16323,16324],{},"On the last cell, click the toggle switch and enter 'AC2'. You have limited the bot to read a single row. If you wanted to post two posts concurrently, you could change the setting to AC3.",[11,16326,13178,16327],{},[39,16328,16329],{"href":9769},"watch these videos.",[175,16331],{"src":16332,"alt":16333},"\u002Fblog\u002Fread-sheet-instagram-posts.jpg","Set up axiom.ai to read data from a Google Sheet",[129,16335,16336,16337],{"id":13186},"6. ",[49,16338,16339],{},"Loop through data",[11,16341,16342],{},"Click ‘Add a step’ below the ‘read’ step. Using the Step Finder click on 'Loop through data' to add the step.",[175,16344],{"src":16345,"alt":16346},"\u002Fblog\u002Finteract-step.jpg","Add an interact step for automating web actions",[11,16348,16349,16350,11066],{},"In the ‘Go to Url’ field enter ‘",[39,16351,16354],{"href":16352,"rel":16353},"https:\u002F\u002Fwww.instagram.com",[43],"https:\u002F\u002Fwww.instagram.com\u002F",[11,16356,13200],{},[11,16358,13203],{},[175,16360],{"src":16361,"alt":16362},"\u002Fblog\u002Fclick-element.jpg","automate clicks with axiom.ai",[11,16364,16365],{},"Then, click on 'Select' and use our selector tool to highlight the ‘Create a new post’ button on Instagram and click confirm.",[11,16367,16368],{},"Well done, you have automated a web action.",[129,16370,13217],{"id":13216},[175,16372],{"src":16373,"alt":16374},"\u002Fblog\u002Ffile-path-set-up.jpg","Automate image uploads to instagram posts using axiom.ai's file upload step",[11,16376,16377],{},"Add an 'Upload file’ sub step and select the button 'Select from computer' in the Instagram pop-up window.",[11,16379,16380],{},"In 'File path' click on the yellow stadium 'Insert data' and select Google-Sheet-Data. A data preview will open. Select column C with the image path and save and close the preview.",[11,16382,16383],{},"Add a second 'Click element' sub step. Select the ‘next’ button.",[11,16385,16386],{},"Use a third 'Click element' sub step. Select the ‘filter’ button.",[11,16388,13230],{},[11,16390,16391],{},"Now pass your caption from the sheet into the ‘Enter text’ step. Next, click on the yellow stadium 'Insert data' and select Google-Sheet-Data. A data preview will open. Select column A and save and close the preview.",[175,16393],{"src":16394,"alt":16374},"\u002Fblog\u002Fenter-text-substep.jpg",[11,16396,16377],{},[11,16398,16399],{},"Add one more ‘Click element’ to click Instagram’s ‘Post’ button.",[11,16401,16402],{},[49,16403,16404],{},"Important",[11,16406,16407],{},"When you see the text ‘Do you want to click this element now?’ click cancel so that the post does not send.",[11,16409,16410],{},"You can disable this step by clicking on the menu to the left and selecting \"Disable step\" from the drop down. This stops you from accidentally sending messages before you're ready!",[11,16412,16413],{},"You’re almost ready to test the bot.",[129,16415,16417],{"id":16416},"_8-add-a-new-step-write-data-to-a-google-sheet","8. Add a new step ‘Write data to a Google Sheet’",[11,16419,16420],{},"Add a new step (not a sub step) below the ‘Interact’ step by choosing ‘Write data to a Google Sheet’.",[11,16422,13271],{},[11,16424,16425],{},"For ‘Sheet Name’, select the tab called 'Posted'. This tab will keep a record of the posts sent.",[11,16427,13277],{},[129,16429,16431,16432],{"id":16430},"_9-delete-rows-from-a-google-sheet","9. ",[49,16433,16434],{},[49,16435,16436],{},"Delete rows from a Google Sheet",[11,16438,16439],{},"Add the step ‘Delete rows from a Google Sheet' to delete the row of data that has been used to create the post. This is to prevent it from being repeated.",[11,16441,13291],{},[11,16443,13294],{},[11,16445,13297],{},[11,16447,16448,16449],{},"Well done! The bot is complete and ready to test ",[49,16450,482],{},[175,16452],{"src":16453,"alt":16454},"\u002Fblog\u002Fdelete-data.jpg","Delete rows of data from Google Sheet",[63,16456,16458],{"id":16457},"test-run","Test run",[11,16460,13307],{},[11,16462,492],{},[11,16464,495],{},[11,16466,12931],{},[187,16468,16469,16474,16479],{},[190,16470,16471],{},[49,16472,16473],{},"Does the image upload into the post?",[190,16475,16476],{},[49,16477,16478],{},"Is the Instgram filter clicked?",[190,16480,16481],{},[49,16482,16483],{},"Is the caption entered into the post?",[11,16485,501],{},[63,16487,16489],{"id":16488},"debugging-your-bot","Debugging your bot",[11,16491,16492],{},"If you experience any issue with the bot not clicking buttons, try re-selecting the button or text input. To change the selection, move the cursor slowly over the object and re-select.",[11,16494,12954],{},[11,16496,13341,16497],{},[39,16498,9208],{"href":521},[63,16500,526],{"id":525},[11,16502,16503],{},"Now you can run your bot on the desktop app as often as you like. You have a working bot to automate a repetitive task on Instagram that you built yourself. That's pretty awesome! What’s your next bot going to be?",[11,16505,16506,16507,16512],{},"If you would like to schedule this bot, vote for ‘",[39,16508,16511],{"href":16509,"rel":16510},"https:\u002F\u002Fbrowserbots.nolt.io\u002Fwidget\u002F10",[43],"File management for the Cloud","’ on our product roadmap.",[531,16514,534,16515],{"id":533},[39,16516,538],{"href":537},{"title":15,"searchDepth":16,"depth":16,"links":16518},[16519,16520,16521,16522,16523,16524,16536,16537,16538],{"id":16196,"depth":542,"text":16197},{"id":12633,"depth":542,"text":12634},{"id":16217,"depth":542,"text":16218},{"id":16227,"depth":542,"text":16228},{"id":16234,"depth":542,"text":16235},{"id":16250,"depth":542,"text":16251,"children":16525},[16526,16527,16528,16529,16530,16531,16532,16533,16534],{"id":16264,"depth":16,"text":16265},{"id":13127,"depth":16,"text":13128},{"id":16292,"depth":16,"text":16293},{"id":13147,"depth":16,"text":13148},{"id":13156,"depth":16,"text":13157},{"id":13186,"depth":16,"text":13187},{"id":13216,"depth":16,"text":13217},{"id":16416,"depth":16,"text":16417},{"id":16430,"depth":16,"text":16535},"9. Delete rows from a Google Sheet",{"id":16457,"depth":542,"text":16458},{"id":16488,"depth":542,"text":16489},{"id":525,"depth":542,"text":526,"children":16539},[16540],{"id":533,"depth":571,"text":572},"2022-07-05",{"read":16543,"type":578,"tool":16544,"category":16545,"tags":16546,"location":587,"featuredimg":18,"landingimg":16547,"summary":16548,"video":16549},"15 min read",[580],[6055],[10023,585,8152],"\u002Fblog\u002Finstagram-post-icon.jpg","Learn how to automate posts on Instagram using axiom.ai's no-code bot building tool","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F4rThSF7BjDw?rel=0","\u002Fblog\u002Fautomate-instagram-post",{"title":16184,"description":16189},"blog\u002Fautomate-instagram-post","P5NYnCpl0jdEb9zhW546tqmfyLVqQN8AXh3VmU2ub4I",{"id":16555,"title":16556,"author":23,"body":16557,"date":16950,"description":16561,"draft":575,"extension":19,"meta":16951,"navigation":24,"path":16961,"seo":16962,"stem":16963,"__hash__":16964},"blog\u002Fblog\u002F5-problems-webscrapers.md","5 killer problems with web scrapers, and how to solve them",{"type":8,"value":16558,"toc":16928},[16559,16562,16565,16568,16571,16575,16578,16581,16584,16588,16591,16595,16598,16601,16605,16608,16612,16615,16618,16622,16625,16628,16631,16639,16642,16651,16666,16672,16675,16678,16682,16685,16688,16691,16695,16698,16701,16704,16713,16716,16722,16725,16728,16731,16735,16738,16741,16744,16747,16750,16761,16769,16773,16776,16779,16782,16785,16788,16791,16794,16800,16806,16809,16813,16816,16819,16822,16825,16840,16843,16846,16850,16853,16856,16859,16862,16904,16907,16910,16913,16916,16926],[11,16560,16561],{},"Web scraping is great when you have it all working, and can save you a ton of mind-numbing copy and pasting. Unfortunately, getting to that sweet spot can be filled with frustration. At first, things look easy - but as you start scraping more data, the problems begin to mount.",[60,16563],{"alt":16564},"how to solve problems when scraping the web",[11,16566,16567],{},"Solving these is part science, part art.",[11,16569,16570],{},"At axiom, we’re scraping experts that have seen 1000s of cases. These are the most common problems you’ll encounter and our recommended fixes.",[63,16572,16574],{"id":16573},"problem-missing-or-inconsistent-data","Problem: Missing or inconsistent data",[11,16576,16577],{},"Computers are brilliant in some ways, but quite dumb in others, and they don’t understand pages as well as a human does. Rather than parsing the data as meaningful chunks, they see the page as a generic data structure called the “Document Object Model” or DOM.",[11,16579,16580],{},"Just because content looks the same on a page, doesn’t mean it has the same underlying DOM structure, and this can cause the web scraper to behave inconsistently.",[11,16582,16583],{},"For example, take a look at these two google results, and examine the titles html and classes:",[129,16585,16587],{"id":16586},"example-one","Example One",[175,16589],{"src":16590},"\u002Fblog\u002Fwebscrape-one.jpg",[129,16592,16594],{"id":16593},"example-two","Example Two",[175,16596],{"src":16597},"\u002Fblog\u002Fweb-scraper-two.png",[11,16599,16600],{},"It looks like both have a similar style, particularly in regards to the title of the page. But if we take a look under the hood, we see that the HTML code looks like this:",[129,16602,16604],{"id":16603},"example-one-title-in-html","Example one title in html",[175,16606],{"src":16607},"\u002Fblog\u002Fhtml-scrape-classes-one.jpg",[129,16609,16611],{"id":16610},"example-two-title-in-html","Example two title in html",[175,16613],{"src":16614},"\u002Fblog\u002Fhtml-scrape-classes-two.jpg",[11,16616,16617],{},"These are structures with almost nothing in common, despite their visual similarities!",[129,16619,16621],{"id":16620},"solution","Solution:",[11,16623,16624],{},"The choice of selectors is key here and, sadly, there’s no silver bullet. In rare circumstances, a unique id or class may exist for the elements you’re trying to scrape. Here, for example, we can see that “.a-price” looks like it will nicely grab that price info from Amazon:",[175,16626],{"src":16627},"\u002Fblog\u002Famazon-code-example.png",[11,16629,16630],{},"Unfortunately, many websites can make this difficult. Particularly common traps include:",[648,16632,16633,16636],{},[190,16634,16635],{},"Using automatically generated code without clear or consistent human-readable names",[190,16637,16638],{},"Not following visual styling or coding rules exactly (for example, having duplicate ids on a single page)",[11,16640,16641],{},"In most real scraping scenarios, you’ll need to choose selectors based on the structural layout of the page. For example, you may choose to scrape the price from a table by its position:",[708,16643,16645],{"className":921,"code":16644,"language":923,"meta":15,"style":15},".product_table > tbody > tr:first-child > td\n",[714,16646,16647],{"__ignoreMap":15},[236,16648,16649],{"class":718,"line":719},[236,16650,16644],{},[11,16652,16653,16654,16657,16658,16661,16662,16665],{},"A neat trick for more annoying issues is to make use of the CSS pseudo-classes ",[16655,16656],"is",{},"(), ",[16659,16660],"any",{},"() and ",[16663,16664],"matches",{},"():",[11,16667,16668],{},[39,16669,16670],{"href":16670,"rel":16671},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F:is",[43],[11,16673,16674],{},"These allow you to use a single selector to grab several different types of elements in one, which can be handy!",[11,16676,16677],{},"axiom.ai’s No-code tool makes heavy use of these when trying to find the most general selector it can, but it’s a tricky problem to completely automate.",[63,16679,16681],{"id":16680},"problem-web-pages-change","Problem: Web Pages Change",[11,16683,16684],{},"Picture this: your scraper is working fine and has been running for weeks - or even months - without a problem.",[11,16686,16687],{},"Then one day it suddenly breaks, spitting out 0 results. What gives?",[11,16689,16690],{},"Your code hasn’t changed. It’s quite likely the page you are scraping has changed, and the content has moved to another place on the page’s HTML.",[129,16692,16694],{"id":16693},"solution-1","Solution",[11,16696,16697],{},"Unfortunately this problem isn’t completely solved; you will need to keep an eye on your scrapers, so they can be fixed when this happens. This can be reduced by choosing the most general selector for an element, as discussed above.",[11,16699,16700],{},"If you can construct an XPath query, you can create regular expressions that will find content with some added flexibility over CSS selectors.",[11,16702,16703],{},"This is particularly useful if you’re trying to scrape structured content like email addresses or phone numbers.  Here’s an XPATH query to scrape email addresses using ‘mailto’ links for example.",[708,16705,16707],{"className":921,"code":16706,"language":923,"meta":15,"style":15},"\u002F\u002Fa[starts-with(@href, 'mailto')]\u002Ftext()\n",[714,16708,16709],{"__ignoreMap":15},[236,16710,16711],{"class":718,"line":719},[236,16712,16706],{},[11,16714,16715],{},"Read more about XPath here:",[11,16717,16718],{},[39,16719,16720],{"href":16720,"rel":16721},"https:\u002F\u002Fwww.w3schools.com\u002Fxml\u002Fxpath_intro.asp",[43],[11,16723,16724],{},"However, this only goes so far. For example, if the developers of a particular website decide to do a complete redesign, there’s likely to be little alternative except to reconfigure the scraper.",[11,16726,16727],{},"If you hire a developer to build your scraper, you should definitely factor in that you will need a maintenance agreement - this is commonly overlooked.",[11,16729,16730],{},"Another approach is to ensure that maintenance is something anyone can do. The usual way is to use a no-code tool that lets you select elements with a visual interface. We’ve gone for this angle with axiom.ai, so that anyone can easily re-select data if it moves around on the page.",[63,16732,16734],{"id":16733},"problem-anti-bot-measures","Problem: Anti-bot measures",[11,16736,16737],{},"Many websites don’t like bots or scrapers 😢",[11,16739,16740],{},"They sometimes detect and block them outright, throw CAPTCHAs, or rate-limit them and add DDOS protection.",[129,16742,16694],{"id":16743},"solution-2",[11,16745,16746],{},"Often bot blocking is implemented as a simple rate limit. If this is the case and your bot’s speed sets off DDOS detectors, or rate-limiters, you can slow your bot down with by adding ‘wait’ steps, preferably for random time intervals. This can work well on social media sites.",[11,16748,16749],{},"Your bot may also be detected and blocked based on metadata in request headers, or similar. This is a game of cat and mouse, but projects like ‘puppeteer stealth’ are good examples of how to be a sneaky mouse 🐭",[11,16751,16752,16753,16757,16758,13],{},"If you are facing CAPTCHA, tools like ",[39,16754,5212],{"href":16755,"rel":16756},"https:\u002F\u002F2captcha.com",[43],"  will let you send the captcha to be solved by a human on demand - very useful! Learn more about out ",[39,16759,16760],{"href":5211},"2Captcha integration",[11,16762,16763,16764,16768],{},"Enabling the \"Bypass bot detection\" option in your automation settings can give you an advantage over the bot blocking tools! This can be used locally and will give you the ability to slip by automatically. Learn more in our ",[39,16765,16767],{"href":16766},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fbypass-bot-detection","Bot Blocking"," documentation.",[63,16770,16772],{"id":16771},"problem-large-scale-scraping-is-slow","Problem: Large-scale scraping is slow",[11,16774,16775],{},"If you want to get simple HTML data, using simple HTTP request tools will do the job quickly.",[11,16777,16778],{},"However, most modern websites use JavaScript, and they often stream in data after the page has been loaded from the web server. Unless you have the time to reverse-engineer each site’s data endpoints, you’ll have to use a web-browser to render pages.",[11,16780,16781],{},"Browsers can be slow, particularly if you’re scrolling and looping through 1000s of pages.",[11,16783,16784],{},"What happens if your long scrape is interrupted? And how can you speed it up?",[129,16786,16694],{"id":16787},"solution-3",[11,16789,16790],{},"We recommend running jobs in batches that write data as you go. If you structure the batching properly, you can pick up from any interruptions easily.",[11,16792,16793],{},"We recommend writing to your output as you progress. In axiom.ai, this is done using Google Sheets.",[11,16795,16796,16799],{},[39,16797,16798],{"href":16798},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets","\nIt’s possible to speed up bots on UI interactions by using keyboard input, and explicitly limiting how much data they should retrieve, or wait for, on each page.",[11,16801,16802,16805],{},[39,16803,16804],{"href":16804},"\u002Fdocs\u002Ftutorials\u002Fspeed-up-run","\nIf you’re scraping a long list, it may also be possible to divide up this list and run multiple bots in parallel to speed up execution (For an alphabetic list example, send A-G to bot 1, H-P to bot 2, R-Z to bot 3)",[11,16807,16808],{},"We do this with axiom.ai on our premium tiers, so you can scrape 3X faster with 3 bots for example.",[63,16810,16812],{"id":16811},"problem-ui-interactions-before-scraping","Problem: UI Interactions before scraping",[11,16814,16815],{},"Websites often hide their content behind clickable elements, or load it in after the initial page load - Facebook’s newsfeed is a good example of this. You will need to initite 'Scroll' events to load content.",[11,16817,16818],{},"Simple HTTP requests are not sufficient here. It will be necessary to use a browser, and perhaps browser automation framework, that can run ‘Click’, ‘Type’ and ‘Scroll’ events.",[129,16820,16694],{"id":16821},"solution-4",[11,16823,16824],{},"If you want to do this in pure code, Selenium and Puppeteer are solid industry standard tools:",[648,16826,16827,16834],{},[190,16828,16829],{},[39,16830,16833],{"href":16831,"rel":16832},"https:\u002F\u002Fwww.selenium.dev\u002Fselenium-ide",[43],"https:\u002F\u002Fwww.selenium.dev\u002Fselenium-ide\u002F",[190,16835,16836],{},[39,16837,16838],{"href":16838,"rel":16839},"https:\u002F\u002Fdevelopers.google.com\u002Fweb\u002Ftools\u002Fpuppeteer",[43],[11,16841,16842],{},"You can automate clicking and waiting for content to load to your heart’s content, but be warned - writing an algorithm to handle waiting for UI actions and loading can be quite hard. With each click, you may need to guess how long the content takes to load.",[11,16844,16845],{},"If you don’t want to write your own algorithms, and would like a no-code approach, axiom.ai is a no-code interface to Google’s Puppeteer framework.",[63,16847,16849],{"id":16848},"bonus-grouping-results","Bonus: Grouping results",[11,16851,16852],{},"This is one people don’t realise until they’re deep into scraping.",[11,16854,16855],{},"The human eye is great at grouping data into structures visually. When you see a layout with a title, phone number and email inside a card, you immediately know it’s all part of the same structure. Computers, however, only see the results of your selectors as lists of text.",[11,16857,16858],{},"Say you’re scraping a list of contacts, and some of the contacts still have landlines (for some reason) while most do not. You want to scrape this landline data, but not every individual has it. When your selectors fire and scrape the data, it ends up like this:",[11,16860,16861],{},"Looks good, right?…",[16863,16864,16865,16878],"table",{},[16866,16867,16868],"thead",{},[16869,16870,16871,16875],"tr",{},[16872,16873,16874],"th",{},"Name",[16872,16876,16877],{},"Number",[16879,16880,16881,16890,16897],"tbody",{},[16869,16882,16883,16887],{},[16884,16885,16886],"td",{},"Hal",[16884,16888,16889],{},"07400596",[16869,16891,16892,16895],{},[16884,16893,16894],{},"Arnie",[16884,16896,16889],{},[16869,16898,16899,16902],{},[16884,16900,16901],{},"Brigitte",[16884,16903],{},[11,16905,16906],{},"Wrong! The problem is that the phone numbers here do not necessarily belong to Hal or Arnie. If Arnie or Hal was missing a landline number, instead of Brigitte, you would still end up with this exact data output.",[11,16908,16909],{},"Building web scrapers to work around this issue can involve careful study of the HTML structure of the page, custom coding, clever xpath and regular expressions, and a lot of patience.",[11,16911,16912],{},"Some tools (axiom.ai included), try to help you with this by finding a parent grouping element and automatically pruning off any elements that fall outside of it, which can help make scraping in these cases much less tedious. Others, like SimpleScraper, prefer to leave it to the user to figure out.",[11,16914,16915],{},"Sometimes the structure of the HTML page can be very different from how the page appears visually. In this case, it can be quite difficult to find valid selectors at all. One day, perhaps visual recognition AI will come along that can solve this problem - but it’s not quite there yet!",[11,16917,16918,16919,16922,16923,13],{},"If you ever get stuck while building web scrapers, please don't hesitate to contact us for ",[39,16920,16921],{"href":521},"one-on-one help"," or take a look at our ",[39,16924,16925],{"href":11271},"Documentation",[802,16927,4722],{},{"title":15,"searchDepth":16,"depth":16,"links":16929},[16930,16937,16940,16943,16946,16949],{"id":16573,"depth":542,"text":16574,"children":16931},[16932,16933,16934,16935,16936],{"id":16586,"depth":16,"text":16587},{"id":16593,"depth":16,"text":16594},{"id":16603,"depth":16,"text":16604},{"id":16610,"depth":16,"text":16611},{"id":16620,"depth":16,"text":16621},{"id":16680,"depth":542,"text":16681,"children":16938},[16939],{"id":16693,"depth":16,"text":16694},{"id":16733,"depth":542,"text":16734,"children":16941},[16942],{"id":16743,"depth":16,"text":16694},{"id":16771,"depth":542,"text":16772,"children":16944},[16945],{"id":16787,"depth":16,"text":16694},{"id":16811,"depth":542,"text":16812,"children":16947},[16948],{"id":16821,"depth":16,"text":16694},{"id":16848,"depth":542,"text":16849},"2022-04-20",{"read":16543,"type":578,"tool":16952,"category":16953,"tags":16954,"pinned":16957,"location":587,"featuredimg":16958,"landingimg":16959,"summary":16960},[580],[4752],[2920,16955,5348,16956],"extract data","xpath","top","\u002Fblog\u002Flarge-scraper.png","\u002Fblog\u002Fscraper.png","Read about the most common problems you find in web scrapers, and get our expert tips on how to fix them!","\u002Fblog\u002F5-problems-webscrapers",{"title":16556,"description":16561},"blog\u002F5-problems-webscrapers","lfcUymYwpzsNPuBEvEPXNTobjZXX_wxGy1l4CKl0Pc0",1782914872305]