2016-08-23 155 views
1

我正在測試的Web應用程序的主頁首次載入時有一個加載屏幕,然後出現用戶名/密碼框。它是一個動態生成的UI元素,遊標默認位於用戶名字段中。包含在一個動態頁面中的網頁,無法使用與Selenium(Python)的驅動程序交互

我環顧四周,有人建議使用動作鏈。當我使用動作鏈時,我可以立即將文本輸入到用戶名和密碼字段中,然後按下Enter鍵,然後下一頁加載正常。不幸的是,由於我的特殊設置,行動鏈對我來說不是一個可行的長期答案。

當我使用webdriver的find_element_by_id我能夠找到它,我不能send_keys的元素,雖然因爲它在某種程度上不可見。我收到

selenium.common.exceptions.ElementNotVisibleException:消息:元素不可見。

我也無法點擊該字段或以其他方式與其交互,而不會出現此錯誤。

我也曾嘗試通過其他方式識別元素並通過其他方式與元素進行交互,例如「xpaths」和css,但無濟於事。他們總是not visible

奇怪的是,它適用於動態頁面標題。當頁面第一次加載時,它是Loading...,完成時它是Login。當調用driver.title時,驅動程序將返回當前標題。

有沒有人有建議?

+0

好吧,確認我是否有加載進度條出現在登錄頁面,當你要找到元素? –

+0

是的,它在那裏。在嘗試與之交互之前,我放了一個time.sleep(20),這足以讓登錄框出現。 – JRodge01

+0

實際上,presence_of_element_located元素只是檢查存在於DOM上的元素,當visibility_of_element_located檢查是否存在且可見時,意味着presence_of_element_located也能夠找到隱藏元素以及可見元素,而只有可見性只有可見性,這就是爲什麼presence_of_element_located有效。 –

回答

1

其實如果加載進度條出現在你登錄頁面,你應該嘗試使用WebDriverWait等到元素越來越如下可見: - :如果您收到 -

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

wait = WebDriverWait(driver, 10) 

element = wait.until(EC.visibility_of_element_located((By.ID, "enter element id here"))) 

# now use send_keys 
element.send_keys("enter value here") 

Edited1TimeoutException,我建議你嘗試尋找元素使用WebDriverWait是無形的加載進度條,而不是硬編碼的睡眠等待然後找願望元素如下之前要等待: -

wait = WebDriverWait(driver, 10) 

wait.until(EC.invisibility_of_element_located((By.ID, "enter loading progress bar id or other locators here"))) 

#now after invisible of loading progress bar wait for desire element 
element = wait.until(EC.presence_of_element_located((By.ID, "enter element id here"))) 

# now use send_keys 
element.send_keys("enter value here") 

Edited2: - 元素的實際presence_of_element_located只是檢查存在於DOM或不同時visibility_of_element_located檢查存在,並且都可見元素,意味着presence_of_element_located也能夠找到隱藏的元素以及可見的元素,而知名度得到唯一可見的,這就是爲什麼presence_of_element_located作品。

現在的問題時send_keys,因爲硒不能intract到元素,直到它的不可見的,這就是爲什麼你有麻煩可能是有慾望元素上的一些隱藏CSS作品,這使得它無形的,這就是爲什麼硒無法與它交互但不用擔心,您仍然可以使用execute_script來設置價值。

現在,你可以嘗試設置輸入元素值,而不是元素的發現,因爲使用後的send_keys -

driver.execute_script("arguments[0].value = arguments[1]", element, "enter your value here") 
+0

我使用硬編碼的等待來確保元素在屏幕上,然後執行您的建議。該元素在屏幕和源代碼中清晰可見,但我仍然遇到由wait.until()引發的TimeoutException。我嘗試切換幀,認爲它可能是這樣的東西,但沒有幫助。硒是否需要進行一些更新才能註冊新的源代碼? – JRodge01

+0

好吧,那麼不要硬編碼等待使用WebDriverWait等到加載欄不可見然後找到元素,請嘗試編輯答案,並讓我知道... :) –

+0

我試過這樣做。它可以很容易找到加載欄,並通知它何時不可見,但仍無法找到用戶名和密碼字段。我正在考慮只爲這部分使用動作鏈,並試圖自動化網站的其他部分,看看這是否會成爲我遇到的問題。 – JRodge01

0

至於建議的SAURABH,使用 1 self.wait。直到(EC.visibility_of_element_located((By.CSS_SELECTOR,OR.Sub_categories)))

要不然就把睡眠和看但它是不建議使用,可能是你在頁面加載

的時間變化的XPath
+0

我嘗試了兩種方法,包括使用明確的等待,直到我確定元素在屏幕上,然後嘗試使用EC.visibility函數找到它。它仍然無法找到該框。 – JRodge01

相關問題