Python selenium3 IE11及 chrome 关于readonly 属性移除的乌龙

    xiaoxiao2022-07-12  144

    碰到selenium控制输入日期类input控件时,由于HTML网页中采用了类似 <input type=“text” name=“card_end_date_disp” size=“12” value=“2022-07-11r” οnclick=“calendar.show(this);” readonly=“readonly” class=“calimg”> 的语句,输入该位置的日期时,必须先移去 readonly属性。网上这类文章还挺多,一般是调用js ,多数针对 input 中有ID 标识的。 js=“document.getElementById(‘xxx’).removeAttribute(‘readonly’)” browser.execute_script(js) 然后按一般的selenium的find_element_by_id(‘xxx’).send_keys(‘2032-12-31’)的办法。 为此我还认真去学习了js全套教程。 由于我的应用中 input 定位没有ID,只有name=“card_end_date_disp”,自然会使用js=“document.getElementsByName(“card_end_date_disp”)[0].removeAttribute(‘readonly’)“去完成。 结果在不同的浏览器中出了乌龙,chrome中这种写法完全可行。到了IE中死活不对。报错:InvalidElementStateException:Element must not be read-only or disabled. 明显是removeAttibute方法没有起作用。 换种写法: inpu_xpos=browser.find_element_by_xpath(va) #va 是xpath标识定位串 browser.execute_script(“arguments[0].removeAttribute(‘readonly’)”,inpu_xpos) 问题一样出。 最后发现,在IE浏览器必须写成 readOnly!!!,o–>O (大写O)!! 总结发现IE与Chorme如下结果: 方法或属性 IE Chrome removeAttribute(“readonly”) 错误 正确 removeAttribute(“readOnly”) 正确 正确 getAtrribute(“readonly”) 正确 正确 getAttribute(“readOnly”) 正确 正确 setAtrribute(“read only”,true) 错误 正确 setAtrribute(“readOnly”,””) 错误,值必须true 正确 setAttribute(“readOnly”,true) 正确 正确 setAttribute(“readOnly”,false) 正确 正确 这段代码的核心都在这里了。自己记录一下:

    from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditiins as EC from selenium.webdriver.support import WebDriverWait,Select from selenium.common.exceptions import TimeoutException from openpyxl import load_workbook def byurlfilldata(fname): wb=load_workbook(filename=fname,read_only=True) ws=wb.active for i in range(2,ws.max_row+1): #跳过表头 urlf=ws.cell(row=i,column=ws.max_column).value #取出最后栏里的回填URL browser.get(urlf) #打开网页,准备填写,colrow='AR'+str(i),ws[colrow].value try: sav_butt=wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR,'#form0 > div:nth-child(6) > div > span > a:nth-child(1)')) ) #下载按钮 except TimeoutException: return ('超时错!') for k,va in gl_comp_dic.items(): #gl_comp_dic{}全局字典 epos=gl_col_dict[k]+str(i) #取出 "M1"等excel文档的列元素位置,gl_col_dict{}全局字典 fval=ws[epos].value #取出对应的值,如M1=“居民身份证或临时身份证” if fval is not None: #不是空或者None if 'select' in va : # select 定位 xpath表示法://select[@name='citp'] wpos=Select(browser.find_element_by_xpath(va)) # 下拉框操作 wpos.select_by_visible_text(fval) #写入数据 else: # input 定位,对公"证件到期日"要做去掉read_only属性的动作 inpu_xpos=browser.find_element_by_xpath(va) if (k=='证件到期日'): browser.execute_script("arguments[0].removeAttribute('readOnly')",inpu_xpos) inpu_xpos.clear() #清理原页面输入框中的数据 inpu_xpos.send_keys(fval) #把公司web新值写入 sav_butt.click() #处理下一条记录 wb.close() #Done,close the opened excel table def main(): .login_noss(....) byurlfilldata('name.xlsx') browser.close() ........... browser=webdriver.Ie() #browser=webdriver.Chrome() wait=WebDriverWait(browser,20) gl_col_dict={'客户号':'K','客户名称':'L'..........} gl_comp_dic={'证件类型':"//select[@name='citp']", '证件号码':"//input[@name='ctid']", ................... '证件到期日':"//input[@name='card_end_date_disp']"} if __name__=='__main__': main()
    最新回复(0)