Селен держит кеш? Почему мой javascript не загружается в тестах? - PullRequest
1 голос
/ 30 октября 2019

У меня есть более сложный вопрос, но я пытаюсь выделить проблему, чтобы избежать путаницы.

Я тестирую страницу, используя селен. На этой странице есть два внешних скрипта javascript. Если вы заходите туда вручную, то страница работает правильно, но при использовании селена один из javascript не загружается:

The script from “http://localhost:55234/static/js/common.js” was loaded even though its MIME type (“text/html”) is not a valid JavaScript MIME type.
2 add-name
Loading failed for the <script> with source “http://localhost:55234/static/js/common.js”.

Проверка источника (щелчок правой кнопкой мыши => просмотреть исходный код страницы) дает мне правильный шаблон с этимдве строки (и другие, конечно):

[...] 
<!-- load global javascript -->
    <script type='text/javascript' src="/static/js/common.js"></script>
<!-- load app javascript -->
  <script type='text/javascript' src="/static/lists/js/lists.js"></script>
[...]

src кликабельны. Кликнув по первой, перезагрузите исходную страницу без строки три и четыре, поэтому без этой строки:

<!-- load app javascript -->
  <script type='text/javascript' src="/static/lists/js/lists.js"></script>

При нажатии второй (lists.js) вы получите код javascript. Но! Но этот код выглядит (очень) старая версия моего кода. Много дней (не слишком ли долго для кэширования?). В то время весь код находился в одном файле JavaScript (lists.js), а другой (common.js) не существовало, поэтому это может объяснить, почему не загружается.

Почему это так? Как я могу обновить этот код? Если я зайду вручную на странице, я найду настоящий обновленный код.

Также может быть полезно знать, что в моем браузере я недавно выбрал «Отключить кэш» на вкладке «Сеть» (нажмите F12 с Firefox) и «Отключить кэш HTTP (...)» в настройке, чтобы избежатьэти проблемы. На странице, открытой селеном, эти опции не отмечены. Я попытался проверить оба (используя точку останова ()) и перезагрузить страницу, но ничего не изменилось.

Я повторяю, возможно, причина этого в другом, и есть много других вещей, которые нужно сказать, но я думаю, что лучшеСохраняйте все как можно проще и открывайте другие вопросы, когда мне это нужно. Теперь, есть ли в этом смысл? почему мой скрипт не обновляется в течение нескольких дней (я предпочитаю не очищать кеш, если это возможно)?

Я нашел этот код для удаления кеша, стоит попробовать? Это выглядит правильно?

def setUp(self):
    profile = webdriver.FirefoxProfile()
    profile.set_preference("browser.cache.disk.enable", False)
    profile.set_preference("browser.cache.memory.enable", False)
    profile.set_preference("browser.cache.offline.enable", False)
    profile.set_preference("network.http.use-cache", False)
    self.browser = webdriver.Firefox(profile)

Вот код:

Мой шаблон base.html:

[...]
<head>
  [...]
  <!-- load global javascript -->
  <script type='text/javascript' src="{% static '/js/common.js' %}"></script>
  <!-- load app javascript -->
  {% block script %}{% endblock %}
[...]

Мой шаблон list.html

{% block script %}
  <script type='text/javascript' src="{% static 'lists/js/lists.js' %}"></script>
{% endblock %}

, где common.js в myproject/static/js/common.js, а lists.js в myproject/lists/static/lists/js/lists.js. Я звоню обоим с {% static, но это должно быть правильно.

My test.py:

class NameFormSeleniumTest(LiveServerTestCase):
    def setUp(self):
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(2)

    def tearDown(self):
        self.browser.quit()

    def test_form_can_save_a_name(self):
    # some code
    # english = ...
    self.browser.get(self.live_server_url + '/lists/add-name/')
    Select(self.browser.find_element_by_id('id_namelanguage')).\
        select_by_value(str(english.id))
    # ...
    breakpoint()
    form = NameForm({'nametype': nome.id, 'gender': maschio.id,
                     'name': 'Remo', 'namelanguage': english.id,
                     'usato': 0})
    print(form.errors)
    form.save()

Ошибка, которую дает тест: (в строке form = ...):

ValueError: The Name could not be created because the data didn't validate.

и form.error - это:

<ul class="errorlist"><li>nametype<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

, но с breakpoint() Я вижу, что функция javascript для добавления параметров в поле не найдена, поле остается пустым, поэтому Select() не выбирайте ничего, и форма выдает ошибку.

Спасибо за помощь

1 Ответ

0 голосов
/ 14 ноября 2019

Я обнаружил проблему.

Из документации :

При выполнении тестов, использующих реальные HTTP-запросы вместо встроенного клиента тестирования (т. е. при использовании встроенного LiveServerTestCase) статические ресурсы необходимо обслуживать по всему остальному контенту, чтобы тестовая среда воспроизводила реальный объект как можно точнее, но LiveServerTestCase имеет только очень базовые статические функциональные возможности для обслуживания файлов:Он не знает о функции поиска приложения staticfiles и предполагает, что статический контент уже был собран в STATIC_ROOT.

Из-за этого staticfiles поставляет свой собственный django.contrib.staticfiles.testing.StaticLiveServerTestCase, подклассвстроенный, который имеет возможность прозрачно обслуживать все активы во время выполнения этих тестов способом, очень похожим на то, что мы получаем во время разработки с DEBUG = True, т.е. без необходимости собирать их сначала с помощью collectstatic.

Так что жкак загрузка старой версии моего сценария JavaScript. Как вы можете прочитать, решение состоит в том, чтобы использовать StaticLiveServerTestCase вместо LiveServerTestCase.

...