簡體   English   中英

如何使用 Selenium 和 Python 找到並單擊 codeur.com 登錄頁面上的提交按鈕

[英]How to locate and click on the submit button on codeur.com signin page using Selenium and Python

我想自動化我的打開 session 所以,按照 Stackoverflow 上的一些教程和其他問題,我做了以下事情:

import selenium  

from selenium import webdriver

driver = webdriver.Safari()


driver.get('https://www.codeur.com/users/sign_in')


id_box = driver.find_element_by_name('user_email')

id_box.send_keys(my_mail)

# Find password box
pass_box = driver.find_element_by_name('user_password')
# Send password
pass_box.send_keys(my_password)
# Find login button
login_button = driver.find_element_by_name('commit')
# Click login
login_button.click()

我收到以下錯誤:

line 321, in execute
    self.error_handler.check_response(response)
line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: 


Process finished with exit code 1

是因為我錯過了提交按鈕的正確名稱嗎?

我認為對應的 html 將是:

<span class="recaptcha-button-enabled">
<input type="submit" name="commit" value="Se connecter" class="btn btn-primary btn-lg btn-block" data-disable-with="Se connecter">
</span>
<span class="recaptcha-button-disabled" style="display: none">
<input type="submit" name="commit" value="Connexion en cours…" class="btn btn-primary btn-lg btn-block" disabled="disabled" data-disable-with="Connexion en cours…">
</span>

Submit 按鈕上有一個重疊的元素,因此您可以使用其 xpath 單擊該元素,對於用戶名和密碼字段,您應該使用id而不是name來獲取元素。

你的代碼應該是這樣的:

import selenium  

from selenium import webdriver

driver = webdriver.Safari()


driver.get('https://www.codeur.com/users/sign_in')


id_box = driver.find_element_by_id("user_email")

id_box.send_keys(my_mail)

# Find password box
pass_box = driver.find_element_by_id("user_password")
# Send password
pass_box.send_keys(my_password)
# Find login button
login_button = driver.find_element_by_xpath("//span[@class='recaptcha-button-enabled']")
# Click login
login_button.click()

但是,單擊頁面上的提交按鈕后會顯示驗證碼,因此我認為您無法繼續進行自動化操作。

提交按鈕Se 連接器與通知重疊。 您可以向上滾動元素誘導WebDriverWaitelement_to_be_clickable()並且您可以使用以下任一定位器策略

  • 使用CSS_SELECTOR

     driver.get('https://www.codeur.com/users/sign_in') WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#user_email"))).send_keys("Netchaiev@gmail.com") driver.find_element_by_css_selector("input#user_password").send_keys("Netchaiev") driver.execute_script("return arguments[0].scrollIntoView(true);", driver.find_element_by_css_selector("input[value='Se connecter']")) driver.find_element_by_css_selector("input[value='Se connecter']").click()
  • 使用XPATH

     driver.get('https://www.codeur.com/users/sign_in') WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='user_email']"))).send_keys("Netchaiev@gmail.com") driver.find_element_by_xpath("//input[@id='user_password']").send_keys("Netchaiev") driver.execute_script("return arguments[0].scrollIntoView(true);", driver.find_element_by_xpath("//input[@value='Se connecter']")) driver.find_element_by_xpath("//input[@value='Se connecter']").click()
  • 注意:您必須添加以下導入:

     from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
  • 瀏覽器快照:

編碼器

使用類似名稱:

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

element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.NAME, "commit")))

element.click();

最后,如果我將“find_element_by_name”都替換為“find_element_by_id”,代碼會更好地工作; 但在 Safari 內,它似乎不會點擊。 我改為使用 Chrome(),但在這種情況下,我需要下載“chromedriver”並指出它所在的路徑:

driver = webdriver.Chrome(executable_path='path_to_the_folder_where_chromedriver_is/chromedriver')

然后它工作得很好(但網站要求完成驗證碼,所以我想這有點像自動化之路的盡頭......)

暫無
暫無

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

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