Hoe ik moest leren stoppen met zorgen maken en van het hulpprogramma voor hoofdletters houden

Overzicht

Ik schrijf veel tutorials voor Envato Tuts +. Deze handleidingen hebben titels die bepaalde hoofdlettergebruiksregels moeten volgen. Tuts + biedt ons schrijvers een op het web gebaseerd hulpmiddel dat de tekst van een kop neemt en een goed geactiveerde kop geeft. Wanneer ik mijn tutorials schrijf, probeer ik in de flow te komen, en overschakelen naar het hoofdlettergebruik breekt mijn flow. Ik heb het gewoon gevleugeld en doe zelf de hoofdletter. 

Het bleek dat ik vaak fouten maakte, wat extra werk voor de Tuts + -editors tot gevolg had die ze moesten corrigeren. Als programmeur besloot ik om me uit het probleem te programmeren. Ik schrijf nog steeds mijn eigen kopjes, maar als ik klaar ben, voer ik een klein Python-programma uit dat mijn artikel parseert, alle headers detecteert, en vervolgens de tles + hoofdlettertool uitvoert en alle koppen op de juiste manier kapitaliseert. 

Omdat het hulpprogramma voor hoofdlettergebruik een webtoepassing is en geen API, moest ik de browser automatiseren om deze aan te roepen en de hoofdkoppen met hoofdletters te extraheren. In deze zelfstudie leer je hoe je via Selenium de browser in Python kunt besturen en kunt laten doen. 

Hoofdletters kapitaliseren

Hoofdletters gebruiken is geen rocket science, maar het is ook niet triviaal. Er zijn verschillende stijlen, met wat overlap en enkele variaties. Dit is min of meer de consensus:

  • Maak alle woorden hoofdletter met vier of meer letters.
  • Gebruik altijd de eerste en laatste woorden in hoofdletters.
  • Gebruik geen artikelen met hoofdletters: a, an, the.
  • Maak korte conjuncties niet kapitaliseren: of, of, voor, maar, dus, nog niet.

Dan zijn er een aantal uitzonderingen en speciale situaties (bijvoorbeeld koersstromen naar de volgende regel). Maar dit is allemaal moot. Zelfs als ik besloot mijn eigen hoofdlettercode te schrijven, koos Tuts + al voor hun smaak en moest ik me conformeren aan hun gekozen stijl.

De online case-converter

De Tuts + hoofdlettergebruikstool is een interne tool die alleen door Tuts + -instructeurs kan worden gebruikt, dus ik kan het niet als demo gebruiken. Ik vond echter een vergelijkbare tool genaamd Title Case Converter. Het is een webtoepassing met een groot tekstgebied waarin u uw kop (of titel) kunt typen, een converteerknop waarmee u klikt om het formulier in te dienen, een uitvoergebied dat wordt weergegeven met een juiste hoofdletter en tenslotte een kopieerknop die de kopiëert omgezet naar het klembord.

Een plan voor het automatiseren van het hoofdlettergebruik

OK. Ik ga de online case converter gebruiken, maar er is geen API. Dit is geen groot probleem. Ik kan de browser automatiseren en een gebruiker simuleren die de kop in het invoerveld typt, op de knop Converteren klikt, wacht tot de uitvoer verschijnt, op de kopieerknop klikt en tenslotte de juiste hoofdletter van het klembord plakt.

De eerste stap is het kiezen van een browserautomatisering. Ik koos voor Selenium WebDriver, dat ik al eerder met succes heb gebruikt. De rest van het plan is:

  • Start een browser.
  • Navigeer naar de online case converter-URL.
  • Vind alle noodzakelijke elementen.
  • Vul het invoerveld in.
  • Verzend het formulier.
  • Wacht op de output.
  • Klik op de kopieerknop.
  • Lees de hoofdletter van het klembord.

De volledige broncode is te vinden op GitLab.

Introductie van Selenium

Selenium automatiseert browsers sinds 2004. In 2008 fuseerde het met het WebDriver-project, dat een aantal beperkingen van het originele Selenium aanpakt (bijvoorbeeld in de JavaScript-sandbox). 

Selenium biedt nog steeds de originele smaak van Selenium, genaamd Selenium RC (Remote Control). Het heeft ook een IDE voor het schrijven van geautomatiseerde testsuites en een tool genaamd Selenium Grid die Selenium RC schaalt voor grote testsuites die in meerdere omgevingen moeten worden uitgevoerd. We beperken ons tot programmatische toegang tot de browser via de WebDriver API (a.k.a. Selenium 2).

Selenium en een webstuurprogramma installeren

Selenium installeren is zo simpel als pipenv-selenium. Als u niet bekend bent met Pipenv, bekijk dan eens een bezoek aan Python Packaging With Pipenv. U hebt ook een specifieke webdriver nodig. Er zijn webdrivers voor verschillende browsers en back-ends. Je vindt de volledige lijst op de Selenium-website.

Ik heb voor deze zelfstudie het Chrome-webstuurprogramma gekozen. Hier is de nieuwste versie.

Het is een enkel zip-bestand dat een enkel uitvoerbaar bestand bevat (er zijn Windows-, MacOS- en Linux-versies). Zodra je het hebt gedownload, pak je het uit en laat je het op je pad vallen.

Gefeliciteerd! U bent nu klaar om Selenium WebDriver van Python te gebruiken.

De browser openen

Selenium maakt het heel gemakkelijk om een ​​browser te starten. Zolang u de juiste webdriver op uw pad hebt, importeert u gewoon de selenium.webdriver module en bel de juiste methode om uw browser naar keuze te starten:

van selenium import webdriver driver = webdriver.Chrome ()

Navigeren naar een URL

Als u eenmaal een driver-object hebt, kunt u bellen met krijgen() methode om naar een webpagina te navigeren. Ga als volgt te werk om naar de Title Case Converter te gaan: 

driver.get ( 'https://titlecaseconverter.com')

Elementen vinden

We hebben een manier nodig om de elementen te vinden op de pagina waarmee u wilt communiceren. De eenvoudigste manier is om de webpagina in de browser te inspecteren en de id's van de doelelementen te vinden. In de volgende schermafbeelding ziet u dat het invoerveld de ID "title" heeft:

De knop omzetten heeft geen id, maar dat is geen probleem, zoals je snel zult zien. Hier is de code om het formulier en de tekstvelden op id te lokaliseren:

input_field = driver.find_element_by_id ('titel')

Als een element waarmee u wilt communiceren geen ID heeft, kunt u het vinden met behulp van verschillende andere methoden, zoals naam, klassenaam of CSS-selector. Bekijk alle opties in deze Selenium-gids.  

Om bijvoorbeeld de knop omzetten te vinden, heb ik de naam van de klasse gebruikt:

convertButton = \ driver.find_element_by_class_name ('convertButton')

Tekstvelden invullen

Om het invoerveld te vullen, kunnen we de send_keys () methode van ons invoerveldelement. Maar zorg ervoor dat u het eerst opruimt. Anders voeg je gewoon toe aan de bestaande tekst.

input_field.clear () input_field.send_keys (kop) 

Dat was vrij eenvoudig.

Klikken op knoppen en indienen van formulieren

Nu is het tijd om het formulier in te dienen. Je kunt het op twee manieren doen:

  • Zoek het formulierelement op de pagina en bel het submit () methode.
  • Zoek de convert-knop en klik erop.

Ik heb het formulier in eerste instantie rechtstreeks verzonden:

form = driver.find_element_by_css_selector ('body> form') form.submit () 

Om een ​​of andere reden werkt het niet. Er is geen fout, maar er gebeurt niets. Ik heb niet te veel tijd besteed aan het onderzoeken, omdat het hele doel van Selenium en deze tutorial is om een ​​persoon te simuleren. Dus ik gebruikte de andere methode en klikte gewoon op de knop die ik eerder vond:

convertButton.click ()

Wachten op formulierverzending

De online case-converter is enigszins luxe. Het uitvoerveld bestaat in eerste instantie niet. Nadat u op de knop Converteren hebt geklikt en het formulier is verzonden, wordt de uitvoer weergegeven samen met de kopieerknop. Dat betekent dat we moeten wachten tot het indienen van het formulier is voltooid voordat de knop Kopiëren verschijnt en we erop kunnen klikken om de uitvoer naar het klembord te kopiëren.

Selenium heeft jou gedekt. Het heeft ondersteuning voor het wachten op willekeurige omstandigheden en timing wanneer ze zich niet voordoen. Hier is de code die wacht op de kopieerknop. Het creëert een WebDriverWait object met een time-out van vijf seconden. Vervolgens wordt een voorwaarde gemaakt voor de aanwezigheid van een element met de klassenaam copyButton, en dan roept het het wachtobject tot() methode met de voorwaarde.

wait = WebDriverWait (stuurprogramma, 5) buttonPresent = presence_of_element_located ((By.CLASS_NAME, 'copyButton')) copyButton = wait.until (buttonPresent) 

Het resultaat is dat na het klikken op de knop Converteren, deze na vijf seconden zal wachten totdat de knop Kopiëren verschijnt of de time-out optreedt. Als alles goed is, zal het de copyButton element.

De hoofdletter lezen

U kunt de inhoud van tekstvelden lezen met field.get_attribute ( 'value'). Maar, zoals ik eerder al zei, de online case-converter is best wel leuk. De uitvoer is een geneste structuur van overspanningen en divs, en wanneer u over elk deel van de uitvoer zweeft, vertelt het u waarom het met een hoofdletter is geschreven of niet. 

Ik zou dit doolhof kunnen doorgronden en de werkelijke richting kunnen analyseren, maar er is een gemakkelijkere manier. De kopieerknop kopieert de hoofdletter naar het klembord. We kunnen gewoon op de knop klikken en de kop van het klembord lezen. Ik heb de klembordmodule gebruikt, waarmee je kunt installeren pipenv installeer klembord. De onderstaande code wist het klembord door een lege tekenreeks erin te kopiëren, klikt op de kopieerknop en leest het klembord herhaaldelijk totdat het niet leeg is.

clipboard.copy (") copyButton.click () result = clipboard.paste () while not result: time.sleep (0.1) result = clipboard.paste ()

Een volledig afmeldingsdocument kapitaliseren

OK. We kunnen één kop van hoofdletter voorzien. Ik heb al deze code in een enkele functie gezet:

def capitalize_heading (heading): input_field = driver.find_element_by_id ('title') input_field.clear () input_field.send_keys (heading) # form = driver.find_element_by_css_selector ('body> form') # form.submit () convertButton = \ driver .find_element_by_class_name ('convertButton') convertButton.click () # Wacht totdat kopieerknop verschijnt wait = WebDriverWait (stuurprogramma, 5) buttonPresent = presence_of_element_located ((By.CLASS_NAME, 'copyButton')) copyButton = wait.until (buttonPresent) klembord .copy (") copyButton.click () result = clipboard.paste () while not result: time.sleep (0.1) result = clipboard.paste () retourresultaat

Nu, gewapend met deze mogelijkheid, kunnen we een heel artikel ontleden en alle koppen van een hoofdletter voorzien. Ik schrijf mijn tutorials in Markdown. Al mijn koppen beginnen met een of meer hashes (#). 

Ik heb een hulpfunctie gedefinieerd die een regel neemt en, als deze een kop bevat, deze op de juiste wijze kapitaliseert met behulp van de capitalize_heading () functie en geeft het resultaat als resultaat. Het belangrijkste is dat alle toonaangevende hashes en spaties worden verwijderd en later worden hersteld. We kunnen geen kop voeren met voorloopspaties omdat dit de online case converter verwart: 

def capitalize_line (line): tokens = line.split ('#') heading = tokens [-1] space_count = len (heading) - len (heading.lstrip ()) spacing = heading [: space_count] tokens [-1] = spacing + capitalize_heading (heading.lstrip ()) result = '#'. join (tokens) retourneer resultaat

Op dit punt kunnen we een Markdown-kop verzilveren. Het is tijd om een ​​heel Markdown-document te kapitaliseren. Deze code is vrij eenvoudig: alle lijnen herhalen, elke regel die begint met een hash kapitaliseren en de juiste hoofdtekst retourneren:

def capitalize_all_headings (markdown):
 hoofdletter = [] lines = markdown.split ('\ n') voor regel in regels: if line.startswith ('#'): line = capitalize_line (line) print (line) capitalized.append (regel) return '\ n ' .join (hoofdletter)

De hoofdfunctie gebruikt een Markdown-document voor invoer, maakt het hoofdlettergebruik en slaat het resultaat op als "hoofdlettergebruik.md", dat u kunt controleren en gebruiken. Het enige waar je voorzichtig mee moet zijn, is of je Markdown-document niet-heading-regels bevat die met een hash beginnen. Dit kan gebeuren als u codeblokken bestuurt die Python- of bash-opmerkingen bevatten.

Leuk feit - de tutorial die je nu aan het lezen bent werd met dit programma gekapitaliseerd.

Conclusie

Door de browser te automatiseren, kunt u programmatisch controle krijgen over webtoepassingen die geen API bieden. Dit is vooral handig voor het invullen van formulieren en andere interactieve webactiviteiten (op lange EULA's op 'Volgende' klikken?). 

Selenium is voornamelijk ontworpen voor het testen van webtoepassingen, maar het is geweldig voor het automatiseren van elke browsergebaseerde interactie. Als u een beetje denkt, kunt u waarschijnlijk veel webtoepassingen vinden die u kunt automatiseren en uw leven gemakkelijker kunt maken.