Я нашел, самый простой способ справиться с этими JS postbacks
- это ждать, пока элемент, на который влияет загруженность, будет устаревшим или не будет найден.
Вот примерная функция:
def waitForElementRemoved(Element, WaitCount, WaitTime):
ElementRemoved = False
WaitTry = 0
while not ElementRemoved:
try:
if WaitTry > WaitCount:
raise Exception("Element not removed from page in alloted time")
Test = Element.text
WaitTry += 1
time.sleep(WaitTime)
except (NoSuchElementException, StaleElementReferenceException):
ElementRemoved = True
И тогда я бы выбрал элемент, на который повлиял этот postback load
, и передать его функции вместе с некоторыми аргументами времени.
, например:
driver = webdriver.Firefox()
driver.get("https://www.avis.co.in")
removedElement = driver.find_element_by_id("DrpCity")
mySelect = Select(driver.find_element_by_id("DrpCity"))
mySelect.select_by_visible_text("Pune")
waitForElementRemoved(removedElement, 10, .5)
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='txtPickUp']"))).send_keys("XYZ")
Я не знаю, является ли это лучшим способом обработки событий JavaScript onchange load
, но в моем случае он имеет был очень эффективен.
Чтобы добавить к этому ответу : я обнаружил, что ожидание, пока элемент устареет, не всегда работает, когда есть несколько событий загрузки, у меня есть что использование этого метода вместе с использованием приведенного ниже кода работает намного эффективнее, чтобы убедиться, что эти события динамической нагрузки завершены: (я адаптировал приведенный ниже код из ЗДЕСЬ )
# Wait for AJAX (Jquery or JS) dynamic page load events
class DynamicLoadState:
def __call__(self, driver):
LoadComplete = False
JQueryLoadComplete = False
JSLoadComplete = False
try:
if driver.execute_script("return jQuery.active") == 0: JQueryLoadComplete = True
except Exception:
# JQuery is not present on page
JQueryLoadComplete = True
if driver.execute_script("return document.readyState") == 'complete': JSLoadComplete = True
if JQueryLoadComplete and JSLoadComplete: LoadComplete = True
return LoadComplete
def WaitForDynamicLoad(driver, WaitTime):
WebDriverWait(driver, WaitTime).until(DynamicLoadState())
# Use the first method of waiting for the element to go stale
# then run this to make sure all loading is completed
WaitForDynamicLoad(driver, Counts.WaitTime)
Надеюсь, это поможет кому-то использовать time.sleep()
в будущем для загрузки страницы!
В Java и некоторых других языках целочисленный литерал, начинающийся с 0
, интерпретируется как восьмеричная (база 8).
Для одноразрядных чисел (кроме 08
и 09
, которые не допускаются), результат будет таким же, поэтому вы можете не заметить, что они интерпретируются как восьмеричные.
Например:
010 == 8
024 == 20
Поскольку восьмеричные литералы обычно не то, что вы хотите, вы всегда должны заботиться о том, чтобы никогда не начинать целостный литерал с 0
, если, конечно, вы на самом деле не пытаетесь написать нуль.
В Java, если вы определяете int с ведущим «0», означает, что вы определяете число в Octal.
int a = 08 выдает ошибку вне диапазона, потому что нет никакого число '8' в октябре. Octal предоставляет только 0-7 номеров.
Если вы определяете a = 07, то это не дает ошибку вне диапазона, потому что цифры «0» и «7» находятся в пределах Octal.
Любое число с префиксом 0 считается восьмеричным. Восьмеричные числа могут использовать только цифры 0-7, так же как десятичное число может использовать 0-9, а двоичный код может использовать 0-1.
// octal to decimal
01 // 1
02 // 2
07 // 7
010 // 8
020 // 16
// octal to binary (excluding most significant bit)
01 // 1
02 // 10
07 // 111
010 // 1000
020 // 10000
Есть 10 типов людей, которые понимают троичные, те, кто этого не делает, и те, кто думает, что это глупая шутка.
blockquote>
Ведущий нуль означает, что значение находится в восьмеричном. 8 не является восьмеричной цифрой, не более 2 действителен в двоичном выражении или G имеет значение в шестнадцатеричном формате.
На большинстве языков программирования, таких как Java
и C/C++
, число с начальным нулем интерпретируется как восьмеричное число . Как известно, восьмеричные числа представлены только в пределах от 0
до 7
. Следовательно, числа, подобные 05
, 03
, 054
, действительны, но числа, подобные 078
, 0348
, 09
, 08
, имеют тенденцию к недействительности.
Из спецификации Java :
Октальная цифра состоит из цифры ASCII 0, за которой следует одна или несколько цифр ASCII от 0 до 7 и может представлять собой положительное, нулевое или отрицательное целое.
blockquote>