我正在嘗試登錄到this site。但我甚至無法使用用戶名填充文本框。如何將鍵擊發送到保持隱藏狀態的文本框,直到它被點擊?
我想:
隱性和顯性等待
執行JavaScript
文本框中用戶名是內封閉的
結構標記,它可以使用其寬度屬性進行定位。文本框本身由兩個input
標籤表示。第一個是隱藏的。兩者都有style
屬性。第一個的初始值爲display: none;
,當我點擊文本框時,該值更改爲display: inline-block;
。第二個輸入標籤的style
屬性設置爲display: none;
。同樣,一旦用戶名文本框失去焦點,這兩個都會被切換。
等待
我嘗試使用隱式和顯式的等待。實施明確的等待中的代碼導致了TimeoutException
錯誤:
wait = WebDriverWait(driver, 10)
elem_username = wait.until(EC.visibility_of_element_located((By.ID, 'txt_username')))
執行JavaScript
無論是input
標籤有onfocus
和onchange
屬性。我沒有打擾後者(我的目標是先將擊鍵輸入到文本框中)。 onfocus
的值爲SetEnd(this)
。所以,我試圖執行它。
我遇到的問題是我找不到任何可以幫助我執行JavaScript的文檔。所以我在StackOverflow上查看了一些相關的答案。我第一次嘗試這樣的:
elem_username = driver.find_element_by_id('txt_username')
driver.execute_script('SetEnd(this)')
當然,我知道這是行不通的,因爲我不是指元素。所以在瀏覽了幾個問題之後,我瞭解到execute_script帶有參數。所以我修改了代碼,這引起了一個錯誤,說有點像腳本有過這樣無功能:
driver.execute_script('arguments[0].SetEnd(this)', elem_username)
然後,我看到用「點擊()」的execute_script
內的答案;所以我也試過:
driver.execute_script('arguments[0].click()', elem_username)
'click()',我猜,只適用於按鈕。但是由於我不得不在文本框中「點擊」以將其放在焦點上,我認爲它會起作用。它沒有。
這是我在我所有的努力,其中,沒有一個例外,不停地提高ElementNotInteractableException
錯誤執行的最後一行:
elem_username.send_keys('blahblahblah')
要求
將q &作爲此站點會當然,如果我有更多的經驗,那就會很棒。例如,有幾個答案表明明確的等待,但其中大多數都是爲了解決OP的問題,因此它們只包含相關的代碼部分。我很難理解他們。
我想解決這個問題(登錄網站),但我也想學習與硒正常工作。我之前沒有在其他任何語言如Java中使用過它。官方文檔很好,但我無法用這個來解決這個問題。所以我想要一個更適合初學者的教程。
它也適用於我。你有什麼想法爲什麼出現兩個文本框? https://imgur.com/a/yWcYb – Mahesh
我不確定他們在幕後使用的是什麼樣式,以及他們所有的交互式JavaScript代碼對元素有何作用。顯示對象的鏡像確實顯得很奇怪。頁面源不顯示重複條目。 –
您的解決方案解決了這個問題。但是,正如我所說的那樣,我想以適當的方式學習。你能告訴我應該怎麼做嗎? – Mahesh