我正在使用Selenium Webdriver for Python进行页面测试,并遇到了一个特定的问题。有一点我基本上是一个多项选择测验,在这个测验中,我想尝试一遍又一遍地做随机答案,直到我自己完成测验。我对代码可以尝试进行测验的次数或任何类型的验证码没有限制。
问题出现在这个测验动态变化的事实上。测验插件可以在这里找到(如果你想看一些测验的代码)
https://wordpress.org/plugins/wp-pro-quiz/
这是我尝试使用的代码:
wait =WebDriverWait(driver, wait)
element = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'wpProQuiz_questionInput')))
answers = driver.find_elements_by_xpath("//input[@class='wpProQuiz_questionInput'][1]")
mouse.move_to_element(answers[1]).click().perform()
并且效果很好,但仅适用于第一个问题。然后我继续点击" next"按钮
next_btn = driver.find_element_by_name("next")
next_btn.click()
也可以,但是当循环重新开始,并尝试再次找到wpProQuiz_questionInput时,它会给我一个超时异常,因为它没有找到该项目。
我不确定我是否必须以某种方式告诉selenium测验已更新,或以某种方式倾听它。重新启动页面也会导致测验重新开始。
谢谢,请告诉我是否有更多信息可以帮助您帮助我!
更新:
在评论显示所有问题都在列表表格之后。
非常有用的信息,谢谢。但是我仍然遇到了一些麻烦。
wait = WebDriverWait(driver, 10)
print "Waiting for quiz to be visible"
element = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'wpProQuiz_list')))
questions = driver.find_elements_by_xpath("//ol[@class='wpProQuiz_list'][1]")
print questions
print "printed questions"
for question in questions:
try:
print "trying to find answers"
answers = question.find_elements_by_tag_name("input")
print "Answers:"
print answers
answers[1].click()
except Exception as e:
print "Error: ", e
try:
next_btn = driver.find_element_by_name("next")
next_btn.click()
sleep(10)
except:
end_btn = driver.find_element_by_name("endQuizSummary")
end_btn.click()
sleep(10)
我让程序等待很长时间,直到元素可见,但似乎Selenium没有意识到隐藏的元素现在是可见的。
答案 0 :(得分:0)
所以我的解决方案需要的是一个不同的观点(感谢ouroborus)和一些Javascript
wait = WebDriverWait(driver, 10)
print "Waiting for quiz to be visible"
element = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'wpProQuiz_list')))
quiz = driver.find_element_by_xpath("//ol[@class='wpProQuiz_list']")
questions = driver.find_elements_by_class_name("wpProQuiz_listItem")
print questions
print "printed questions"
print len(questions)
for question in questions:
while True:
try:
print "trying to find answers"
answers = question.find_elements_by_tag_name("input")
print "Answers:"
print answers
el = answers[1]
driver.execute_script("arguments[0].style.visibility = 'visible';", el)
el.click()
break
except Exception as e:
print "Error: ", e
sleep(1)
while True:
try:
next_btn = driver.find_elements_by_name("next")[questions.index(question)]
driver.execute_script("arguments[0].style.visibility = 'visible';", next_btn)
next_btn.click()
sleep(5)
break
except Exception as e:
print e
sleep(5)
除了缺乏效率之外,我只是想让它工作,我找到的解决方案是使用Javascript使我的元素可见,因此能够毫无问题地点击它。现在我可以用随机整数替换那些1,我有一个随机进行测验的程序。