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