DJango中的Selenium点击下拉菜单中的失败

时间:2015-03-17 13:06:37

标签: python django selenium

有点难过。我正在为Python / Django中的类项目编写Selenium测试,无法理解我所看到的行为。作为测试的一部分,我点击一个下拉菜单,然后点击该菜单中的一个选项。

初次点击菜单有效。菜单打开,然后第二次单击不会。但是它并没有完全失败 - 点击仍然会对相关选项产生悬停效果。

我过去做了很多Selenium,所以我尝试了很多标准的调试问题,但还没有任何工作。其中我试过双击,使用Select,使用不同的选择器等没有运气。接下来我会使用ActionChains和SendKeys,但是我想了解为什么更简单的方法无效。我的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from django.contrib.auth.models import User
from django.test.testcases import LiveServerTestCase
from time import sleep
import os

class CreateIssueTestCase(LiveServerTestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        user = User.objects.create_superuser(username="username", password="password", email="tester@gtest.com")
        user.save()

    def tearDown(self):
        self.driver.quit()
        User.objects.all().delete()

    def test_create_issue(self):

        self.driver.get("localhost:8081/issue/create")
        self.driver.find_element_by_id("id_username").send_keys("username")
        self.driver.find_element_by_id("id_password").send_keys("password")
        self.driver.find_element_by_id("id_password").send_keys(Keys.ENTER)
        sleep(2)
        self.driver.find_element_by_id("id_project").click()
        sleep(2)
        self.driver.find_element_by_css_selector("#id_project > option:nth-child(3)").click()
        sleep(2)
        self.driver.find_element_by_id("id_issue_type").click()
        sleep(2)

失败的点击是测试中的第二个点击。此页面上还有其他下拉列表,其行为方式也相同。

我注意到我没有看到此测试的任何错误输出。此外,如果我不采取进一步措施,下拉菜单将保持打开状态,并突出显示目标选项,直到测试结束。

谢谢,

更新:

我尝试过使用

self.driver.find_element_by_css_selector("#id_project > option:nth-child(3)").send_keys(Keys.ENTER)

这也没有达到预期的效果。它不是选择有问题的元素,而只是关闭下拉菜单。

从firefinder中读取的相关html:

<select id="id_project" name="project">
  <option value selected="selected">----------</option>
  <option value="1">Dummy project1</option>
  <option value="2">Dummy project2</option>
</select>

1 个答案:

答案 0 :(得分:1)

您应该使用find_element_by_css_selector(),因为您正在寻找子元素:

self.driver.find_element_by_css_selector("#id_project > option:nth-child(3)")

find_element_by_id()不接受#选择器语法或子元素。

编辑:您最好以这种方式选择:

el = self.driver.find_element_by_id('id_project')
for option in el.find_elements_by_tag_name('option'):
    if option.text == 'Dummy project2':
        option.click()

但是,以下内容也可以在我的机器上进行测试,而无需先点击id_project。我只是删除了之前的行,并将其替换为:

self.driver.find_element_by_css_selector('#id_project > option:nth-child(3)').click()