Вот как я решил проблему с дублирующимся сеансом.
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?
.
Это не самый чистый способ сделать это, но он определенно работает.
Селен быстрее, чем веб-страница. Поэтому он пытается найти элемент (текстовое поле пароля) до его загрузки. поэтому в коде выбрасывается элемент not found исключение. Вы можете использовать Thread.sleep(2000)
или внешнее ожидание.
Как уже упоминалось @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')
Там нет ожидания там. Каждый раз, когда вы отправляете что-то, и страница должна быть загружена, вам нужно подождать. Он буквально пытается найти элемент пароля, в то время как прежнее имя пользователя и кнопка отправки все еще отображаются в DOM. Конечно, до того, как поле пароля отрендерено.
Вот почему работает одна команда за раз. Страница имеет время для загрузки, когда вы вручную просматриваете код.
Вот недавний вопрос с несколькими примерами ожидания в Selenium. Просто конвертируйте его в python. Это все та же логика, если другой синтаксис.
проверить, доступна ли кнопка? если нет, подождите 5 секунд и проверьте снова?