selenium.common.exceptions.NoSuchElementException: Сообщение: невозможно найти элемент: [id = & ldquo; login-passwd & rdquo;]

Вот как я решил проблему с дублирующимся сеансом.

routes.rb

  devise_for :users, :controllers => { :sessions => "my_sessions" }

my_sessions controller

class MySessionsController < Devise::SessionsController
  skip_before_filter :check_concurrent_session

  def create
    super
    set_login_token
  end

  private
  def set_login_token
    token = Devise.friendly_token
    session[:token] = token
    current_user.login_token = token
    current_user.save(validate: false)
  end
end

application_controller

  def check_concurrent_session
    if duplicate_session?
      sign_out_and_redirect(current_user)
      flash[:notice] = "Duplicate Login Detected"
    end
  end

  def duplicate_session?
    user_signed_in? && (current_user.login_token != session[:token])
  end

Модель пользователя Добавьте строковое поле с помощью перенаправления с именем login_token

. Это переопределяет контроллер Devise Session по умолчанию, но также наследует его. На новом сеансе в пользовательской модели создается и сохраняется в login_token токен сеанса входа. В контроллере приложения мы вызываем check_concurrent_session, который выдает и перенаправляет current_user после вызова функции duplicate_session?.

Это не самый чистый способ сделать это, но он определенно работает.

0
задан Moaz Naseem 18 March 2019 в 14:24
поделиться

3 ответа

Селен быстрее, чем веб-страница. Поэтому он пытается найти элемент (текстовое поле пароля) до его загрузки. поэтому в коде выбрасывается элемент not found исключение. Вы можете использовать Thread.sleep(2000) или внешнее ожидание.

0
ответ дан Adarsh J 18 March 2019 в 14:24
поделиться

Как уже упоминалось @Asyranok , вы должны дождаться появления элемента:

from selenium import webdriver
import selenium.webdriver.support.ui as ui

driver = webdriver.Firefox()
wait = ui.WebDriverWait(driver, 10)
driver.get('https://mail.yahoo.com')
login = driver.find_element_by_id('login-username')
login.clear()
login.send_keys('johndoe')
login.submit()
wait.until(lambda driver: driver.find_element_by_id('login-passwd'))
pwd = driver.find_element_by_id('login-passwd')
pwd.send_keys('12345')
0
ответ дан Alderven 18 March 2019 в 14:24
поделиться

Там нет ожидания там. Каждый раз, когда вы отправляете что-то, и страница должна быть загружена, вам нужно подождать. Он буквально пытается найти элемент пароля, в то время как прежнее имя пользователя и кнопка отправки все еще отображаются в DOM. Конечно, до того, как поле пароля отрендерено.

Вот почему работает одна команда за раз. Страница имеет время для загрузки, когда вы вручную просматриваете код.

Вот недавний вопрос с несколькими примерами ожидания в Selenium. Просто конвертируйте его в python. Это все та же логика, если другой синтаксис.

проверить, доступна ли кнопка? если нет, подождите 5 секунд и проверьте снова?

0
ответ дан Asyranok 18 March 2019 в 14:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: