Я пытаюсь очистить сайт, который нуждается в информации для входа, и после нескольких часов попыток выяснить, почему я продолжаю получать сообщение «Ошибка входа», я считаю, что это просто потому, что кнопка «Войти» или «Отправить» на самом деле не получает щелкнул . Я понял это, сохранив скриншот браузера прямо тогда, когда он «не работает». Мои имя пользователя и пароль заполняются в полях.
Я пробовал что-то вроде wait
, elementScrollBehavior
, похоже, ничего не работает. Буду очень признателен за помощь! Код ниже.
def load(self):
global browser
DesiredCapabilities.PHANTOMJS["elementScrollBehavior"] = 1
#browser field
browser = webdriver.PhantomJS()
wait = WebDriverWait(browser, 10)
#browser = webdriver.Firefox()
#browser = webdriver.Chrome()
loginId = self.id
password = self.pw
browser.get('https://link.example.com')
browser.find_element_by_id('cf-login').send_keys(loginId)
browser.find_element_by_id('password').send_keys(password)
browser.find_element_by_name('submit').click()
#wait.until(EC.presence_of_element_located((By.ID, "crefli_HC_SSS_STUDENT_CENTER")))
try:
if browser.find_element_by_id('crefli_HC_SSS_STUDENT_CENTER'):
#return login status
return True
else:
return False
except:
print('element not found on page')
print(browser.current_url)
#browser.save_screenshot('~/Desktop/screen2.png')
HTML формы:
<form name="loginform" action="/oam/server/auth_cred_submit" method="post">
<div class="nonfloat-box">
Username:
<input type="text" id="cf-login" name="username" class="username inputbox" autocomplete="OFF">
</div>
<div class="float-box">
Password:
<input id="password" name="password" type="password" class="password inputbox" autocomplete="OFF">
</div>
<input type="image" src="https://www.cuny.edu/site/citizencuny/cunyfirst-login/loginbutton.jpg" onclick="javascript: return signon_validate()" alt="Submit" name="submit">
</form>
Я считаю, что мне нужно, чтобы SOMEHOW запустил этот кусочек JavaScript. Но как?
ОБНОВЛЕНИЕ: Selenium имеет метод submit (), который автоматически отправляет <form>
в HTML. Даже используя это, это не работает. Как вы можете видеть в HTML, это форма. На данный момент я не знаю, что еще попробовать.
6 ответов
Пожалуйста, попробуйте это, надеюсь, это поможет
from selenium.webdriver.common.keys import Keys
driver.find_element_by_name('submit').send_keys(Keys.RETURN)
(or)
driver.find_element_by_name('submit').send_keys(Keys.ENTER)
Вы можете использовать submit()
для отправки формы. Его нужно отправить в тег <form>
browser.find_element_by_id('cf-login').send_keys(loginId)
browser.find_element_by_id('password').send_keys(password)
browser.find_element_by_name('loginform').submit()
Если это не работает, вы можете использовать JavaScript, как обходной путь
submit = browser.find_element_by_name('submit')
browser.execute_script("arguments[0].click();", submit)
Вы также можете попробовать отправить Enter
from selenium.webdriver.common.keys import Keys
browser.find_element_by_id('cf-login').send_keys(loginId)
password_field = browser.find_element_by_id('password')
password_field.send_keys(password)
password_field.send_keys(Keys.RETURN)
#OR
password_field.send_keys(Keys.ENTER)
HTML нужен для более точного определения, но я обычно использую клавишу ввода для отправки форм, иногда javascript портит возможность отправки по клику, и простой ввод обычно помогает
from selenium.webdriver.common.keys import Keys
def load(self):
(...)
browser.find_element_by_id('password').send_keys(password)
browser.find_element_by_id('password').send_keys(Keys.ENTER)
(...)
В противном случае убедитесь, что вы имеете в виду find_element_by_name
, а не find_element_by_tag_name
.
Когда вы используете селен, сделайте автоматическое тестирование или очистку , Я предлагаю вам использовать метод
webdriver.find_element_by_xpath(xpathString)
Потому что вы можете проверить консоль xpathwebbroser Попробуйте эту команду на консоли:
$x('xpathString')
У меня такое чувство, что 'submit'
не найден find_element_by_name
. Попробуйте find_element_by_xpath(//*[@name='submit'])
Используйте xpath, пожалуйста, попробуйте это
//input[@name='submit']
Или
//input[contains(@name,'submit')AND contains(@alt,'Submit')]
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.