繁体   English   中英

无法使用 Selenium 单击按钮或提交表单

[英]can't click button or submit form using Selenium

我正在尝试使用 Selenium w/ Python 单击辅导站点上发布的问题的答案,这样我就可以通过命令行进行测试。

我输入以下内容:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver.get('https://www.varsitytutors.com/sat_critical_reading_diagnostic_1-problem-10821')

(此时会出现一个烦人的弹出窗口——我们现在可以忽略它)

页面上的答案嵌入在 forms 中,如下所示:

         <div class="question_row">    
            <form class="button_to" method="post" action="/problem_question_answers/save_answer?answer_id=539461&amp;problem_id=5065&amp;qotd=false&amp;question_id=10821">
            <input id="answer_539461" class="test_button" type="submit" value="select" /><input type="hidden" name="authenticity_token" value="LE4B973DghoAF6Ja2qJUPIajNXhPRjy6fCDeELqemIl5vEuvxhHUbkbWeDeLHvBMtEUVIr7okC8Njp4eMIuU3Q==" /></form>
            <div class="answer">
              <p>English dramatists refused to employ slang in their work.</p>
            </div>
            <div style="clear:both"></div>
          </div>

我的目标是单击诸如此类的答案,以便使用 Selenium 解决下一个问题。

我认为这可能就像这样做一样简单:

answer_buttons=driver.find_elements_by_class_name('test_button')
answer_buttons[1].click()

但是我收到错误消息,指出该元素超出了驱动程序的框架。

我也尝试过提交表单,它不会产生错误消息:

answer_forms=driver.find_elements_by_class_name('button_to')
answer_forms[1].submit()

但它重定向到不同的 url 不加载: http://www.varsitytutors.com/sat_critical_reading_diagnostic_1-problems-results-d923998-c568-c7d-c014-8

有没有办法以编程方式做到这一点,或者网站的代码会阻止这种情况发生吗?

编辑:

在一些帮助下,我最初能够单击一次按钮。 但是下一个问题的相同提交按钮(通过 xpath)仍然不可点击。 这是我目前使用的代码:

driver.get('https://www.varsitytutors.com/practice-tests')

# click subject
subject=driver.find_element_by_xpath('/html/body/div[3]/div[9]/div/div[2]/div[1]/div[1]')
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div[9]/div/div[2]/div[1]/div[1]')))
subject.click()
# select specialty
specialty=driver.find_element_by_xpath('/html/body/div[3]/div[9]/div/div[2]/div[2]/div[1]/div[2]/a[4]')
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div[9]/div/div[2]/div[2]/div[1]/div[2]/a[4]')))
specialty.click()
# select test 
taketest=WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div[8]/div[3]/div[1]/div[1]/a[1]')))
driver.execute_script("arguments[0].click();", taketest)    

# click away popup
button=WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,"//button[contains(.,'No Thanks')]")))
button.location_once_scrolled_into_view
button.click()

# select first choice
choice=WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div[7]/div[1]/div[3]/div[1]/form/input[1]')))
driver.execute_script("arguments[0].click();", choice)    

我在接下来的几行中再次重复此代码。 但是,它没有效果; 驱动器停留在问题二上,接下来的几次点击不起作用......

choice=WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div[7]/div[1]/div[3]/div[1]/form/input[1]')))
driver.execute_script("arguments[0].click();", choice)
choice=WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div[7]/div[1]/div[3]/div[1]/form/input[1]')))

driver.execute_script("arguments[0].click();", 选择)

尝试以下代码。这将处理弹出窗口并单击 select 按钮。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('https://www.varsitytutors.com/sat_critical_reading_diagnostic_1-problem-10821')
driver.maximize_window()
button=WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//button[contains(.,'No Thanks, Start The Test')]")))
button.location_once_scrolled_into_view
button.click()
eleQuestions=WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'input.test_button')))
driver.execute_script("arguments[0].click();", eleQuestions[2])

button=WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//button[contains(.,'No Thanks')]")))
button.location_once_scrolled_into_view
button.click()

请注意:您可以将索引从 2 更改为 6。

快照:

在此处输入图像描述


如果您想 select 您提到的任何特定问题,请尝试以下代码。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('https://www.varsitytutors.com/sat_critical_reading_diagnostic_1-problem-10821')
driver.maximize_window()
button=WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//button[contains(.,'No Thanks, Start The Test')]")))
button.location_once_scrolled_into_view
button.click()
eleQuestions=WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//div[./p[text()='English dramatists refused to employ slang in their work.']]/parent::div//input[1]")))
driver.execute_script("arguments[0].click();", eleQuestions)

button=WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//button[contains(.,'No Thanks')]")))
button.location_once_scrolled_into_view
button.click()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM