Во время собеседований мы часто сталкиваемся с вопросом: «Как работают скрытые элементы?». Давайте посмотрим, как ими управлять?
JS
Скрипт находит элемент,Получить соответствующий объект элемента,пройти еще разremoveAttribute
иsetAttribute
Существует два метода завершения удаления или сброса атрибутов.копироватьдействовать,Просто сделайте текущий элемент отображаемым.<html>
<body>
имя пользователя:<input id="user_name" name="username" type="hidden" /><br>
пароль:<input id="pass_word" name="password" type="text" /><br>
<button type="button" name="login" class="login_but" style="display:none;" />
</body>
</html>
#В основном используйте JS-скрипт для изменения значения атрибута тега
hi_name = "document.getElementByID('user_name').setAttribute('type', 'text')"
print(driver.execute_script(hi_name))
driver.find_element_by_id('user_name').send_keys("admin")
print(driver.find_element_by_name("логин"))
driver.execute_script("document.getElementsClassName('login_but')[0].removeAttribute('style')")
При автоматическом тестировании вы столкнетесь с такими факторами, как нестабильная среда и нестабильная сеть. В это время вам может потребоваться контролировать скорость выполнения сценария, поэтому вам необходимо использовать операцию ожидания элемента. На самом деле, это не обязательно просто вопрос ожидания. У каждого есть свои плюсы и минусы. Вот некоторые мнения только для справки.
time.sleep(s)
# s представляет конкретное время в секундах.
s
секунды спустя,Сделайте следующий шаг。Используйте напрямуюpython
встроенныйtime
вызов модуляsleep
Просто метод。Преимущества и недостатки | иллюстрировать |
---|---|
преимущество | Простота в использовании, вы можете позвонить в любое время, когда вам это нужно. |
недостаток | Уровень дублирования кода высок и влияет на скорость выполнения кода. Время ожидания невозможно установить точно. Если оно слишком велико или слишком продолжительное, оно кажется неуместным. |
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://localhost/zentao/user-login.html")
user_name = "$('input:first').val('admin')"
driver.execute_script(user_name)
time.sleep(0.5)
pass_wd = "$(':password').val('ZenTao123456')"
driver.execute_script(pass_wd)
time.sleep(1)
driver.implicitly_wait(s)
# s представляет конкретное время в секундах.
s
во времени,Загрузка страницы завершена,Сделайте следующий шаг,Вызывается непосредственно через объект драйвера браузера.Если элемент загружен до установленного времени, он не будет продолжать ждать и перейдет к следующему шагу.
Преимущества и недостатки | иллюстрировать |
---|---|
преимущество | Он работает на протяжении всего жизненного цикла скрипта и его нужно установить только один раз. |
недостаток | Программа будет ждать завершения загрузки, прежде чем выполнить следующий шаг. Однако иногда нужный элемент загружен, но другие элементы не загружены. Прежде чем перейти к следующему, все равно придется дождаться загрузки всех элементов. Этот шаг не очень гибок и требует немного времени. |
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://localhost/zentao/user-login.html")
driver.implicitly_wait(10)
user_name = "$('input:first').val('admin')"
driver.execute_script(user_name)
pass_wd = "$(':password').val('ZenTao123456')"
driver.execute_script(pass_wd)
# Импортировать пакет
from selenium.webdriver.support.wait import
# или
from selenium.webdriver.support.ui import WebDriverWait
lass WebDriverWait(object):
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
"""Constructor, takes a WebDriver instance and timeout in seconds.
:Args:
- driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote)
- timeout - Number of seconds before timing out
- poll_frequency - sleep interval between calls
By default, it is 0.5 second.
- ignored_exceptions - iterable structure of exception classes ignored during calls.
By default, it contains NoSuchElementException only.
Example:
from selenium.webdriver.support.ui import WebDriverWait \n
параметр | иллюстрировать |
---|---|
| приводной объект |
| Установите таймаут обновления страницы |
| Частота обновления страницы。по умолчанию |
| Указывает, что исключения игнорируются,Выдает, если элемент не может быть найден |
WebDriverWait
Модуль имеет два методаuntil
иuntil_not
: def until(self, method, message=''):
"""Calls the method provided with the driver as an argument until the \
return value is not False."""
screen = None
stacktrace = None
end_time = time.time() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.time() > end_time:
break
raise TimeoutException(message, screen, stacktrace)
def until_not(self, method, message=''):
"""Calls the method provided with the driver as an argument until the \
return value is False."""
end_time = time.time() + self._timeout
while True:
try:
value = method(self._driver)
if not value:
return value
except self._ignored_exceptions:
return True
time.sleep(self._poll)
if time.time() > end_time:
break
raise TimeoutException(message)
в: 1. Метод. Существует два типа входящих объектов: один — анонимная функция, другой — заданный объект условия ожидаемые_условия. 2. Сообщение: при возникновении исключения отправьте информацию об исключении в сообщение; 3. Метод «ожидаемые_условия» представлен в файле selenium.webdriver.support импорта ожидаемых_условий.
WebDriverWait
Несколько часто используемых методов заключаются в следующем::
DOM
среди деревьев,Это не означает, что элемент виден,Если он найден, верните элемент;get_ele = WebDriverWait(driver,10).until(expected_conditions.\
presence_of_element_located(By.ID, "xxx"))
DOM
середина,и видимый,Репрезентативные элементы могут отображаться,И ширина, и высота больше 0;get_ele1 = WebDriverWait(driver,10).until(expected_conditions.visibility_of_elemen\
t_located((by=By.ID,value='yyy')))
get_ele2 = WebDriverWait(driver,10).until(expected_conditions.visibility_of(driver\
.find_element(by=By.ID,value='zzz')))
DOM
среди деревьев,Если найден, верните список:get_ele3 = WebDriverWait(driver,10).until(expected_conditions.presence_of_all_elem\
ents_located(By.CSS_SELECTOR,'.boss')))
get_ele4 = WebDriverWait(driver,10).until(expected_conditions.text_to_be_present_i\
n_element_value(By.CSS_SELECTOR,'#su'))
get_ele5= WebDriverWait(driver,10).until(expected_conditions.text_to_be_present_i\
n_element(By.XPATH,"//#[@id='ul']", ты'добавь'))
DOM
серединаили невидимый,если видно,возвращатьсяFalse
,В противном случае верните этот элемент;get_ele6= WebDriverWait(driver,10).until(expected_conditions.invisibility_of_elem\
ent_located(By.CSS_SELECTOR,'#su'))
enable
(Представляет собой кликабельный);get_ele7= WebDriverWait(driver,10).until(expected_conditions.element_to_be_clicka\
ble(By.CSS_SELECTOR,'#su')).click()
ЯсуществоватьучаствоватьНа третьем этапе специального тренировочного лагеря Tencent Technology Creation 2023 года будет проводиться конкурс сочинений. Соберите команду, чтобы выиграть приз!