Как определить, включен ли JavaScript в спецификации функции - PullRequest
0 голосов
/ 08 июля 2019

У меня есть помощник по тестированию, который должен иметь другое поведение, если он используется спецификацией объекта, для которого включен JavaScript, например

У меня есть тест вроде:

it 'test something', js: true do
   ... (code that uses javascript)
   special_method
end

и еще один такой тест

it 'test something else' do
   ... (code that does not use javascript)
   special_method
end

и специальный метод:

def special_method
   ... (lots form filling)
   if js_true?
     find_button('Update').trigger 'click'
   else
     click_button 'Update
   end
end

где js_true? - это некоторый метод, который возвращает true, если спецификация вызывающей функции имеет js: true. Мне нужна эта функциональность, потому что когда js: true страница отображается по-другому и click_button больше не работает.

Есть некоторая ошибка, которая означает, что когда я пытаюсь использовать click_button с включенным javascript, я получаю следующую ошибку:

    Capybara::Poltergeist::MouseEventFailed:
           Firing a click at co-ordinates [73, 700.5] failed. Poltergeist detected another element with CSS selector 'html body.home-page div.cc-window.cc-banner.cc-type-info.cc-theme-block.cc-bottom.cc-color-override--1608664607 span#cookieconsent:desc.cc-message' at this position. It may be overlapping the element you are trying to interact with. 

If you don't care about overlapping elements, try using node.trigger('click').

Сообщение об ошибке не помогает, потому что нет перекрывающихся элементов, и сообщение продолжает говорить:

     # --- Caused by: ---
         # Capybara::Poltergeist::BrowserError:
         #   
There was an error inside the PhantomJS portion of Poltergeist. 
If this is the error returned, and not the cause of a more detailed error response, this is probably a bug, so please report it.

Так что, пока эта ошибка не будет устранена, мне нужен обходной путь, чтобы определить, включен ли javascript для теста.

1 Ответ

2 голосов
/ 08 июля 2019

Обновление: Поскольку вопрос был обновлен с целью предоставления фактического сообщения об ошибке, определяющего запрос этой функции, мы можем видеть, что фактическая проблема является перекрывающимся элементом. Я знаю, что вы утверждаете, что перекрывающего элемента нет, и думаете, что это просто ошибка (которая никогда не будет исправлена, потому что Poltergeist устарела), но из этого сообщения об ошибке определенно есть перекрывающийся элемент и по именам классов перекрывающегося элемента Я бы сказал, что это баннер внизу экрана, с просьбой принять тот факт, что сайт использует куки-файлы (save_and_open_screenshot подтвердит это).

В любом случае, если вы решите не фиксировать свой тест, выполнив то, что должен будет сделать пользователь (примите баннер cookie), вы можете использовать текущие метаданные примеров RSpec

def js_true?
  RSpec.current_example.metadata[:js]
end

, чтобы определить, участвуете ли вы в тесте с метаданными :js.

Я хочу еще раз подчеркнуть, что использование trigger в тесте - ДЕЙСТВИТЕЛЬНО плохая идея. Он не повторяет того, что может сделать пользователь, затруднит переход на более современные драйверы и может в конечном итоге сделать тест, который он использует, в бессмысленном.

------ предыдущий ответ -------

Ваш вопрос сбивает с толку, потому что у вас есть тест с метаданными js: true, что означает, что его следует запускать только для тестов, которые поддерживают JS, но затем вы вызываете метод, который пытается сделать что-то другое, если поддерживается JS , Как это называется, когда JS не поддерживается? Если вы как-то вызываете его из драйвера, который не поддерживает JS, все драйверы, поддерживающие JS, должны ответить на wait? со значением true, чтобы вы могли выполнить page.driver.wait? или вы могли бы использовать RSpec.current_example.metadata, чтобы определить, js: true установлено - однако не все драйверы, поддерживающие JS, поддерживают trigger, и вы ДЕЙСТВИТЕЛЬНО не должны использовать trigger, если вы тестируете приложение (это удобно, если вы просто копируете данные со страницы). У вас будут намного лучшие тесты, если вы поймете, почему вы думаете, что вам нужно использовать trigger (который не копирует поведение пользователя), а вместо этого заменить его на поведение, которое пользователь может на самом деле делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...