Hvordan jeg lærte å slutte å bekymre meg og elske kapitaliseringsverktøyet

Oversikt

Jeg skriver mange opplæringsprogrammer for Envato Tuts +. Disse opplæringene har overskrifter som må følge visse regler for kapitalisering. Tuts + gir oss forfattere et nettbasert verktøy som tar teksten til en overskrift og returnerer en riktig kapitalisert overskrift. Når jeg skriver mine opplæringsprogrammer, prøver jeg å komme inn i strømmen, og bytte til hovedverktøyet bryter strømmen min. Jeg pleide å bare vinge den og gjøre selve kapitaliseringen. 

Det viser seg at jeg ofte gjorde feil, noe som medførte ekstraarbeid for Tuts + redaktørene som måtte rette dem. Å være programmerer bestemte jeg meg for å programmere meg ut av problemet. Jeg skriver fortsatt mine egne overskrifter, men når jeg er ferdig, kjører jeg et lite Python-program som analyserer artikkelen min, oppdager alle topptekstene, og kjører dem gjennom Tuts + kapitaliseringsverktøyet og lager alle overskriftene riktig.. 

Siden kapitaliseringsverktøyet er et nettbasert program og ikke en API, måtte jeg automatisere nettleseren for å påkalle den og trekke ut de aktiverte overskriftene. I denne opplæringen lærer du hvordan du kontrollerer nettleseren i Python via Selen, og gjør at det gjør budgivning. 

Slik kapitaliserer overskrifter

Kapitalisering av overskrifter er ikke rakettvitenskap, men det er heller ikke trivielt. Det er flere stiler, med noen overlapper og noen variasjoner. Dette er mer eller mindre konsensus:

  • Kapitaliser alle ord med fire eller flere bokstaver.
  • Alltid kapitalisere de første og siste ordene.
  • Ikke kapitaliser artikler: a, an, the.
  • Ikke kapitaliser korte sammenhenger: og, eller, heller ikke, for, men, så, ennå.

Deretter er det en rekke unntak og spesielle situasjoner (for eksempel overskrift strømmer til neste linje). Men dette er alt sammen. Selv om jeg bestemte meg for å skrive min egen kapitaliseringskode, valgte Tuts + allerede smaken deres og jeg må være i overensstemmelse med deres valgte stil.

The Online Case Converter

Tuts + kapitaliseringsverktøyet er et internt verktøy som bare skal brukes av Tuts + instruktører, så jeg kan ikke bruke det som en demo. Imidlertid fant jeg et lignende verktøy kalt Title Case Converter. Det er et webprogram med et stort tekstområde hvor du kan skrive overskriften (eller tittelen), en konverteringsknapp som du klikker for å sende skjemaet, et utdataområde som vises med en riktig kapitalisert overskrift, og til slutt en kopieringsknapp som kopierer konvertert overskrift til utklippstavlen.

En plan for automatisering av kapitaliseringsverktøyet

OK. Jeg skal bruke online case converter, men det er ingen API. Dette er ikke et stort problem. Jeg kan automatisere nettleseren og simulere en bruker som skriver overskriften inn i inntastingsfeltet, klikker på konverteringsknappen, venter på at utgangen skal vises, klikker på kopieringsknappen og til slutt limer inn riktig kapitalisert overskrift fra utklippstavlen..

Det første trinnet er å velge en nettleserautomatisering. Jeg valgte Selenium WebDriver, som jeg har brukt med hell før. Resten av planen er:

  • Start en nettleser.
  • Naviger til nettadressen til konverteringsadressen til nettadressen.
  • Finn alle de nødvendige elementene.
  • Fyll inn feltet.
  • Send inn skjemaet.
  • Vent på utgangen.
  • Klikk på kopieringsknappen.
  • Les den kapitaliserte overskriften fra utklippstavlen.

Den komplette kildekoden finnes på GitLab.

Introduksjon til Selen

Selen har automatisert nettlesere siden 2004. I 2008 slått det sammen med WebDriver-prosjektet, som adresserer noen av begrensningene til det opprinnelige selenet (for eksempel kjører i JavaScript-sandboksen). 

Selen tilbyr fortsatt den originale smaken av Selen som heter Selenium RC (Fjernkontroll). Den har også en IDE for å skrive automatiserte testpakker og et verktøy kalt Selenium Grid som skalerer Selenium RC for store testpakker som må kjøre i flere miljøer. Vi vil begrense oss til programmatisk tilgang til nettleseren gjennom WebDriver API (a.c. Selen 2).

Installere selen og en webdriver

Installasjon av Selen er like enkelt som pipenv selen. Hvis du ikke er kjent med Pipenv, sjekk ut Revisiting Python Packaging With Pipenv. Du trenger også en bestemt nettdriver. Det finnes webdrivere for forskjellige nettlesere og bakender. Du finner den komplette listen på nettsiden til Selen.

Jeg valgte Chrome-nettdriveren for denne opplæringen. Her er den nyeste versjonen.

Det er en enkelt zip-fil som inneholder en enkelt kjørbar (det finnes Windows, MacOS og Linux versjoner). Når du har lastet ned den, pakker du den ut og slipper i banen.

Gratulerer! Du er nå klar til å bruke Selenium WebDriver fra Python.

Lanserer nettleseren

Selen gjør det veldig enkelt å starte en nettleser. Så lenge du har den riktige nettdriveren i veien, importerer du bare selenium.webdriver modul og ring den riktige metoden for å starte din nettleser:

fra selenimport webdriver driver = webdriver.Chrome ()

Naviger til en URL

Når du har et driverobjekt, kan du ringe få() metode for å navigere til hvilken som helst nettside. Slik navigerer du til Title Case Converter: 

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

Finne elementer

Vi trenger en måte å finne elementene på siden du vil samhandle med. Den enkleste måten er å inspisere nettsiden i nettleseren og finne ids for målelementene. I det følgende skjermbildet kan du se at inntastingsfeltet har ID-tittelen:

Konverterknappen har ingen id, men det er ikke noe problem som du ser snart. Her er koden for å finne skjemaet og tekstfeltene etter id:

input_field = driver.find_element_by_id ('title')

Hvis et element du vil samhandle med, ikke har et ID, kan du finne det ved hjelp av forskjellige andre metoder, for eksempel navn, klassenavn eller CSS-velg. Se alle alternativene i denne Selen-veiledningen.  

For eksempel, for å finne konverterings-knappen, brukte jeg sitt klassenavn:

convertButton = \ driver.find_element_by_class_name ('convertButton')

Populere tekstfelt

For å fylle innfeltfeltet kan vi bruke send_keys () metode for vårt inngangsfeltelement. Men sørg for å rydde det først. Ellers vil du bare legge til den eksisterende teksten.

input_field.clear () input_field.send_keys (overskrift) 

Det var ganske enkelt.

Klikk på knapper og sende inn skjemaer

Nå er det på tide å sende inn skjemaet. Du kan gjøre det på to måter:

  • Finn skjemaelementet på siden og ring det sende inn() metode.
  • Finn konverterknappen og klikk den.

Jeg sendte inn skjemaet direkte:

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

Av en eller annen grunn virker det ikke. Det er ingen feil, men ingenting skjer. Jeg brukte ikke for mye tid på å undersøke fordi hele punktet med Selen og denne opplæringen er å simulere en person. Så jeg brukte den andre metoden og klikket bare på knappen jeg fant tidligere:

convertButton.click ()

Venter på skjemainnlevering

Den elektroniske case-omformeren er litt fancy. Utdatafeltet eksisterer ikke i utgangspunktet. Etter at du har klikket på konverterknappen og skjemaet er sendt, vises utgangen sammen med kopieringsknappen. Det betyr at vi må vente til skjemainnlegget er fullført før kopieringsknappen vises, og vi kan klikke på det for å kopiere utgangen til utklippstavlen.

Selen har fått deg dekket. Den har støtte for å vente på vilkårlig vilkår og tidsplanlegging hvis de ikke materialiseres. Her er koden som venter på kopieringsknappen. Det skaper en WebDriverWait objekt med en fem-sekunders timeout. Det skaper en betingelse for tilstedeværelsen av et element med klassenavnet copyButton, og så kaller det ventetilstanden før() metode med tilstanden.

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

Resultatet er at etter å ha klikket på konverteringsknappen, vil det vente til kopieringsknappen vises eller tidsavbrudd etter fem sekunder. Hvis alt er bra, vil det returnere copyButton element.

Leser den kapitaliserte overskriften

Du kan lese innholdet i tekstfelt med field.get_attribute ( 'verdi'). Men som jeg nevnte tidligere, er online-tilfelleomformeren ganske snill. Dens utgang er en nestet struktur av spenner og divs, og når du svinger over hver del av produksjonen, forteller den deg hvorfor den er aktivert eller ikke. 

Jeg kunne bore ned denne labyrinten og analysere selve overskriften, men det er en enklere måte. Kopieringsknappen kopierer den aktiverte overskriften til utklippstavlen. Vi kan bare klikke på knappen og lese overskriften fra utklippstavlen. Jeg brukte klippebordsmodulen, som du kan installere med pipenv installere utklippstavlen. Koden nedenfor fjerner utklippstavlen ved å kopiere en tom streng inn i den, klikke på kopieringsknappen, og leser gjentatte ganger utklippstavlen til den ikke er tom.

clipboard.copy (") copyButton.click () result = clipboard.paste () mens ikke resultatet: time.sleep (0.1) result = clipboard.paste ()

Kapitalisering av et helt markdown-dokument

OK. Vi kan kapitalisere en enkelt overskrift. Jeg legger all denne koden i en enkelt funksjon:

def capitalize_heading (heading): input_field = driver.find_element_by_id ('title') input_field.clear () input_field.send_keys (overskrift) # form = driver.find_element_by_css_selector ('body> form') # form.submit () convertButton = \ driver .find_element_by_class_name ('convertButton') convertButton.click () # Vent til kopieringsknappen vises wait = WebDriverWait (driver, 5) buttonPresent = presence_of_element_located ((By.CLASS_NAME, 'copyButton')) copyButton = wait.until (buttonPresent) utklippstavle .copy (") copyButton.click () result = clipboard.paste () mens ikke resultatet: time.sleep (0.1) result = clipboard.paste () returresultat

Nå, bevæpnet med denne evnen, kan vi analysere en hel artikkel og kapitalisere alle overskriftene. Jeg skriver mine opplæringsprogrammer i Markdown. Alle mine overskrifter starter med en eller flere hashes (#). 

Jeg definerte en hjelperfunksjon som tar en linje, og hvis den inneholder en overskrift, kapitaliserer den riktig ved hjelp av capitalize_heading () funksjon og returnerer resultatet. Det viktigste er å strippe alle ledende hashene og mellomrom og gjenopprette dem senere. Vi kan ikke mate en overskrift med ledende mellomrom fordi det forvirrer den elektroniske case converteren: 

def capitalize_line (linje): tokens = line.split ('#') overskrift = tokens [-1] space_count = len (overskrift) - len (heading.lstrip ()) avstand = overskrift [: space_count] tokens [-1] = avstand + capitalize_heading (heading.lstrip ()) result = '#'. bli med (tokens) returresultat

På dette tidspunktet kan vi kapitalisere en Markdown-overskrift. Det er på tide å kapitalisere et hele Markdown-dokument. Denne koden er ganske enkel-iterate over alle linjene, kapitaliser hver linje som starter med en hash, og returner den riktig kapitaliserte teksten:

def capitalize_all_headings (markdown):
 capitalized = [] lines = markdown.split ('\ n') for linje i linjer: hvis line.startswith ('#'): line = capitalize_line (linje) print (linje) capitalized.append (line) return '\ n ' .join (med store bokstaver)

Hovedfunksjonen tar et input Markdown-dokument, kapitaliserer det og lagrer resultatet som "capitalized.md", som du kan sjekke og bruke. Det eneste du må være forsiktig med er om Markdown-dokumentet inneholder ikke-overskriftslinjer som starter med en hash. Dette kan skje hvis du har hovedkodblokker som inneholder Python eller bash-kommentarer.

Morsomt faktum - opplæringen du leser akkurat nå, ble kapitalisert ved hjelp av dette programmet.

Konklusjon

Ved å automatisere nettleseren kan du programmatisk ta kontroll over webapplikasjoner som ikke gir en API. Dette er nyttig for det meste for utfylling av skjemaer og andre interaktive webaktiviteter (klikk "Neste" på lange EULAer?). 

Selen ble først og fremst designet for testing av webapplikasjoner, men det er flott å automatisere alle nettleserbaserte samhandlinger. Hvis du tenker litt, kan du sikkert finne mange webapplikasjoner som du kan automatisere og gjøre livet ditt enklere.