我正在试图抓住一个需要登录信息的网站,并且在数小时试图弄清楚为什么我一直“登录失败”之后,我认为这仅仅是因为“登录”或“提交”按钮是实际上没有点击。我通过在“失败”时保存浏览器的屏幕截图来实现这一点。我的用户名和密码填写在字段中。
我尝试了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>
我相信我需要得到一些javascript才能运行。但是怎么样?
更新:Selenium有一个submit()方法,可以自动提交HTML中的<form>
。即使使用它,它也不起作用。正如您在HTML中看到的那样,它是一种形式。在这一点上,我不知道还有什么可以尝试。
答案 0 :(得分:0)
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
。
答案 1 :(得分:0)
我感觉'submit'
找不到find_element_by_name
。试试find_element_by_xpath(//*[@name='submit'])
答案 2 :(得分:0)
当你使用硒做自动测试或刮擦时,我建议你使用meth方法
webdriver.find_element_by_xpath(xpathString)
因为您可以检查xpathwebbroser的控制台 在控制台上尝试此命令:
$x('xpathStrin')
答案 3 :(得分:0)
使用xpath,请尝试此
//input[@name='submit']
或
//input[contains(@name,'submit')AND contains(@alt,'Submit')]
答案 4 :(得分:0)
您可以使用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)
答案 5 :(得分:0)
请试试这个,希望有所帮助
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)