在WordPress测验中使用Selenium

时间:2017-04-10 06:15:35

标签: python python-2.7 selenium selenium-webdriver selenium-chromedriver

我正在使用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没有意识到隐藏的元素现在是可见的。

1 个答案:

答案 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,我有一个随机进行测验的程序。