Как я могу использовать тот же объект watir в следующем действии контроллера - PullRequest
0 голосов
/ 05 июня 2019

Я использую watir с безголовым браузером.Мне нужно выполнить три шага: добавить местоположение, добавить автомобиль и получить товар с другого сайта, для информации, которую я хочу получить с другого сайта.Я отправляю эти три детали с моего сервера и выполняю все эти три шага в одном HTTP-запросе с помощью watir и headless.

Я просто хочу разбить один http-запрос на три http-запроса на моем сервере.Запрос будет: 1) add_location: запустить запрос http, который откроет браузер без заголовка и выбрать местоположение.

2) add_vehicle: запустить запрос http, который будет использовать браузер без заголовка, в котором добавлено местоположение, и мы выберемтранспортное средство.

3) Получить продукт: запустить запрос http, который будет использовать браузер без заголовка, в котором добавлены местоположение и машина, будет загружен список продуктов.

Я не получаю никакого способа повторно использоватьwatir и безголовый сеанс, который уже открыт в следующем http-запросе на стороне rails.

Пример кода:

class TestsController < ApplicationController

  def add_location
    @headless = Headless.new
    @headless.start
    @watir = Watir::Browser.new
    @watir.goto('www.google.com')
    @watir.text_field(id: 'findstore-input')
              .wait_until(&:present?).set(params[:zip_code])
    @watir.a(id: 'findstore-button').click
    @watir.div(class: 'notifier').wait_while(&:present?)
  end

  def add_vehicle
    #need to resuse above @watir object in this action
  end
end

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Вы можете использовать файл ловушек, чтобы запустить браузер в автономном режиме и назначить переменную для вызова в отдельном def для передачи URL в браузер.

Например:

в хуках, вы можете добавить его как показано ниже

@ browser = Watir :: Browser.new: chrome, опции: {args: ['--headless']}

Так что вы можетеповторно использовать @ browser.goto ('www.google.com') в одном определении и использовать тот же экземпляр для другого вызова.

def example1: @ browser.goto ('www.google.com') end

def example2: @ browser.goto (' www.facebook.com ') end.,,и т.д.

Надеюсь, это поможет.

0 голосов
/ 06 июня 2019

Изменение дизайна с 1 запроса на три оказывает большое влияние на ваш API, так как даже эта простая часть теперь имеет состояние, то есть вам нужно сохранять состояние между каждым из трех запросов.

Как только выПоймите, у вас есть разные возможности.

  1. Создайте свой запрос информации после запроса, и только после его завершения используйте watir, чтобы получить необходимую информацию.

    Это в основном просто изменение API, и вы сохраняете данные в сеансе, файле cookie, базе данных и т. Д.

    Это не оказывает большого влияния на изменения, которые вы должны внести, но не приносит никаких изменений.преимущество.

  2. Уже забыли этот момент, но вы можете передать глобальную ссылку на ваш объект в сеансе, но это оказывает ОГРОМНОЕ влияние на память, и вы можете столкнуться ссостояние гонки.

    НИКОГДА не делайте этого , пожалуйста

  3. Если вы действительно хотите разделить запрос watir на три разных шага (например, из-за того, что он слишком медленный), вы можете использовать фоновое задание, в которое вы можете передавать данные пользователя, когда они поступают (используя выделенные базы данных, веб-сокет иличто угодно), затем дождитесь окончания работы (т.е. получите результат), например, пытаясь получить к ней доступ, пока она не станет доступной.

    Это решение требует гораздо больше работы, но оно сохраняет ваши HTTP-запросы с вашим клиентомлегкий и позволяет выполнять любые сложные задачи в фоновом режиме, которые в противном случае, вероятно, превышают время ожидания.

...