Как установить значение атрибута с помощью Capybara, Selenium и т.п.?

У меня есть поле <textarea> (атрибут модели Rails), для которого я должен проверить, отображается ли сообщение об ошибке разрешенной максимальной длины. Я должен сделать это, используя системную спецификацию с включенными Capybara, Selenium и т.п.

# model
class Model < ActiveRecord::Base
  validates_length_of :description, maximum: 1000
end

# view
<label for = "description">Description</label>
<textarea maxlength = "1000" id = "description">Some text</textarea>

# RSpec
RSpec.describe "Model", type: :system do
  it "should fail" do
    visit edit_model_path(@model)

    fill_in "Description", with: "abcdefghijklmnopqrstuvwxyz"*1000

    # ...
  end
end

Я пытался заполнить <textarea> текстом длиннее 1000 символов, а также (maxlength = "1000") он вставляет в <textarea> только первые 1000 символов текста, из-за чего я не могу проверить вывод сообщения об ошибке максимальной длины.

Я подумал, что один из способов проверить это — изменить атрибут maxlength у <textarea> прямо в примере RSpec, чтобы я мог заполнить его более чем 1000 символов, что позволит мне эффективно протестировать ошибку максимальной длины.

Можно ли с помощью RSpec Capybara, Selenium и им подобных изменить атрибут maxlength?

Я бы просто проверил это с помощью модели или спецификации запроса. На самом деле нет смысла экспериментировать со страницей, которую вы тестируете, в спецификации системы, поскольку вы тестируете поведение приложения с точки зрения пользователя. Если пользователь даже не может ввести более 1000 символов, он никогда не увидит сообщение проверки.

max 21.04.2023 22:29

Возможно, вам нужна проверка на стороне клиента.

max 21.04.2023 22:30

@max Я знаю, что могу проверить это с помощью модели или спецификации запроса, но я четко отвечаю на свой вопрос об использовании системной спецификации. К вашему сведению (даже если я уверен, что вы уже это знаете). Пользователь может изменить DOM, чтобы изменить значение maxlength.

Backo 21.04.2023 22:36

Злонамеренный пользователь может делать намного больше вещей, чем вы когда-либо могли проверить с помощью системных спецификаций, так что это своего рода дурацкая затея. Системные спецификации хороши для тестирования приложения из пользовательской истории. Если вы чувствуете, что вам нужно прибегнуть к взлому реальной страницы, которую вы тестируете, только для того, чтобы использовать системную спецификацию, вы делаете это неправильно.

max 21.04.2023 22:44

Итак, для вас, разве я не должен тестировать систему на maxlength в моем случае?

Backo 21.04.2023 22:47

Нет, если только вы не тестируете, что на самом деле делает maxlength, то есть усекает ввод после X символов. Базовая проверка на стороне сервера может быть протестирована другими способами. Если вы действительно хотите предоставлять индивидуальные отзывы пользователей (как в этом поле для комментариев), вы хотите использовать javascript, и это можно протестировать, используя Capybara с драйвером, который запускает реальный браузер. Чего вы не должны делать, так это манипулировать и изменять поведение страницы только для того, чтобы проверить проверку, которая находится там в качестве запасного варианта.

max 21.04.2023 22:51

Это вполне возможно; Драйверы Capybara, такие как selenium или webkit, позволят вам запускать JS на странице. С Rack::Test вы можете редактировать страницу, на которой он работает с Nokogiri. Однако это не означает, что вы на самом деле должны.

max 21.04.2023 22:54

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

Backo 21.04.2023 22:56
page.execute_script("document.getElementById('description').‌​removeAttribute('max‌​length')");
max 21.04.2023 23:00

Спасибо @max, я хотел бы принять ваш ответ.

Backo 21.04.2023 23:13

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

max 21.04.2023 23:18

Вы можете попробовать скопировать/вставить более 1000 символов в поле, но вам действительно не стоит утруждать себя тестированием основных функций HTML. Предположим, что это сработает. Спросите своего БА, как вы должны проверить, введено ли более 1000 символов в поле, которое по определению не будет занимать более 1000 символов.

JeffC 22.04.2023 07:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на комментарии @max, вот способ (подходящий для тестирования) изменить атрибут maxlength права <textarea> в RSpec с помощью Selenium:

# RSpec
RSpec.describe "Model", type: :system do
  it "should fail" do
    # ...

    page.execute_script("document.getElementById('description').removeAttribute('maxlength')");

    # ...
  end
end

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