PhantomJS не загружает стили CSS

Привет, я использую PhantomJS v 2.1.1 через WebDriver в моих тестах приложений Django. Но из скриншота в одном проблемном тесте не загружается CSS.

Мне нужно проверить, что в модале Bootrap есть несколько кнопок, но они вообще не отображаются.

Init браузера в настройках теста:

self.browser = webdriver.PhantomJS(executable_path=settings.PHANTOMJS_PATH)
self.browser.set_window_size(1920, 1080)

И тестируем код самостоятельно:

self.browser.get(self.live_server_url + "/accounts/login/")
self.browser.find_element_by_name("login").clear()
self.browser.find_element_by_name("login").send_keys(user.email)
self.browser.find_element_by_name("password").clear()
self.browser.find_element_by_name("password").send_keys(password)
self.browser.find_element_by_id("submit").click()
self.browser.find_element_by_id("logout").click()
self.browser.implicitly_wait(10)
self.assertEqual("Ano", self.browser.find_element_by_xpath("/html/body/div[4]/div/div/div[3]/button[2]").text)
self.assertEqual("Ne", self.browser.find_element_by_css_selector("div.modal-footer").text)

Наконец, вот часть HTML-страницы, которая производит ожидаемый модальный режим:

<li>
  <a href="#" id="logout" style="color: #ffffff">                        
    <span class="glyphicon glyphicon-log-out"></span>
  </a>                    
</li>

$(document).ready(function () {

        $("#logout").on("click", function (e) {
            e.preventDefault();
            bootbox.dialog({
                message: '<div class="row">  ' +
                '<div class="col-md-12"> ' +
                '<form class="form-horizontal" id="confirm-logout" method="post" action="/accounts/logout/"> ' +
                "<input type='hidden' name='csrfmiddlewaretoken' value='lmXDBtPw6wSDMClUEIKOxzd8fvc3KCFL' />" +
                '<div class="form-group"> ' +
                '<div class="col-md-8"> ' +
                '<div class="checkbox">' +
                '<label>' +
                '<input type="checkbox" ' +
                'value="no-dialog" name="logout-confirm"> Zobrazovat tento dialog' +
                '</label>' +
                '</div>' +
                '</div> ' +
                '</div> </div>' +
                '</form> </div>  </div>',
                title: "Odhlásit",
                buttons: {
                    danger: {
                        label: "Ne",
                        className: "btn-danger",
                        callback: function () {
                            bootbox.hideAll()
                        }
                    },
                    main: {
                        label: "Ano",
                        className: "btn-primary",
                        callback: function () {
                            $("#confirm-logout").submit();
                        }
                    }
                }
            });
        });
      ....
}

Все файлы CSS и JS загружаются с сервера django. Они расположены в статичном реж. Вот часть главы HTML:

<link rel="icon" href="/static/img/favicon.ico">
<link rel="stylesheet" href="/static/css/base_style.css">
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="/static/pizza-master/css/pizza.css">
<link rel="stylesheet" href="/static/css/profile_style.css">
<script src="/static/scripts/jquery_1_11.min.js"></script>
<script src="/static/scripts/bootbox.min.js"></script>
<script src="/static/scripts/jquery.confirm.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
<script src="/static/bootstrap/js/npm.js"></script>
<script src="/static/pizza-master/js/vendor/modernizr.js"></script>

Наконец есть скриншоты:

Фон PhantomJs прозрачный

Destktop Chrome запустить сервер вместо теста

1 ответ

Решение

ОК, так что я нашел решение. Проблема не была связана с PhantomJS вообще. ChromeDriver действует точно так же.

Проблема была вызвана тестами Django, которые не обслуживали статические файлы так же, как это делал runserver.

Решение сработало для меня:

python manage.py collectstatic

Это гарантирует, что тестовый сервер будет обслуживать статические файлы, если у вашего django есть установочные статические файлы. Django статические файлы док

Другие вопросы по тегам