Я попытался получить доступ к веб-сайту 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>
ПРИМЕЧАНИЕ. Пароль неправильный из-за некоторых проблем с конфиденциальностью.
Кстати, эта тема была решена, спасибо всем
Замените этот код:
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 задан, то нет необходимости искать какой-либо локатор.
Чтобы отправить последовательность символов в поле "Поиск", вы должны вызвать 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()
Снимок браузера:
Вы только разместили некоторые из 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
здесь.