【问题标题】:Selenium gives Server Error 500 after click (Django, pytest)点击后 Selenium 给出服务器错误 500 (Django, pytest)
【发布时间】:2022-01-20 09:05:14
【问题描述】:

我有一个 Django 应用程序,我想通过 pytest 和 Selenium 进行测试。

我试图通过的例程是让 Selenium 登录,然后转到菜单,选择其中一个选项。这将重定向到一个新页面,该页面很好。在那里,我让 selenium 输入数据并单击按钮开始提交。这也有效,并重定向到第三页。

在这第三个“您的提交已成功创建”页面上,显示了一个链接,用户可以单击以收集其提交的结果(此页面。此链接显示正确,href URL 很好。但是当我让Selenium点一下,突然得到一个Server Error 500

<html lang="en"><head>
  <title>Server Error (500)</title>
</head>
<body>
  <h1>Server Error (500)</h1><p></p>
</body></html>

当我手动执行完全相同的操作时,它工作正常。

这是我的测试代码(略微简化):

@pytest.fixture(scope="class")
def chrome_driver_init(request):
    options = webdriver.ChromeOptions()
    options.headless = True
    options.binary_location = CHROME_BIN_PATH
    driver = webdriver.Chrome(service=CHROME_SERVICE, options=options)
    request.cls.driver = driver
    yield
    driver.quit()

@pytest.mark.django_db
@pytest.mark.usefixtures("chrome_driver_init")
class SubmissionTest(LiveServerTestCase):
    def test_adding_submission(self):
        self.driver.get(self.live_server_url)
        
        username = TEST_USER
        pwd = TEST_USER_PWD
        User = get_user_model()
        user = User.objects.create_user(username=username, password=pwd)
        user.save()

        # click 'Login':
        self.driver.find_element(By.LINK_TEXT, "Login").click()

        # now on Login page, log in via Selenium:
        username_field = self.driver.find_element(By.NAME, "username")
        pwd_field = self.driver.find_element(By.NAME, "password")
        submit_btn = self.driver.find_element(By.ID, "form_field")

        username_field.send_keys(TEST_USER)
        pwd_field.send_keys(TEST_USER_PWD)
        submit_btn.click()

        # now logged in, go to desired menu point:
        self.driver.find_element(By.LINK_TEXT, "MenuPoint 1").click()
        assert self.driver.title == "MenuPoint 1"  # redirection works fine

        ## find various fields, enter stuff, click "submit"

        # check successfull:
        assert self.driver.title == "Added Submission"  # redirection works, as expected

        ## more checks => yes, this is the desired page

        # find link for result page:
        result_link = self.driver.find_element(By.LINK_TEXT, "click here for your results")
        result_link_url = result_link.get_attribute("href")
        print(result_link_url) # this is indeed the correct URL

        # click link:
        time.sleep(10)  # wait 10 seconds => more did not help, either
        
        result_link.click()
        
        ## now we get the Server Error :-(

        print(self.driver.page_source)

我已经尝试使用WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "click here for your results"))).click(),但似乎连点击都没有。

我知道错误 500 的意思是错误在服务器端。但是在点击之前,服务器是好的。此步骤之前的所有重定向都可以正常工作。网址也签出。手动,一切都按预期工作。我不知道如何进一步缩小问题范围。

我该如何调查此错误的原因并希望能够修复它?

【问题讨论】:

    标签: python django selenium pytest


    【解决方案1】:

    测试只创建一个用户实例。这对于失败的视图是否足够?

    您需要访问服务器回溯以确定问题所在。

    from django.test import override_settings
    
    @pytest.mark.django_db
    @pytest.mark.usefixtures("chrome_driver_init")
    class SubmissionTest(LiveServerTestCase):
        @override_settings(DEBUG=True)
        def test_adding_submission(self):
            ...
    

    查看Django: why i can't get the tracebacks (in case of error) when i run LiveServerTestCase tests?了解更多详情。

    【讨论】:

    • 谢谢!我不知道这是可能的。立即发现bug(我在Testcase中创建的用户没有组,要显示的页面要组...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2017-04-02
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多