2017-10-14 14 views
0

我正在嘗試登錄到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標籤有onfocusonchange屬性。我沒有打擾後者(我的目標是先將擊鍵輸入到文本框中)。 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中使用過它。官方文檔很好,但我無法用這個來解決這個問題。所以我想要一個更適合初學者的教程。

回答

1

這爲我工作:

# Force the element to be displayed (noticed style.display = "none") 
# Yes, I know you can see it, but selenium thinks it's not displayed. 
driver.execute_script('document.getElementsByName("txt_username")[0].style.display="block"') 

elem_username.send_keys('your name') 
+0

它也適用於我。你有什麼想法爲什麼出現兩個文本框? https://imgur.com/a/yWcYb – Mahesh

+0

我不確定他們在幕後使用的是什麼樣式,以及他們所有的交互式JavaScript代碼對元素有何作用。顯示對象的鏡像確實顯得很奇怪。頁面源不顯示重複條目。 –

+0

您的解決方案解決了這個問題。但是,正如我所說的那樣,我想以適當的方式學習。你能告訴我應該怎麼做嗎? – Mahesh

1

所以,你已經列出一切很好,你似乎有一個很好的瞭解。訣竅是首先點擊第二個input,然後將鍵發送到第一個input,因爲它之後被聚焦。 (我發現點擊包含td的Chrome也可以使用,但瀏覽器在這方面有所不同,本頁的目的是點擊第二個輸入)。一個簡單的解決方案如下:

real, readonly = driver.find_elements_by_css_selector("input[onfocus*='SetEnd']") 
readonly.click() 
real.send_keys('hi') 

如果您對此有任何疑問,我可以嘗試提供幫助。

+0

工作。我仍然在尋找一種學習硒的方法,這就是爲什麼我沒有接受你的答案。我贊成他們,但他們單獨解決了我的臨時問題。 – Mahesh

+0

我最終接受了Ron的回答(因爲他是第一位),因爲我在meta網站上看到了一些帖子,發現我不應該要求「教程」。所以,由於這個問題得到解決,這個問題沒有太多的目的保持開放。 – Mahesh

相關問題