Как отправить текст в текстовую область через Selenium и Python в соответствии с HTML

Не могу понять, как написать текст во всплывающее окно, вот как выглядит всплывающее окно: введите здесь описание изображения

<textarea style="position: absolute; padding: 0px; width: 1px; height: 1em; outline: currentcolor none medium;" autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" wrap="off"></textarea>

Вот как я пытался получить к нему доступ с помощью XPath:

driver.find_element_by_xpath("/html/body/div/div[1]/textarea").send_keys("Some text here")

Получение ошибки, что элемент не найден на странице:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: /html/body/div/div[1]/textarea

Я также использовал css_selector для доступа к элементу, но все та же ошибка. Как я могу правильно получить доступ к всплывающему окну?

Вот еще HTML-код: https://pastebin.com/6jdix2Cm


person Andrew    schedule 26.07.2018    source источник
comment
Кажется, это в iframe. не могли бы вы поделиться еще немного HTML вокруг этого textarea   -  person cruisepandey    schedule 26.07.2018
comment
вот еще код pastebin.com/6jdix2Cm. Textarea завернута в iframe   -  person Andrew    schedule 26.07.2018
comment
Возможный дубликат переключение на iframe в selenium python   -  person Guy    schedule 26.07.2018
comment
@Andrew: Можете ли вы дать нам обновление? Был ли какой-либо из ответов полезен? или вы все еще сталкиваетесь с какой-либо проблемой?   -  person cruisepandey    schedule 26.07.2018
comment
@cruisepandey Большое спасибо, это решило мою проблему!   -  person Andrew    schedule 26.07.2018
comment
Отвечает ли это на ваш вопрос? Выберите iframe с помощью Python + Selenium   -  person Prophet    schedule 04.06.2021


Ответы (2)


Согласно вашему ответу, это textarea находится в iframe.

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

Для переключения на iframe вы можете использовать этот код:

driver.switch_to.frame(driver.find_element_by_xpath("//iframe[@src='https://qsm.qoo10.sg/gmkt.inc.gsm.web/common/scripts/module/tiny_mce_4.5.7/source/plugins/codemirror/source.html']"))  

то вы можете взаимодействовать с textarea как:

driver.find_element_by_css_selector("textarea[spellcheck='false'][wrap='off'][style$='outline: currentcolor none medium;']").send_keys("Some text here")  

Всегда полезно переключиться на содержимое по умолчанию, как только вы закончите работу с конкретным iframe. Для этого вам понадобится этот код:

driver.switch_to.default_content()

Надеюсь, это поможет.

person cruisepandey    schedule 26.07.2018
comment
driver.switch_to.frame() устарел, а driver.switch_to.defaultContent() не является реализацией Python API WebDriver. - person Jan Rozycki; 26.07.2018
comment
@JanRozycki: О какой версии селена вы говорите? Я работаю с селеном 3.12.0, и он отлично работает. - person cruisepandey; 26.07.2018
comment
Кроме того, с каких пор Python использует верблюжий регистр и точки с запятой? ;) - person Jan Rozycki; 26.07.2018
comment
@JanRozycki, switch_to.frame() не устарело. Устаревший switch_to_frame() - person Andersson; 26.07.2018
comment
@cruisepandey использует switch_to.default_content() вместо switch_to.defaultContent(); - person Andersson; 26.07.2018
comment
@JanRozycki: Разве вы не можете просто прочитать, что они упомянули: switch_to_frame(frame_reference) Deprecated используйте driver.switch_to.frame. Теперь точка с запятой - опечатка. Просто проясните свои факты, прежде чем делать такого рода предположения и голосовать против. - person cruisepandey; 26.07.2018
comment
@Andersson: Да, это была просто опечатка, я скопировал ее. Хотя я убрал точку с запятой. Спасибо. - person cruisepandey; 26.07.2018
comment
Прости за это @cruisepandey - person Jan Rozycki; 26.07.2018
comment
@JanRozycki: Нет проблем. и вы видите, что: кто-то тоже нашел эти комментарии полезными. Не судите слишком рано. Ваше здоровье ! - person cruisepandey; 26.07.2018

Согласно HTML, которым вы поделились, так как <textarea> находится внутри <iframe>, вам нужно заставить WebDriverWait переключиться на нужный фрейм, а затем снова вызовите WebDriverWait, чтобы нужный элемент был активным перед отправкой последовательности символов, и вы можете использовать следующее решение:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[contains(@src,'gmkt.inc.gsm.web/common/scripts/module/tiny_mce_4.5.7/source/plugins/codemirror/source.html')]")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.TAG_NAME, "textarea"))).send_keys("Andrew")

Примечание. Вы должны добавить следующие импорты:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
person DebanjanB    schedule 26.07.2018