Как работать с разными потоками в разных фреймах одновременно? - PullRequest
1 голос
/ 05 ноября 2019

TL; DR:

Два потока мешают друг другу из-за разного состояния веб-драйвера (разные состояния switch_to ()) (см. Примеры кода «1)» и «2)»).

Более подробно:

Существует веб-сайт (не мой, доступ ограничен, здесь не может отображаться) с 1 главной страницей и 3 фреймами внутри. На главной странице есть счетчик - я читаю значение этого счетчика каждую секунду. Затем у меня есть графический интерфейс, где я могу взаимодействовать с QSlider, который выдает изменения в один из 3-х iframe.

Итак, у меня есть GUI-поток и другой поток (например, который проверяет время).

Где возникает проблема: если излучается сигнал QSlider, вызываемая функция меняет веб-драйвер на определенный кадр (switch_to ()), и когда между mainpage-countdown-checker требуется прочитать обратный отсчет, она не может найтиэлемент, потому что веб-драйвер не находится на главной странице.

Пример кода

Здесь вы можете увидеть две функции, которые мешают друг другу, поскольку вызываются из 2 разных потоков:

1) Эта функция вызывается, поскольку графический интерфейс генерирует сигнал. Чтобы изменить определенный элемент на веб-сайте, необходимо переключить веб-драйвер на определенный кадр:

def click_rating(driver, frame, rating, slider=None, value=None):

    try:
        driver.switch_to.frame(frame)  // SWITCH TO SPECIFIC FRAME
        if slider is None or value is None:
            for i in range(2, 9):
                driver.find_element_by_id("OneChoiceQuestion" + str(i) + str(rating[i-2])).click()
        else:
            driver.find_element_by_id("OneChoiceQuestion" + str(slider+2) + str(value)).click()
    except InvalidArgumentException:
        print("InvalidArgumentException Error: [Deleted].")
    finally:
        driver.switch_to.default_content()  // SWITCH BACK

2) Эта функция вызывается регулярно для проверки таймера обратного отсчета, но это зависит от того, находится ли веб-драйвер в default_content. () ':

def get_passed_time_counter(driver):
    try:
        if driver.find_element_by_id("alarmClock").is_displayed():
            minutes = int(driver.find_element_by_id("alarmClock").text[11:13])
            seconds = int(driver.find_element_by_id("alarmClock").text[14:16])

            new_time = 180 - ((60 * minutes) + seconds)

            return new_time

    except ValueError:
        print("ValueError [update_time]: Couldn't update the time.")
        return False

Таймер обратного отсчета - не единственная проблема, но, вероятно, лучшая для объяснения. Так что я не ищу «исправление», где я просто пытаюсь найти элемент обратного отсчета, пока не найду его, но чтобы найти структуру для такого рода ситуации, когда он ждет, пока другой поток использует определенные функции, и я бы не сталнравится работать с логическими флагами, если для этого есть «чистое» решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...