не могу нажать кнопку или отправить форму с помощью Selenium - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь использовать Selenium с 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')

(на этом этапе появляется раздражающее всплывающее окно - мы можем пока игнорировать это)

Ответы на странице встроены в такие формы:

         <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>

Myцель состоит в том, чтобы щелкнуть ответ, такой как этот, чтобы перейти к следующему вопросу, используя 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-d9399f1a-4e00-42a0-8867-91b1c8c9057d

Есть ли какой-либо способ сделать это программно, или код веб-сайта собирается предотвратить это?

Редактировать:

С некоторой помощью я смог нажать кнопку один раз изначально. Но идентичная кнопка отправки (по 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 ();", выбор)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...