нажмите на серию вопросов, используя Selenium - не можете пройти первый - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь использовать Selenium с Python, чтобы просмотреть серию вопросов на тестовом веб-сайте. На данный момент не имеет значения, какой ответ выбран - я просто хочу иметь возможность переходить от одного вопроса к другому. Вот что у меня есть:

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.Firefox(executable_path="../../geckodriver.exe")
driver.get('https://www.varsitytutors.com/practice-tests')
wait = WebDriverWait(driver, 10)
# 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)
wait.until(EC.url_contains('diagnostic'))
driver.get(driver.current_url.replace('http', 'https'))

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

Эта последняя команда делает то, что должна. Насколько я знаю, следующая команда должна сделать то же самое - щелкнуть первый ответ на следующий вопрос ...

# select first choice again
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)

Однако это не работает. Соединение потеряно, и появляется страница с ошибкой Firefox.

Моя цель - просмотреть всю серию вопросов в этом конкретном тесте. Может кто-нибудь помочь мне разобраться, что делать?

1 Ответ

1 голос
/ 14 октября 2019

Используйте цикл infinite while и предоставьте блок Try .. Except, чтобы проверить, есть ли варианты, затем нажмите, в противном случае перейдите к блоку исключения и выйдите. Попробуйте код ниже. Я не проверял все вопросы, однакоцикл работает нормально. Дайте мне знать, как это происходит.

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

driver=webdriver.Firefox(executable_path="../../geckodriver.exe")
driver.get('https://www.varsitytutors.com/practice-tests')
wait = WebDriverWait(driver, 10)
# click subject
subject=wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@data-subject='ACT']/div[1]")))
subject.click()
# select specialty
specialty=wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@data-subject='ACT English']//div[@class='expandable']//a[contains(.,'Practice Tests')]")))
specialty.click()
# select test
taketest=wait.until(EC.element_to_be_clickable((By.XPATH,"//h3[text()='ACT English Diagnostic Test 1']/following::div[1]/a[1]")))
driver.execute_script("arguments[0].click();", taketest)

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

# select any choice
while True:
   try:
     choice=WebDriverWait(driver,20).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,"input.test_button")))
     driver.execute_script("arguments[0].click();", choice[3])
     time.sleep(3)
   except:
     break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...