WedX - журнал о программировании и компьютерных науках

Python Webdriver: оператор If-And не работает с числовыми значениями

У меня есть оператор IF-AND, который не работает должным образом. Это происходит на Python 2.7.9.

    numberOfActiveConfigs = len(driver.find_elements_by_xpath("//select[@id='active_config']/option"))
    for cnt in range (0, 5):
        print "Count: ", cnt
        temp = len(driver.find_elements_by_xpath("//select[@id='active_config']/option"))
        print type(numberOfActiveConfigs)
        if numberOfActiveConfigs > 3:
            cnt = cnt + 1
        else:
            numberOfActiveConfigs = temp
            cnt = 0
    print "Number of Configs: ", numberOfActiveConfigs

По сути, код сохраняет количество элементов в таблице, а затем проверяет, превышает ли количество элементов 3. Если это так, то он увеличивает счетчик до тех пор, пока не достигнет «5» и остановится. Операторы печати предназначены для отладки.

По какой-то причине оператор «если» продолжает возвращаться как ИСТИНА, несмотря на то, что счетчик равен «2».

Print out:
Count:  0
<type 'int'>
Count:  1
<type 'int'>
Count:  2
<type 'int'>
Count:  3
<type 'int'>
Count:  4
<type 'int'>
Number of Configs:  2

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


  • Почему вам нужно получить варианты 5 раз подряд? 03.08.2015
  • numberOfActiveConfigs установлен за пределами вашего цикла for. Вы всегда сравниваете одно и то же значение, чтобы увидеть, является ли оно > 3 03.08.2015
  • Я удостоверяюсь, что таблица хотя бы частично загружена, прежде чем продолжить тестирование. Мне нужно, чтобы в таблице было указано как минимум 3 объекта, чтобы подтвердить тест, который я делаю. Это помогает мне при запуске того же теста на гораздо более медленной машине. 03.08.2015

Ответы:


1

Мне кажется, вы используете цикл for, где вам нужен цикл while, поскольку цикл for находится в диапазоне 0:5, но вы пытаетесь изменить его внутренне (например, cnt = cnt + 1). С циклом while вы можете сначала установить его (cnt = 0), а затем, пока cnt ‹ 5, пройти через тело. Думаю, это решит вашу проблему. Извините за плохую формулировку.

заменять

for cnt in range (0, 5):

с

cnt = o
while cnt < 5:
    {body}
03.08.2015
  • Именно это я и сделал, когда увидел ваше предложение @Going hamateur. Спасибо за Ваш ответ. Это решило мою проблему. Мне любопытно, есть ли способ достичь той же цели, используя цикл for? 03.08.2015

  • 2

    Я удостоверяюсь, что таблица хотя бы частично загружена, прежде чем продолжить тестирование. Мне нужно, чтобы в таблице было указано как минимум 3 объекта, чтобы подтвердить тест, который я делаю. Это помогает мне при запуске того же теста на гораздо более медленной машине.

    Вам не нужно делать это вручную. Selenium имеет функцию явного ожидания < сильный>встроенный. По сути, вы предоставляете вызываемый объект, который будет выполняться каждые 500 мс (по умолчанию), пока вызываемый объект не оценит значение True, но до M секунд, которые вы настроите.

    В вашем случае вам нужно настраиваемое ожидаемое условие для ожидания чтобы присутствовало более N элементов:

    from selenium.webdriver.support import expected_conditions as EC
    
    class wait_for_n_elements(object):
        def __init__(self, locator, count_):
            self.locator = locator
            self.count = count_
    
        def __call__(self, driver):
            try:
                elements = EC._find_elements(driver, self.locator)
                return len(elements) >= self.count
            except StaleElementReferenceException:
                return False
    

    Применение:

    from selenium.webdriver.common.by import By
    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait    
    
    wait = WebDriverWait(driver, 10)
    wait.until(wait_for_n_elements((By.XPATH, "//select[@id='active_config']/option"), 3))
    

    Здесь мы говорим селену ждать, пока не появится 3 или более параметров, проверяющих условие каждые 500 мс, но не более 10 секунд. Если через 10 секунд условие не будет выполнено, вы получите TimeoutException.

    03.08.2015
  • Это здорово, @alecxe. Как бы я изменил это, если бы я также хотел создать ту же функцию для ожидания загрузки всей таблицы, если это возможно? Вам нужно знать количество элементов, которые вы ожидаете? 03.08.2015
  • @rwbyrd спасибо, это зависит от веб-страницы, вы заранее знаете количество вариантов? 03.08.2015
  • Нет, @alecxe, количество вариантов может варьироваться от 2 до 100. 03.08.2015
  • @rwbyrd хорошо, но как лично вы, как пользователь, определяете, что таблица загружена? 03.08.2015
  • Чтобы узнать, была ли загружена вся таблица, я выполнял поиск определенного профиля, который я ищу, используя созданный мной метод. assertExpectedRegexConditionTrue(self.driver, By.ID, active_config, r^[\s\S]* + option + [\s\S]*$, 60) Где он ждет 60 секунд, чтобы увидеть, загружена ли ожидаемая опция, а затем завершается ошибкой с кодом, указывающим, что ожидаемая опция недоступна. 03.08.2015
  • @rwbyrd, что, если вы создадите, скажем, локатор XPath для поиска определенного текста внутри параметра и будете использовать встроенный EC.presence_of_element_located в качестве условия ожидания?.. 03.08.2015
  • Это очень похоже на то, что может сделать мой метод @alecxe, но я думаю, что использование вашего метода сделает его более чистым и понятным. 03.08.2015
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

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


    Для любых предложений по сайту: [email protected]