Я пытаюсь очистить сайт, который нуждается в информации для входа, и после нескольких часов попыток выяснить, почему я продолжаю получать сообщение «Ошибка входа», я считаю, что это просто потому, что кнопка «Войти» или «Отправить» на самом деле не получает щелкнул . Я понял это, сохранив скриншот браузера прямо тогда, когда он «не работает». Мои имя пользователя и пароль заполняются в полях.

Я пробовал что-то вроде 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, это форма. На данный момент я не знаю, что еще попробовать.

1
shmob 29 Авг 2017 в 00:40

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)
0
SeJaPy 29 Авг 2017 в 07:10

Вы можете использовать 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)
0
Guy 29 Авг 2017 в 13:17

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.

0
chicocvenancio 28 Авг 2017 в 23:59

Когда вы используете селен, сделайте автоматическое тестирование или очистку , Я предлагаю вам использовать метод

webdriver.find_element_by_xpath(xpathString)  

Потому что вы можете проверить консоль xpathwebbroser Попробуйте эту команду на консоли:

$x('xpathString')
0
iSWORD 20 Ноя 2019 в 17:33

У меня такое чувство, что 'submit' не найден find_element_by_name. Попробуйте find_element_by_xpath(//*[@name='submit'])

0
user2512647 28 Авг 2017 в 23:53

Используйте xpath, пожалуйста, попробуйте это

//input[@name='submit']

Или

//input[contains(@name,'submit')AND contains(@alt,'Submit')]
0
iamsankalp89 29 Авг 2017 в 04:25