Невозможно сохранить фокус на элементе в драйвере Selenium Python

Я пытаюсь управлять Интернетом с помощью python, чтобы запустить скрипт и загрузить соответствующий файл csv.

Вот как выглядит веб-страница с меню панели инструментов, где можно щелкнуть другую кнопку «Поиск». После нажатия на кнопку «Поиск» отображается текстовое поле «Поиск», в котором можно ввести код и нажать клавишу «Ввод» для запуска.

Невозможно сохранить фокус на элементе в драйвере Selenium Python

Теперь мне нужно найти элемент этого поля поиска. Из Inspect в Chrome это выглядит так:

Невозможно сохранить фокус на элементе в драйвере Selenium Python

Невозможно сохранить фокус на элементе в драйвере Selenium Python

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

def run_code():

""" Function to copy the code in Search and run it

"""

search_button=driver.find_element_by_link_text("Search")
search_button.click()

time.sleep(2)

with open('data_download_code.txt', 'r') as f:
    code_file= f.read()

content_box=driver.find_element_by_class_name("ace_content")

# Getting the focus on the element
actions=ActionChains(driver)
actions.move_to_element(content_box)
actions.click()

content_box.send_keys(code_file,Keys.ENTER)
#content_box.submit()

Однако он выдает ошибку фокусировки не на элементе.

Я не уверен, получил ли я правильный селектор элементов для поиска из прикрепленного html-файла, или это просто проблема с фокусом. Я использовал класс Actions, чтобы сфокусироваться.

Я хочу, чтобы код прочитал текст в txt-файле и отправил его в поле поиска и нажал клавишу ввода, чтобы запустить его.

WebDriverException: Message: unknown error: cannot focus element
  (Session info: chrome=71.0.3578.98)

Обновлено: дополнительные сведения о html для селектора

Невозможно сохранить фокус на элементе в драйвере Selenium Python

Изменить 2:

Невозможно сохранить фокус на элементе в драйвере Selenium Python

Изменить 3:

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

sourcetype=perf_log_bizx
(host=pc*bcf* OR host=pc*bsfapi* OR servername=pc*bcf* OR servername=pc*bsfapi*) OR
(host=sc*bcf* OR host=sc*bsfapi* OR servername=sc*bcf* OR servername=sc*bsfapi*) OR
(host=ac*bcf* OR host=ac*bsfapi* OR servername=ac*bcf* OR servername=ac*bsfapi*) OR
NOT "/perfLogServlet" NOT "REQ-\[*" earliest = "12/18/2018:08:00:00" latest = "12/18/2018:12:00:00" 

   | rex field=_raw "\[(?<client_ip>[\d\.]+)\]\s+\[(?<company_id>[^,]+),(?<company_name>[^,]+),(?<company_schema>[\w\.]+),(?<dbpool>[^,]+),(?<user_id>[^,]+),\S+\]\s+\S+\s+\S+\s+(?<render_time>\d+)\s(?<server_time>\d+)\s(?<end2end_time>\d+)\s+\S+\s\S+\s\[.*\]\s+\d+\-(?<call_id>\d+)\s+(?<module_id>(-|\w+))\s(?<page_name>(-|\w+))\s(?<page_qualifier>(-|\w+))"
    | rex field=_raw "\[\[(?<MemoryAllocated>\d+)\w+\s+(?<CPUTimeTotal>\d+)\w+\s+(?<CPUTimeUser>\d+)\w+\s+(?<CPUTimeSystem>\d+)\w+\s+(?<FileRead>\d+)\w+\s+(?<FileWrite>\d+)\w+\s+(?<NetworkRead>\d+)\w+\s+(?<NetworkWrite>\d+)\w+\s+(?<NotClosedFiles>(\d+|-))\s+(?<NotClosedSockets>(\d+|-))\s+\]\]\s+(?<SQLInvokes>\d+)\s+(?<SQLTimeTotal>\d+)"

    | eval company_id = ifnull(CMID, company_id)
    | eval dbpool = ifnull(DPN, dbpool)
    | eval company_schema =ifnull(SN, company_schema)
    | eval user_id = ifnull(UID, user_id)

    | eval module_id = ifnull(MID, module_id)
    | eval page_name = ifnull(PID, page_name)
    | eval page_qualifier = ifnull(PQ, page_qualifier)

    | rex field=CAID "\d+\-(?<CAID>\d+)"
    | eval call_id = ifnull(CAID, call_id)

    | eval render_time = ifnull(RDT, render_time)
    | eval server_time = ifnull(SVT, server_time)
    | eval end2end_time = ifnull(EET, end2end_time)
    | eval MemoryAllocated = ifnull(MEM, MemoryAllocated)
    | eval CPUTimeTotal = ifnull(CPU, CPUTimeTotal)
    | eval CPUTimeUser = ifnull(UCPU, CPUTimeUser)
    | eval CPUTimeSystem = ifnull(SCPU, CPUTimeSystem)
    | eval FileRead = ifnull(FRE, FileRead)
    | eval FileWrite = ifnull(FWR, FileWrite)
    | eval NetworkRead = ifnull(NRE, NetworkRead)
    | eval NetworkWrite = ifnull(NWR, NetworkWrite)
    | eval NotClosedFiles = ifnull(0, NotClosedFiles)
    | eval NotClosedSockets = ifnull(0, NotClosedSockets)
    | eval SQLInvokes = ifnull(SQLC, SQLInvokes)
    | eval SQLTimeTotal = ifnull(SQLT, SQLTimeTotal)

    | eval request_type = if (call_id=0,"Root", "Subaction")

| search call_id = 0 AND page_name! = "NONE"

    | eval full_page_name = module_id + "-" + page_name + "-" + page_qualifier + " [" + request_type + "]"
    | eval has_open_sockets = if ( ifnull(NotClosedSockets,0) > 0, 1, 0)
    | eval has_open_files = if ( ifnull(NotClosedFiles,0) > 0, 1, 0)
    | eval time = strftime( _time, "%Y-%m-%d %H:%M:%S" )
    | eval server = ifnull(servername, host)
    | rex field=server "\w(?<dc>\d+)\w"
    | eval dc_name = "DC" + tostring(dc)
    | eval server_type = if (substr(server, 1, 2) = "pc", "PROD", if (substr(server, 1, 2) = "sc", "PREVIEW", if (substr(server, 1, 2) = "ac", "QA", "OTHER") ) )
    | eval dc_company_user =  dc + "|" + company_id + "|" + sha256( user_id )

| table
     time,
     dc_name,
     server_type,
     dbpool,
     company_id,
     full_page_name,
     dc_company_user,
     server_time,
     end2end_time,
     SQLInvokes,
     SQLTimeTotal,
     MemoryAllocated[![][6]][6]

Невозможно сохранить фокус на элементе в драйвере Selenium Python

Edit4:

Код, прочитанный из txt-файла, также читает \ n. Таким образом, в строке есть \ n, и я предполагаю, что это может вызывать проблемы при отправке в WebDriver для запуска в поле поиска. Можно ли прочитать код, как в приведенном выше редактировании?

'sourcetype=perf_log_bizx\n(host=pc*bcf* OR host=pc*bsfapi* OR servername=pc*bcf* OR servername=pc*bsfapi*) OR\n(host=sc*bcf* OR host=sc*bsfapi* OR servername=sc*bcf* OR servername=sc*bsfapi*) OR\n(host=ac*bcf* OR host=ac*bsfapi* OR servername=ac*bcf* OR servername=ac*bsfapi*) OR\nNOT "/perfLogServlet" NOT "REQ-\\[*" earliest = "12/18/2018:08:00:00" latest = "12/18/2018:12:00:00" \n \n | rex field=_raw "\\[(?<client_ip>[\\d\\.]+)\\]\\s+\\[(?<company_id>[^,]+),(?<company_name>[^,]+),(?<company_schema>[\\w\\.]+),(?<dbpool>[^,]+),(?<user_id>[^,]+),\\S+\\]\\s+\\S+\\s+\\S+\\s+(?<render_time>\\d+)\\s(?<server_time>\\d+)\\s(?<end2end_time>\\d+)\\s+\\S+\\s\\S+\\s\\[.*\\]\\s+\\d+\\-(?<call_id>\\d+)\\s+(?<module_id>(-|\\w+))\\s(?<page_name>(-|\\w+))\\s(?<page_qualifier>(-|\\w+))"\n | rex field=_raw "\\[\\[(?<MemoryAllocated>\\d+)\\w+\\s+(?<CPUTimeTotal>\\d+)\\w+\\s+(?<CPUTimeUser>\\d+)\\w+\\s+(?<CPUTimeSystem>\\d+)\\w+\\s+(?<FileRead>\\d+)\\w+\\s+(?<FileWrite>\\d+)\\w+\\s+(?<NetworkRead>\\d+)\\w+\\s+(?<NetworkWrite>\\d+)\\w+\\s+(?<NotClosedFiles>(\\d+|-))\\s+(?<NotClosedSockets>(\\d+|-))\\s+\\]\\]\\s+(?<SQLInvokes>\\d+)\\s+(?<SQLTimeTotal>\\d+)"\n \n | eval company_id = ifnull(CMID, company_id)\n | eval dbpool = ifnull(DPN, dbpool)\n | eval company_schema =ifnull(SN, company_schema)\n | eval user_id = ifnull(UID, user_id)\n \n | eval module_id = ifnull(MID, module_id)\n | eval page_name = ifnull(PID, page_name)\n | eval page_qualifier = ifnull(PQ, page_qualifier)\n \n | rex field=CAID "\\d+\\-(?<CAID>\\d+)"\n | eval call_id = ifnull(CAID, call_id)\n \n | eval render_time = ifnull(RDT, render_time)\n | eval server_time = ifnull(SVT, server_time)\n | eval end2end_time = ifnull(EET, end2end_time)\n | eval MemoryAllocated = ifnull(MEM, MemoryAllocated)\n | eval CPUTimeTotal = ifnull(CPU, CPUTimeTotal)\n | eval CPUTimeUser = ifnull(UCPU, CPUTimeUser)\n | eval CPUTimeSystem = ifnull(SCPU, CPUTimeSystem)\n | eval FileRead = ifnull(FRE, FileRead)\n | eval FileWrite = ifnull(FWR, FileWrite)\n | eval NetworkRead = ifnull(NRE, NetworkRead)\n | eval NetworkWrite = ifnull(NWR, NetworkWrite)\n | eval NotClosedFiles = ifnull(0, NotClosedFiles)\n | eval NotClosedSockets = ifnull(0, NotClosedSockets)\n | eval SQLInvokes = ifnull(SQLC, SQLInvokes)\n | eval SQLTimeTotal = ifnull(SQLT, SQLTimeTotal)\n \n | eval request_type = if (call_id=0,"Root", "Subaction")\n \n| search call_id = 0 AND page_name! = "NONE"\n \n | eval full_page_name = module_id + "-" + page_name + "-" + page_qualifier + " [" + request_type + "]"\n | eval has_open_sockets = if ( ifnull(NotClosedSockets,0) > 0, 1, 0)\n | eval has_open_files = if ( ifnull(NotClosedFiles,0) > 0, 1, 0)\n | eval time = strftime( _time, "%Y-%m-%d %H:%M:%S" )\n | eval server = ifnull(servername, host)\n | rex field=server "\\w(?<dc>\\d+)\\w"\n | eval dc_name = "DC" + tostring(dc)\n | eval server_type = if (substr(server, 1, 2) = "pc", "PROD", if (substr(server, 1, 2) = "sc", "PREVIEW", if (substr(server, 1, 2) = "ac", "QA", "OTHER") ) )\n | eval dc_company_user = dc + "|" + company_id + "|" + sha256( user_id )\n \n| table\n time,\n dc_name,\n server_type,\n dbpool,\n company_id,\n full_page_name,\n dc_company_user,\n server_time,\n end2end_time,\n SQLInvokes,\n SQLTimeTotal,\n MemoryAllocated '

Это частный логин, поэтому нельзя делиться логином. Но веб-страница показывает это на прикрепленном экране. Я не уверен, что получил правильный элемент. Вот почему я поделился соответствующим css. Это не дало мне ошибки в отношении элемента. Итак, я решил, что у меня есть нужный элемент для поля поиска.

Baktaawar 11.01.2019 23:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
1 106
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

content_box=driver.find_element_by_class_name("ace_content")

этот код приведет к тому, что content_box станет элементом «div». вы не можете отправлять ключи к элементу div. проверьте этот div, чтобы найти элемент «textarea» или «input», и установите его в свой content_box.

Я не уверен, что вижу здесь какие-либо комментарии. Я добавил еще один снимок экрана, чтобы показать, что еще есть в файле css.

Baktaawar 11.01.2019 23:24
Ответ принят как подходящий

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

content_box = driver.find_element_by_css_selector("div.ace_content input")
content_box.send_keys(code_file, Keys.ENTER)

или

content_box = driver.find_element_by_class_name('ace_text-input')
content_box.send_keys(code_file, Keys.ENTER)

Также обратите внимание, что, скорее всего, вам не нужно будет использовать Actions.

добавлено еще одно редактирование с дополнительными деталями файла css. Не уверен, что вижу там поле ввода. Это все div

Baktaawar 11.01.2019 23:26

Это не работает. Говорит, что составные имена классов неприемлемы. Итак, я просто использовал div.ace_content, и он говорит, что селектор не найден.

Baktaawar 11.01.2019 23:28

@Baktaawar, обратите внимание, что я использовал find_element_by_css_selector, но не find_element_by_class_name

Andersson 11.01.2019 23:29

@Baktaawar, тоже попробуй driver.find_element_by_class_name('ace_text-input').send_key‌​s(code_file, Keys.ENTER)

Andersson 11.01.2019 23:30

селектором не работает. Но с помощью class_name работал, поскольку я только что обнаружил, что есть класс над тем, который имеет это имя. Отметьте редактировать и изображение. Итак, теперь я могу вставить код текстового файла в поле поиска, но он не запускается. И выдает ошибку

Baktaawar 11.01.2019 23:48

@Baktaawar, что вы имеете в виду под это не работает? Что такое исключение? на какой линии?

Andersson 11.01.2019 23:52

Пожалуйста, отметьте Edit 3. Я могу получить элемент для поля поиска, и он копирует код из txt файла, но я вижу, что он не может правильно скопировать весь код. А потом выдает ошибку. Я приложил полный код, который нужно вставить, а затем запустить в поле поиска.

Baktaawar 11.01.2019 23:52

@Baktaawar, но это ошибка веб-приложения. Кажется, что содержимое файла недействительно. Я не могу вам помочь в этом случае, так как понятия не имею, что именно вам нужно передать в текстовую область ...

Andersson 11.01.2019 23:58

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

Baktaawar 12.01.2019 00:01

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

Baktaawar 12.01.2019 00:08

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

Andersson 12.01.2019 00:17

см. правку 4. Когда я читаю файл с помощью open, он тоже читает \ n. Я думаю, что когда мы выполняем send_keys, он может отправляться с использованием \ n и т.д. Все \ n показаны отдельными строками, а не как "\ n" в тексте. Вы знаете, как читать текстовый текст из файла таким образом, чтобы он не сохранял \ n, а вместо этого сохранял его версию для печати ( отдельная строка)?

Baktaawar 12.01.2019 00:21

Вдобавок к ответу @Andersson (что вы должны принять, кстати, он решил вашу проблему;) позвольте мне помочь вам с удалением \n из исходного текста. Этот код:

with open('data_download_code.txt', 'r') as f:
    code_file= f.read()

, метод read() возвращает исходное значение файла с неповрежденными символами конца строки (EOL). Хотя это:

code_file = f.read.splitlines()

, вернет его (в code_file) как список строк, каждый член списка - это строка в файле. Теперь вопрос - чем заменить символы EOL? Я не знаком с языком, на котором он написан, поэтому решать вам. Скажем, это точка с запятой, ;, вот как преобразовать список обратно в строку:

code_file = ';'.join(code_file)

Это объединит все члены списка в одну строку, используя этот символ в качестве разделителя. Естественно, вы просто заменяете символ на то, что применимо:

code_file = ' '.join(code_file)    # a whitespace character
code_file = '\t'.join(code_file)   # a tab
code_file = '\\n'.join(code_file)  # a literal newline
code_file = 'whatever?'.join(code_file)    # you name it

Итак, окончательная форма такова:

with open('data_download_code.txt', 'r') as f:
   code_file= f.readlines()
   code_file = ';'.join(code_file)

Привет, спасибо за предложение. Я знаю о объединении списков строк. Но я думаю, что \ n проблема не в этом. Потому что, если я заменю \ n пробелом, он все равно не скопирует весь текст в текстовом поле. Итак, я думаю, что это проблема с копированием или отправкой текстовых данных в текстовое поле с использованием python selenium? Есть ли ограничение на то, что можно отправить? Я даже скопировал весь этот текст в виде строки в переменной вместо чтения из файла и отправил его с помощью send_keys, но он копирует несколько символов, но не все.

Baktaawar 14.01.2019 20:00

Нет, я не думаю, что в Selenium есть ограничение на то, сколько данных он может отправлять (я совершенно уверен, что такого нет); гораздо более вероятно, что вас останавливает проверка пользовательского интерфейса (js) или ограничение длины.

Todor Minakov 14.01.2019 20:04

Есть идеи, как я могу это понять? Он не читает весь текст непрерывно, а берет символы между ними, а затем останавливается. Я могу правильно отправлять небольшие тексты (например, имя пользователя и пароль в полях входа)

Baktaawar 14.01.2019 20:30

Попробуйте вручную, скопируйте текст и вставьте, посмотрите, как и где ломается.

Todor Minakov 14.01.2019 20:38

О нет. Вручную работает. Вот как я делал все это время. Я хочу автоматизировать его с помощью этого веб-драйвера Selenium. Так что с этим текстом вообще нет проблем, как будто я его копирую, вставляю в поле поиска и нажимаю ввод, он запускается.

Baktaawar 14.01.2019 20:48

поэтому проблема возникает, когда этот веб-драйвер в приведенном выше коде не может правильно вставить эту текстовую строку в поле поиска.

Baktaawar 14.01.2019 20:49

Эй, я думаю, я понял, в чем проблема. Я разбил его на более мелкий текст из приведенного выше текста. Проблема в том, что если вы напишете весь текстовый код выше в одной строке, он будет копировать его целиком, а затем нажать клавишу ВВОД для запуска. Но если вы измените строку, как указано выше, она копирует только первую строку, а затем, я думаю, она автоматически нажимает ввод. Если код для первой строки может работать как автономный, он будет запущен, но если он зависит от другой строки, он выдает ошибку. Итак, 2 вещи: если ENTER нажимается автоматически после каждой строки, как пропустить это ИЛИ ii) получить весь текст в одной строке?

Baktaawar 14.01.2019 21:49
code_file = ' '.join(code_file) - однострочная строка.
Todor Minakov 14.01.2019 22:13

Есть проблема. При использовании строк чтения также читается \ n. Итак, если вы проверите список строк, к нему прикреплен \ n. Так что, присоединившись к ним через "", \ n не исчезнет.

Baktaawar 14.01.2019 22:44

Только что понял. Мне пришлось убрать "\ n", поскольку строки чтения принимают это. Написал это, и это сработало. с open ('data_download_code.txt', 'r') как f: # code_file1 = f.readlines (). strip ("\ n") code_file = f.read (). replace ("\ n", "")

Baktaawar 14.01.2019 22:50

Другие вопросы по теме