簡體   English   中英

Python:登錄網頁並單擊沒有Selenium的按鈕

[英]Python: Login to webpage and click button without Selenium

我正在編寫一個 python 腳本來連接到一個網站,登錄然后在下一頁中的給定時間單擊一個按鈕。 我設法用 Selenium 做到了這一點,但我想要一個無需打開瀏覽器的解決方案。

我正在嘗試使用請求來做到這一點。 我可以登錄並導航到受保護的頁面,但我很難按下按鈕:

import requests

payload = {
    'username': 'MyUsername',
    'password': 'MyPassword'
}

with requests.Session() as s:
    p = s.post("login_URL", data=payload)
    print (p.text)

    r = s.get("A_protected_URL")
    print (r.text)

我想按下的按鈕在“A_protected_URL”中,它的定義如下:

<script type="text/javascript">
function SubmitForm(form) // Button clicked
{
    form.Submit.disabled = true;
    form.Submit.value = "Please wait...";
    return true;
 }
</script>
<div id="submit_button" >
<form action="https://mydummywebsite.com/submitted" 
 method="post" onsubmit="return SubmitForm(this);" >
<input type="submit" class="sub-process-button" name="Submit" value="Submit">
</form>

向執行 Javascript 的按鈕發送請求的正確方法是什么? 謝謝

不要試圖“點擊”任何東西,只是模仿按鈕的作用。 在這種情況下,按鈕提交一個表單。 這意味着它將向操作 URL ( action="https://mydummywebsite.com/submitted" ) 執行POST請求 ( method="post" action="https://mydummywebsite.com/submitted" )。 表單中的所有字段都將作為請求的內容發送,但在這種情況下,表單中沒有其他字段。

import requests

payload = {
    'username': 'MyUsername',
    'password': 'MyPassword'
}

with requests.Session() as s:
    p = s.post("login_URL", data=payload)
    print (p.text)

    r = s.post("https://mydummywebsite.com/submitted")
    print (r.text)

除非有人完全用 Python 實現了一個完整的瀏覽器,否則你要問的是不可能的,我對此表示懷疑。 您需要像 Selenium 這樣的東西的原因是因為 Selenium 圍繞實際的 Web 瀏覽器(例如 Chromium)提供 Python 綁定。 因此,您用 Python 編寫的與 Selenium 交互的代碼正在被轉換為與瀏覽器(可能是 Chromium)本身的較低級別的 API 交互。

瀏覽器極其復雜,負責渲染 HTML、CSS、JavaScript 等。 一旦 Chromium 收到您提供的 HTML,它就必須加載自己的 JavaScript 引擎來解釋您的 JavaScript 並運行它。 requests ,Python 庫,對此一無所知。 它只是與原始 HTML 交互。

因此,如果您正在制作 HTML 並且需要模擬嵌入的 JavaScript 以查看它在瀏覽器中的行為,最現實的選擇是僅通過瀏覽器運行 HTML。 硒是一個不錯的選擇。 如果您實際上並不關心 JavaScript 本身,而只想確保您的 Python 服務器正在做正確的事情,您可以按照另一個答案的建議模擬 POST 請求。 讓我分解一下:

您的選擇

  • 您正在編寫 Python Web 服務器
    • 您是否需要在您返回的 HTML 中測試 JavaScript 的行為? 您可能應該使用硒。
    • 您是否需要測試您的網絡服務器的行為,確保它對某些請求返回正確的 HTML 響應? 您應該直接使用requests庫模擬 GET/POST 等請求
  • 您正在嘗試編寫一些東西,任何東西,以便與現實世界的網頁進行交互,因為您正在嘗試自動化某些活動
    • 網頁是否依賴於與 JavaScript 的交互? 您可能需要用 JavaScript 而不是 Python 編寫自動化
    • 網頁是否完全依賴於您可以通過requests模擬的 HTTP GET/POST/DELETE 等? 您可以只使用 Python requests ,但根據我的經驗,編寫 JavaScript 來與網頁交互沒有那么痛苦。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM