硒python无法检测ID或名称

时间:2018-06-23 01:23:03

标签: python selenium

我试图访问一个白色的网站,但是python无法找到ID或名称。 这是代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Firefox(executable_path='D:\code\geckodriver.exe')
browser.get('http://admin.chhs.edu.my/schooladmin/jw/login.php')
assert "教务系统" in browser.title

def login():
    elem = browser.find_element_by_name('txtUserName')
    elem.send_keys('sportday')
    elem = browser.find_element_by_name('txtPassWord')
    elem.send_keys('xxxxxx')
    elem.send_keys(Keys.RETURN)

def search():
    elem2 = browser.find_element_by_name('txtFind')
    elem2.send_keys('14066')
    elem2.send_keys(Keys.RETURN)

login()
search()

以及我正在访问的网站的html:

<form name="search" method="post" action="http://admin.chhs.edu.my/schooladmin/jw/index.php">
  <input name="txtFind" id="txtFind" type="text">
  <input name="button" id="button" value="搜寻" type="submit">
</form>

注意,由于某些隐私问题,密码不正确。

此问题已解决,谢谢大家

3 个答案:

答案 0 :(得分:0)

您只发布了一些html。一种选择是登录的定位器无效。另一个选择是程序在页面加载之前开始寻找元素。在这种情况下,异常会指出找不到该元素。

我遇到了类似的问题,对我有用的是在新页面中要搜索的第一个元素上放置一个explicit wait。显式等待将等待指定的时间,以便满足指定的条件。

例如: element = WebDriverWait(driver, seconds).until(EC.presence_of_element_located(By.NAME, 'txtuserame'))

或者,您可以使用implicit wait,理想情况下,如果页面尚未加载,驱动程序将等待指定的时间 。以我的经验,它非常依赖于网站,并且经常无法按预期运行。

Python中的隐式等待的示例为driver.implicitly_wait(10) 隐式等待与驱动程序而不是元素有关,并且在驱动程序实例的生命周期内一直有效。

您可以找到有关等待here的更多信息,还可以找到expected conditions可以与explicit wait here一起使用的列表。

答案 1 :(得分:0)

要将字符序列发送到 Search 字段,您必须诱使 WebDriverWait 使所需的元素可点击,如下所示:

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.keys import Keys
    
    browser=webdriver.Firefox(executable_path=r'C:\WebDrivers\GeckoDriver\geckodriver-v0.20.1-win64\geckodriver.exe')
    browser.get('http://admin.chhs.edu.my/schooladmin/jw/login.php')
    assert "教务系统" in browser.title
    
    def login():
        elem = browser.find_element_by_name('txtUserName')
        elem.send_keys('sportday')
        elem = browser.find_element_by_name('txtPassWord')
        elem.send_keys('123456')
        elem.send_keys(Keys.RETURN)
    
    def search():
        elem2 = WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#txtFind")))
        elem2.send_keys('14066')
        elem2.send_keys(Keys.RETURN)
    
    login()
    search()
    
  • 浏览器快照:

search_result

答案 2 :(得分:0)

替换此代码:

def search():
    elem2 = browser.find_element_by_name('txtFind')
    elem2.send_keys('14066')
    elem2.send_keys(Keys.RETURN)

对此:

def search():
    elem2 = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.ID, "txtFind")))
    elem2.send_keys('14066')
    elem2.send_keys(Keys.RETURN)  

请注意,如果给出了 ID ,则无需进行任何定位。