Как нажать на изображение через Selenium с помощью Python

Этот код нарушен как Python. Не только как Python 3; он сломан как Python 2, или как Python 0.9. Похоже, что кто-то, кто не знает Python, пытался что-то конвертировать из JavaScript, но даже не проверял его.

Итак, короткий ответ здесь: перестаньте смотреть эту серию. Это не учит вас Python.


Первая проблема заключается в том, что в Python нет встроенного значения, называемого null.

Там есть значение, называемое None.

Или, может быть, где-то еще в его коде он сделал null = object(), чтобы создать уникальное значение дозорного значения, отличное от None, для использования, когда None является юридическим значением? Но здесь нет смысла делать это; эта функция может возвращать только int.

Кроме того, вы почти никогда не будете использовать != None с None; используйте is not None. И, по тем же причинам, если вы создаете новый настраиваемый дозор, например null = object(), вы также хотите проверить is not null.


Вторая проблема заключается в том, что Python dict s don ' t return None или null или что-либо еще, когда вы просматриваете значение, которого не существует; они поднимают исключение KeyError.

Может быть, он определил memo = collections.defaultdict(lambda: null) и передал это в функцию? Но если это так, здесь нет веских оснований; это просто делает код более сложным и запутанным без какой-либо выгоды.

Правильная вещь здесь была бы except KeyError: или if n in memo или if memo.get(n) is not None:.


Пока мы находимся в этом: Запоминание функции является примером парадигмы идиомы с изменяемым по умолчанию. Он находится в официальном FAQ Python, и я думаю, что даже в учебнике. Зачем заставить пользователя построить memo (и попытаться выяснить, что это должно быть ...), когда это не нужно?


Итак:

def fib(n, *, memo={}):
    if n in memo:
        return memo[n]
    if n == 1 or n == 2:
        result = 1
    else: 
        result = fib(n-1) + fib(n-2)
    memo[n] = result
    return result

Конечно, реальный идиоматический способ написать это использовать батареи, которые поставляются с Python:

@functools.lru_cache(maxsize=None):
def fib(n):
    if n == 1 or n == 2:
        return 1
    return fib(n-1) + fib(n-2)

Преподавание людей, как это сделать вручную, является хорошим но вы также должны показать им, как не изобретать колесо, когда они понимают, как работают колеса.


Что касается того, как печатать результат, это легко: это то же самое, что и любой другой вызов функции , он возвращает значение, и вы можете print это значение:

print(fib(123))

. Хотя не пытайтесь ни одного из них:

print(fib(0))
print(fib(1.5))
print(fib(1001))

... если вы не хотите видеть что RecursionError выглядит в Python.

1
задан DebanjanB 19 January 2019 в 04:27
поделиться

1 ответ

Требуемый элемент является динамическим, поэтому вы должны вызвать WebDriverWait для требуемого ElementToBeClickable , и вы можете использовать любую из следующих стратегий локатора в качестве решения. :

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "td.datagridCellStyle img[onload*='gwtLastUnhandledEvent'][src*='demoreports/DemoReportsApp/clear']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//td[contains(@class, 'datagridCellStyle')]//img[contains(@onload, 'gwtLastUnhandledEvent') and contains(@src, 'demoreports/DemoReportsApp/clear')]"))).click()
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0
ответ дан DebanjanB 19 January 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: