селен питон не может определить идентификатор или имя

1

Я попытался получить доступ к веб-сайту whit selenium, но python не смог найти идентификатор или имя. Вот код:

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>

ПРИМЕЧАНИЕ. Пароль неправильный из-за некоторых проблем с конфиденциальностью.

Кстати, эта тема была решена, спасибо всем

Теги:
selenium

3 ответа

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 задан, то нет необходимости искать какой-либо локатор.

0

Чтобы отправить последовательность символов в поле "Поиск", вы должны вызвать 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()
    
  • Снимок браузера:

Изображение 174551

0

Вы только разместили некоторые из html. Один из вариантов заключается в том, что локаторы для входа недействительны. Другой вариант заключается в том, что программа начинает поиск элементов до загрузки страницы. В этом случае исключение укажет, что элемент не найден.

У меня была аналогичная проблема, и работа для меня заключалась в том, чтобы explicit wait первого элемента, который я искал бы на новой странице. Явное ожидание ждет определенного количества времени для выполнения определенного условия.

Например: element = WebDriverWait(driver, seconds).until(EC.presence_of_element_located(By.NAME, 'txtuserame'))

В качестве альтернативы вы можете использовать implicit wait которое в идеале заставляет драйвер ждать определенное количество времени, если страница не загружена. По моему опыту, он очень зависит от веб-сайта, и он часто работает не так, как предполагалось.

Примером неявного ожидания в python будет driver.implicitly_wait(10) Неявное ожидание относится к драйверу, а не к элементу, и остается в силе в течение срока действия экземпляра драйвера.

Вы можете найти дополнительную информацию о том, как подождать здесь, и вы можете найти список expected conditions которые вы можете использовать с explicit wait здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню