automate filling in web forms - python

There is a text box (ID) on the website and I want to put 10,000 data in it. After placing each data in this text box, results are displayed in other text boxes according to the ID.
Textbox ID :
<input class="form-control ltr left text-box single-line" data-val="true" data-val-regex="It is 10 numbers" data-val-regex-pattern="^[0-9]{10}$" data-val-required="*required" id="NId" maxlength="10" name="NId" onblur="LoadInfo()" type="text" value="">
Textobx Name (fill after enter the ID in text box) :
<form action="/Employees/Manager/SavePerson" data-ajax="true" data-ajax-begin="onpostcreatebegin" data-ajax-complete="onpostcreatecomplete" data-ajax-loading="#ajaxloading" data-ajax-method="post" data-ajax-mode="replace" data-ajax-update="#result" id="form0" method="post" novalidate="novalidate"><input name="__RequestVerificationToken" type="hidden" value="asdxBadsP7CpS53654as6dadH3865asdadKhjasdad"> <input type="hidden" name="empId" id="empid" value="0">
<div class="panel panel-info">
<div class="panel-body">
<input data-val="true" data-val-regex="It is 10 numbers" data-val-regex-pattern="^[0-9]{10}$" data-val-required="*required" id="NId" name="NId" type="hidden" value="1234567890">
<input data-val="true" data-val-number="The field PersonId must be a number." data-val-required="The PersonId field is required." id="PersonId" name="PersonId" type="hidden" value="254102232">
<input data-val="true" data-val-required="The GuidId field is required." id="GuidId" name="GuidId" type="hidden" value="665xs6asd-cxc2-wq56-8888-30654998b166">
<div class="form-group">
<div class="col-md-4">
<input class="form-control text-box single-line" data-val="true" data-val-regex="enter the name." data-val-regex-pattern="^[\u0600-\u06ff\s]+$|[\u0750-\u077f\s]+$|[\ufb50-\ufc3f\s]+$|[\ufe70-\ufefc\s]+$|[\u06cc\s]+$|[\u067e\s]+$|[\u06af\s]$|[\u0691\s]+$|^$" data-val-required="*required" id="Firstname" name="Firstname" type="text" value="jack">
<span class="field-validation-valid text-danger" data-valmsg-for="Firstname" data-valmsg-replace="true"></span>
</div>
</div>
</div>
</div>
</form>
The page will not reload after entering the value in the text box ID. Shows the value on that page. What solution do you suggest? I do not know which method to consider that is the most optimal method. Can you introduce the most optimal and practical method?

Depending on how complex the task is, you can use either Selenium (Selenium is a script-controlled Browser) with Firefox WebDriver, for example.
It is of course also possible to use the request methods GET and POST as a method with more work but much higher performance.

Related

Trying to identify the elements below, with differing IDs (Selenium & Python) using CSS selector or XPATH

Here are 3 sample elements on the page:
<label class="btn btn-primary"> <input type="radio" id="Q20_0_0-A27" name="Q20_0_0" autocomplete="off" value="27" class="sr-only" onchange="$('#Q20_0_0_change').val('1');wiz.reload();" aria-describedby="Q20_0_0Text" required=""> Compliant </label>
<label class="btn btn-primary"> <input type="radio" id="Q20_1_0-A27" name="Q20_1_0" autocomplete="off" value="27" class="sr-only" onchange="$('#Q20_1_0_change').val('1');wiz.reload();" aria-describedby="Q20_1_0Text" required=""> Compliant </label>
<label class="btn btn-primary"> <input type="radio" id="Q20_2_0-A27" name="Q20_2_0" autocomplete="off" value="27" class="sr-only" onchange="$('#Q20_2_0_change').val('1');wiz.reload();" aria-describedby="Q20_2_0Text" required=""> Compliant </label>
As you can see the IDs are in the form of Q20_*_0-A27, where * ranges from 0-15.
My aim is to click on these elements / buttons to 'activate them, which loads the page to change the clicked button into:
example with #1.
<label class="btn btn-primary active"> <input type="radio" id="Q20_0_0-A27" name="Q20_0_0" autocomplete="off" value="27" class="sr-only" onchange="$('#Q20_0_0_change').val('1');wiz.reload();" aria-describedby="Q20_0_0Text" required=""> Compliant </label>
Below is my code, and I can't seem to identify the right element
try:
# Find the link with the specified text and class
elements = driver.find_elements(By.CSS_SELECTOR, 'label.btn.btn-primary input[id^="Q20_"][id$="-A27"]')
print(f'Number of elements found: {len(elements)}')
for element in elements:
element_id = element.get_attribute('id')
print(f'Element ID: {element_id}')
element.click()
input("Press Enter to continue...")
except NoSuchElementException:
# The element was not found, so wait and try again
time.sleep(1)
print("retrying")
continue
As you can see the IDs are in the form of Q20_*_0-A27, where * ranges
from 0-15.
You can use the built-in range() function:
for num in range(0,28):
driver.find_element(By.CSS_SELECTOR, f'#Q20_{num}_0-A27')).click()
I haven't tested, but you might be able to use a more generic CSS selector altogether:
label.btn

FLASK app: Sending data from a Form through another script while one "input" is a dynamic paragraph

I have a from with three possible inputs to submit and send through a seperate script that then generates JSON data.
The problem is however while two inputs are actual inputs = one email and one being a nummer. The third one is not a really traditional input.
<form action="{ url_for('handle_data') }}" method="POST">
<div class="form-group">
<label for="Speryear">SPER jaar</label>
<input class="form-control" type="number" value="2" name="Speryear" min=0 max=10 />
</div>
<div class="form-group">
<div class="form-group">
<label for="inputEmail">Verzendings mail</label>
<input class="form-control" type="email" name="inputEmail" required />
</div>
</div>
<div class="form-group">
<div class="url-panel">
<p> <b>Url:</b></p>
<p id="api-url" name="api-url"></p>
</div>
</div>
<button id="search" type="submit" class="btn-primary">
Aanvraag indienen</button>
</form>
#app.route('/handle_data', methods=['POST'])
def handle_data():
sper_year = request.form["Speryear"]
email = request.form["inputEmail"]
url = request.form["api-url"]
Requested_data = GIPOD_converter.main(url, sper_year, email)
return Requested_data
The third input is actually a paragraph which is dynamically based on the values of a second form (the primary from) for the data requests. According to this post here:
Sending data from a html non-input to Flask
HTML forms only send along tagged values to the remote endpoint when a "submit" input is pressed.
I have tried to make this paragraph a data input but the thing is this will break the javascript I have for that specific id. Aka a the URL part that I want cannot be generated in the input field. So can my code get the paragraph from this?
Edits done as per answer.
I think you should end the app route with:
return Requested_data
Also, you do not define correctly to the url form, i.e.:
url = request.form["api-url"]

html dropdown containing list python output

I am trying to use the list from my python output into a dropdown menu in an HTML form.
I have a website built in HTML/ CCS, a server with nodeJS, and several scripts i want to use in python3.
I currently have no idea how to integrate the python output to the dropdown. Do i need to use Javascript or my node server is enough?
My HTML form
<form action="/LUNProvisionning" method="post">
<fieldset>
<legend>LUN Provisionning</legend>
<br />
<label>Choix du serveur : </label>
<select id="serveur" name="serveur">
# put python output here!!
<option value="1">no serveurs</option>
</select>
<br />
<label>Volumétrie en Go 5 - 1000 : </label>
<input type="number" min="5" max="1000" placeholder="500" name="volumetrie" required>
<br />
<label>Type de provisionning : </label>
<select id="provisionning" name="type" required>
<option value="Thin">Thin</option>
<option value="Deco">Deco</option>
</select>
<br/>
<input type="submit" value="Submit">
</fieldset>
</form>
python output:
SSD_r1
SSD_r5
SSD_r6
fs_cpg
CPG4S2
These need to be in the dropdown above.
I have a node server that i can show if it's relevant.
Thank you very much for your help.
Any informations or links, anything can help.

I am unable to select/enter data into a text area using selenium

Below is the html code of text area I am trying to automate :
<div class="large-5 end columns chckOutNote">
<input id="LocationNotes_0__LocationNumber"
name="LocationNotes[0].LocationNumber" type="hidden" value="Location1">
<input id="LocationNotes_0__ServiceProviderName"
name="LocationNotes[0].ServiceProviderName" type="hidden" value="trial">
<input id="LocationNotes_0__WasPreviouslyFilled"
name="LocationNotes[0].WasPreviouslyFilled" type="hidden"
value="False">
<label for="LocationNotes_0__Note"> trial</label>
<br>
<span id="LocationNotes_0__Note">500</span> characters
remaining
<textarea class="counterpart" data-counter-
part="#LocationNotes_0__Note" data-max="500" data-val="true" data-val-
length="The field Note must be a string with a maximum length of 500."
data- val-length-max="500" data-val-required="The Note field is
required."id="LocationNotes_0__Note" name="LocationNotes[0].Note"
rows="10">
</textarea>
</div>
I tried to click on the element and then enter the data thru send keys but its throwing an error that it cannot find the focus of the element

Multiple inputs with same name through POST in bootstrap?

Multiple inputs with same name through POST in php
I've looked at this and I was hoping I could get something similar with python and bootstrap but it just shows Nonetype with "key[]" or the last value if I just use "key".
<div class="form-check">
<label class="form-check-label" tal:repeat="a keys">
<input type="checkbox" name="key[]" value="${a.id}">${a.name}
</label>
</div>
Is there a way to do this?

Categories