【发布时间】:2020-08-13 12:17:54
【问题描述】:
我想创建 GENERIC python 代码,它将日、月和年填入正确的字段。
但不知道怎么做。
在第一个例子中,我们可以看到label 和input 之间通过使用for 参数建立了联系(但是我们需要从标签中获取for 参数并以某种方式检查它是否包含日、月等)
在第二个示例中,我们可以看到 input 没有任何 ID,通过 span 包装器。所以我们可以将label 与span 联系起来,然后以某种方式使用following::/input[0,1,2] 查找DAY、MONTH 等。
问题:是否有任何可能的方法来创建适用于第一个和第二个示例的通用代码?任何最佳做法?
第一个网站:
<div data-readonly="False">
<label for="Applicants_0__DateOfBirth">Date of birth</label>
<div class="rhsForm">
<input type="text" class="split-date-hidden hasDatepicker" id="dp1587032701992">
<input class="split-date-day" data-val="true" data-val-number="Please enter a valid date (day)" data-val-range="Please enter a valid date (day)" data-val-range-max="31" data-val-range-min="1" id="Applicants_0__DateOfBirth_Day" maxlength="2" name="Applicants[0].DateOfBirth.Day" placeholder="DD" type="text" value="">
<span class="field-validation-valid" data-valmsg-for="Applicants[0].DateOfBirth.Day" data-valmsg-replace="true"></span>
<span class="split-date-separator"> </span>
<input class="split-date-month" data-val="true" data-val-number="Please enter a valid date (month)" data-val-range="Please enter a valid date (month)" data-val-range-max="12" data-val-range-min="1" id="Applicants_0__DateOfBirth_Month" maxlength="2" name="Applicants[0].DateOfBirth.Month" placeholder="MM" type="text" value="">
<span class="field-validation-valid" data-valmsg-for="Applicants[0].DateOfBirth.Month" data-valmsg-replace="true"></span>
<span class="split-date-separator"> </span>
<input class="split-date-year" data-val="true" data-val-number="Please enter a valid date (year)" data-val-range="Please enter a valid date (year)" data-val-range-max="5000" data-val-range-min="1000" id="Applicants_0__DateOfBirth_Year" maxlength="4" name="Applicants[0].DateOfBirth.Year" placeholder="YYYY" type="text" value="">
<span class="field-validation-valid" data-valmsg-for="Applicants[0].DateOfBirth.Year" data-valmsg-replace="true"></span>
<img class="split-date-calendar-button" src="./Create a case _ the Coventry for intermediaries 3_files/CalendarIcon.png" alt="Show calendar">
<span class="field-validation-valid" data-valmsg-for="Applicants[0].DateOfBirth" data-valmsg-replace="true"></span>
</div>
</div>
第二个网站:
<div class="sel formItemContainer" f-class="EntryRow" f-hasreadonlyrulebeenappliedbefore="True" f-isreadonly="False">
<div class="emc" id="Entry.Customer.C1.BirthDateEmc" f-hasreadonlyrulebeenappliedbefore="True" f-isreadonly="False"></div>
<label class="sc" for="Entry.Customer.C1.BirthDate" f-hasreadonlyrulebeenappliedbefore="True" f-isreadonly="False">Date of birth</label>
<div class="si" f-hasreadonlyrulebeenappliedbefore="True" f-isreadonly="False">
<span f-class="PatternEntry" f-iscustom="True" f-valuetype="Date" f-minimumlength="3" f-validationname="date of birth" f-isrequired="True" f-isrequiredrule="System.True" f-isreadonlyrule="Data.Customers.C1.AuthenticatedOrPersonalDetailsReadOnly" id="Entry.Customer.C1.BirthDate" value="23/02/1990" f-entryname="Customer.C1.BirthDate" f-submitsdata="True" class="date" xmlns:msxsl="urn:schemas-microsoft-com:xslt" f-hasreadonlyrulebeenappliedbefore="True" f-isreadonly="False" f-readonlyruleresult="False">
<input type="text" f-class="PatternPart" f-iscustom="True" f-behaviours="formItemChanged" value="444" maxlength="2" size="2" f-parttype="substring" f-partstart="1" f-partlength="2" f-isreadonly="False" f-hasreadonlyrulebeenappliedbefore="True" c-originalvalue="23/02/1989">
<span f-class="PatternPart" f-parttype="static" f-value="/" f-hasreadonlyrulebeenappliedbefore="True" f-isreadonly="False">/</span>
<input type="text" f-class="PatternPart" f-iscustom="True" f-behaviours="formItemChanged" value="02" maxlength="2" size="2" f-parttype="substring" f-partstart="4" f-partlength="2" f-isreadonly="False" f-hasreadonlyrulebeenappliedbefore="True" c-originalvalue="23/02/1989">
<span f-class="PatternPart" f-parttype="static" f-value="/" f-hasreadonlyrulebeenappliedbefore="True" f-isreadonly="False">/</span>
<input type="text" f-class="PatternPart" f-iscustom="True" f-behaviours="formItemChanged" value="1989" maxlength="4" size="4" f-parttype="substring" f-partstart="7" f-partlength="4" f-isreadonly="False" f-hasreadonlyrulebeenappliedbefore="True" c-originalvalue="23/02/1989">
</span>
</div>
</div>
让我们使用参数:
d = '01'
m = '02'
y = '1933'
ar = [d,m,y]
那么potential 代码将是:
l = 'Date of birth'
fls = browser.find_elements_by_xpath('//label[contains(.,"{}")]'.format(l))
if fls:
# loop through array <<ar>> and pass each value one by one
element = browser.find_elements_by_xpath('//*[@id="{}"]'.format(fls[0].get_attribute("for")))
if element:
containtInput = element[0].tag_name.lower() == "input"
if containtInput:
x = element[0].find_elements_by_xpath(./following::/input[0])
x.send_keys(value)
break
【问题讨论】:
标签: python html selenium input automation