Не могу использовать Selenium send_keys () для редактора WYSWYG - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь автоматизировать публикацию статей в своем блоге, который обслуживает Naver с Selenium.

Проблема в том, что я не могу поместить текст в редактор.Я пытался использовать send_keys(), но это не работает.Вот мой код Python Selenium, который я пробовал.

driver = webdriver.Chrome('./chromedriver')    

driver.get('https://section.blog.naver.com')
driver.find_element_by_xpath("//a[@class = 'login_button']").click()
time.sleep(1)

driver.execute_script("document.getElementsByName('id')[0].value=\'" + user_id + "\'")
driver.execute_script("document.getElementsByName('pw')[0].value=\'" + password + "\'")
driver.find_element_by_xpath("//input[@title = 'Sign in']").click()
time.sleep(1)

driver.find_element_by_xpath("//a[@bg-nclick = 'hmp*s.write']").click()
time.sleep(1)

driver.switch_to.window(driver.window_handles[-1])
driver.switch_to.frame('mainFrame')

driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[2]/div/div/div/div[1]/article/div/header/button").click()
driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[2]/div/div/div/div[1]/div[2]/section/article/div[1]/div").click()

#This line is being a problem.
driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[2]/div/div/div/div[1]/div[2]/section/article/div[1]/div[1]/div/div/p/span").send_keys('Heading1')

Выдает исключение, как показано ниже.

---------------------------------------------------------------------------
ElementNotInteractableException           Traceback (most recent call last)
<ipython-input-50-e483e0f23c79> in <module>
     25 driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[2]/div/div/div/div[1]/article/div/header/button").click()
     26 driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[2]/div/div/div/div[1]/div[2]/section/article/div[1]/div").click()
---> 27 driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[2]/div/div/div/div[1]/div[2]/section/article/div[1]/div[1]/div/div/p/span").send_keys('Heading1')
     28 #driver.execute_script("document.getElementByXpath('/html/body/div[1]/div/div[2]/div[2]/div/div/div/div[1]/div[2]/section/article/div[1]/div[1]/div/div/p/span').value='Heading1'")

~/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py in send_keys(self, *value)
    477         self._execute(Command.SEND_KEYS_TO_ELEMENT,
    478                       {'text': "".join(keys_to_typing(value)),
--> 479                        'value': keys_to_typing(value)})
    480 
    481     # RenderedWebElement Items

~/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py in _execute(self, command, params)
    631             params = {}
    632         params['id'] = self._id
--> 633         return self._parent.execute(command, params)
    634 
    635     def find_element(self, by=By.ID, value=None):

~/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

~/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

ElementNotInteractableException: Message: element not interactable

Я знаю, что означает "ElementNotInteractableException: Message: element not доходный".Хотя я перепробовал все возможные Xpath, чтобы найти элемент, который мог бы использовать send_keys(), я потерпел неудачу;Затем последовало то же исключение.

Итак, я посмотрел исходный код веб-редактора.Он работает незнакомым образом, используя iframes и множество элементов с автоматически генерируемыми идентификаторами.Вот так выглядит редактор.

enter image description here

Вот короткое видео, которое может дать вам немного больше представления о работе редактора.

https://youtu.be/os2ruSV4jBU

Если у вас есть идеи, что мне попробовать, пожалуйста, дайте мне знать.

* edit

Как вы можете видеть в коде python, я рассматриваю javascript для веб-автоматизации.Однако проблема заключается в элементе span, который, как я подозреваю, работает как элемент input, имеет автоматически сгенерированный случайный идентификатор.Единственной возможностью было выбрать его с помощью Xpath, но, к сожалению, в Javascript нет getElementByXpath().

enter image description here

1 Ответ

2 голосов
/ 25 сентября 2019

РЕДАКТИРОВАТЬ 1 - Javascript метод

Вы можете попытаться отправить текст в элемент span с помощью JavaScript.

Вот пример:

driver.executeScript("document.getElementById('elementID').setAttribute('value', 'yourTextHere')");

Вы можете заменить 'elementId' на идентификатор элемента span.

EDIT 2 - метод Javascript с XPath

Я понимаю, что ваш span содержит динамический идентификатор и не может быть найден никаким другим методом, кроме XPath.Для этого решения мы можем получить span, используя его XPath, а затем получить его ID для передачи в метод Javascript.

IWebElement textAreaElement = driver.findElement(By.XPath("//article//span"));
string textAreaElementId = textAreaElement.GetAttribute("id");
driver.executeScript("document.getElementById('" + textAreaElementId + "').setAttribute('value', 'yourTextHere')");

В этом примере вы находите элемент span, используя XPath,тогда вы получаете его атрибут ID.Вы передаете атрибут ID в функцию JS для правильного определения местоположения вашего элемента span.

В качестве альтернативы, вы можете попробовать это просто:

IWebElement textAreaElement = driver.findElement(By.XPath("//article//span"));
driver.executeScript("arguments[0].setAttribute('value', 'yourTextHere')", textAreaElement);

В этом случае вы передаетесам элемент непосредственно в функцию JS.

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Я заметил, что вы используете абсолютные XPath для некоторых ваших локаторов.Если вы хотите вообще их упростить, вы можете использовать относительную нотацию XPath, как я использовал выше: //.Я приведу несколько примеров некоторых из ваших XPath, которые можно упростить:

Абсолютный XPath # 1

driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[2]/div/div/div/div[1]/article/div/header/button").click()

Относительный XPath # 1

driver.find_element_by_xpath("//article/div/header/button").click()

АбсолютXPath # 2

driver.find_element_by_xpath("/html/body/div[1]/div/div[2]/div[2]/div/div/div/div[1]/div[2]/section/article/div[1]/div").click()

Относительный XPath # 2

driver.find_element_by_xpath("//article/div[1]/div").click()

Вам не нужно начинать весь путь с вершины узла html документа, чтобы использовать XPath.Вы можете использовать запись //, чтобы запустить XPath из любой точки на странице.

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