python+selenium運行多次新增項目腳本(出錯的元素通過by_id的方式定位),當第三次新增時報Message: element not visible的錯誤,加入等待時間,等頁面加載完成,仍舊報相同的錯誤,錯誤如下圖:
分析原因:前兩次新增都是成功的,說明定位元素的代碼沒有問題; 加入等待時間還是報錯,排除了頁面沒有加載完成的原因
打開開發者模式(F12),在控制台用id進行定位,發現出現了兩個元素:
其中索引為1的元素是正常的,鼠標放到上面,瀏覽器也可識別出來,但索引為0的元素有后綴.form-control,鼠標放到上面瀏覽器也不能識別,具體怎么出來的這個元素,目前還不太清楚需要進一步探究。
進一步試驗發現第二次新增時,通過id進行定位發現該元素就出現了兩次。也就是說通過id定位出兩個相同元素,但是腳本中對元素的操作是單元素操作,所以程序無法識別出元素,就報上述錯誤。
解決方法:
方法一:
先定位出元素列表,判斷元素的大小,更改索引值
def choose_account_type(self):
choice_account_type = random.randint(1, 2)
if choice_account_type == 1:
css_account_type_current_account = self.add_merchant_v2_config_ini.get_ini_value \
("add_merchant_v2.ini", "bank_accounts", "current_account")
el_account_type_current_account_list = self.driver.getElenments(css_account_type_current_account)
if len(el_account_type_current_account_list) > 1:
n = 1
else:
n = 0
self.driver.click1(el_account_type_current_account_list[n])
else:
css_account_type_current_account = self.add_merchant_v2_config_ini.get_ini_value \
("add_merchant_v2.ini", "bank_accounts", "saving_account")
el_account_type_current_account_list = self.driver.getElenments(css_account_type_current_account)
if len(el_account_type_current_account_list) > 1:
n = 1
else:
n = 0
self.driver.click1(el_account_type_current_account_list[n])
方法二:
在函數中增加一個參數,當n超過1時,先定位出一組元組,然后再對其中的元素進行操作。代碼如下:
def choose_account_type(self, n=0):
if n < 1:
choice_account_type = random.randint(1, 2)
if choice_account_type == 1:
css_account_type_current_account = self.add_merchantR2_config_ini.get_ini_value("add_merchantR2.ini",
"bankaccounts",
"current_account")
self.driver.click(css_account_type_current_account)
else:
css_account_type_saving_account = self.add_merchantR2_config_ini.get_ini_value("add_merchantR2.ini",
"bankaccounts",
"saving_account")
self.driver.click(css_account_type_saving_account)
else:
time.sleep(0.5)
choice_account_type = random.randint(1, 2)
if choice_account_type == 1:
css_account_type_current_account = self.add_merchantR2_config_ini.get_ini_value("add_merchantR2.ini",
"bankaccounts",
"current_account")
el_account_type_current_account_list = self.driver.getElenments(css_account_type_current_account)
self.driver.click1(el_account_type_current_account_list[1])
else:
css_account_type_saving_account = self.add_merchantR2_config_ini.get_ini_value("add_merchantR2.ini",
"bankaccounts",
"saving_account")
el_account_type_saving_account_list = self.driver.getElenments(css_account_type_saving_account)
self.driver.click1(el_account_type_saving_account_list[1])