При использовании Selenium, вставляется часть текста в поле
Использую БД sqlite3, из которого беру информацию для сайта. Но при тестировании (при повторном запуске, буквы могут быть другими) выводит не полный текст на сайте, пример:
Вот мой код:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import sqlite3
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import UnexpectedAlertPresentException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
con = sqlite3.connect(r'F:\db\Telegram_Bot\Base.db')
base = con.execute(f"SELECT * FROM Passport").fetchall()
for result in base:
try:
con.execute(f"ALTER TABLE Passport ADD COLUMN INN TEXT")
except:
pass
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(executable_path='<path-to-chrome>', options=options)
browser.get('https://service.nalog.ru/inn.do')
timeout = 5
wait = WebDriverWait(browser, timeout)
browser.find_element(By.ID, 'unichk_0').click()
browser.find_element(By.CLASS_NAME,'btn-next').click()
# fAMILY_1 = result[0]
# nAME_1 = result[1]
# fATHERNAME_1 = result[2]
# bIRTHDAY = result[7]
# pASSP_SERIES = result[9]
# pASSP_NUMBER = result[10]
# dELIVERYDATE = result[11]
time.sleep(2)
browser.find_element(By.NAME,'fam').send_keys(result[0])
browser.find_element(By.NAME,'nam').send_keys(result[1])
browser.find_element(By.NAME,'otch').send_keys(result[2])
browser.find_element(By.NAME,'bdate').send_keys(result[7])
time.sleep(10)
browser.close()
Помогите пожалуйста разобраться, почему текст выводится не полный (в print выводит полный).
Ответы (2 шт):
в продолжение диалога так сказать, Action chains
вот пример, 3 комментария на русском :)
# import webdriver
from selenium import webdriver
# import Action chains
from selenium.webdriver.common.action_chains import ActionChains
# create webdriver object
driver = webdriver.Firefox()
# get geeksforgeeks.org
driver.get("https://www.geeksforgeeks.org/")
# get element
element = driver.find_element_by_class_name("gsc-input")
# create action chain object
action = ActionChains(driver)
# click the item КЛИКАЕМ МЫШКОЙ НА ПОЛЕ ВВОДА
action.click(on_element = element)
# send keys С КЛАВИАТУРЫ ШЛЕМ СИМВОЛЫ СТРОКИ
action.send_keys("Arrays")
# perform the operation ЭТО ОБЯЗАТЕЛЬНО,
#ЗАПУСК ЦЕПОЧКИ АКЦИЙ :) не АЦЦЦКИ
action.perform()
пример отсюда https://www.geeksforgeeks.org/send_keys-method-action-chains-in-selenium-python/
что в вашем случае будет так
action = ActionChains(driver)
### browser.find_element(By.NAME,'fam').send_keys(result[0])
action.click(on_element = browser.find_element(By.NAME,'fam'))
action.send_keys(result[0])
### ... остальные поля
action.perform()
прим., есть еще способ
driver.execute_script(f"document.getElementsByName('lfam').value={result[0]}")
upd.
так как на налог.ру стоят javascipt-ы от яндекса, блокирующие стандартные методы ввода, то тут https://stackoverflow.com/questions/50139506/how-can-you-reduce-the-speed-of-entering-characters-selenium-python предложено следующее, посимвольный ввод:
import time
def send_delayed_keys(element, text, delay=0.3) :
for c in text :
endtime = time.time() + delay
element.send_keys(c)
time.sleep(endtime - time.time())
и при вызове:
send_delayed_keys(browser.find_element(By.NAME,'nam'), "АБВГДЕЁЖЗИКЛМНОПРСТУФ", 0.2)
он медленно, но аккуратно, всё-таки заполняет поле
Благодаря ответу @nexoma. Дальше была проблема с полем - Серия и номер документа. Решил тем же способом, но немного изменил. Вот код (может быть коряво... но ведь работает :-) ):
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import sqlite3
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import UnexpectedAlertPresentException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
con = sqlite3.connect(r'F:\db\Telegram_Bot\Base.db')
base = con.execute(f"SELECT * FROM Passport").fetchall()
def send_delayed_keys(element, text, delay=0.1) :
for c in text:
endtime = time.time() + delay
element.send_keys(c)
time.sleep(endtime - time.time())
def send_delayed_keys_number(element, text, delay=0.1) :
for c in str(abs(text)):
endtime = time.time() + delay
element.send_keys(c)
time.sleep(endtime - time.time())
for result in base:
try:
con.execute(f"ALTER TABLE Passport ADD COLUMN INN TEXT")
except:
pass
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(executable_path='<path-to-chrome>', options=options)
browser.get('https://service.nalog.ru/inn.do')
browser.find_element(By.ID, 'unichk_0').click()
browser.find_element(By.CLASS_NAME,'btn-next').click()
fAMILY_1 = result[0]
nAME_1 = result[1]
fATHERNAME_1 = result[2]
bIRTHDAY = result[7]
pASSP = int(str(result[9]) + str(result[10]))
dELIVERYDATE = result[11]
time.sleep(2)
send_delayed_keys(browser.find_element(By.NAME,'fam'), fAMILY_1, 0.1)
send_delayed_keys(browser.find_element(By.NAME,'nam'), nAME_1, 0.1)
send_delayed_keys(browser.find_element(By.NAME,'otch'), fATHERNAME_1, 0.1)
browser.find_element(By.NAME,'bdate').send_keys(bIRTHDAY)
if len(str(pASSP)) == 10:
send_delayed_keys_number(browser.find_element(By.NAME,'docno'), pASSP , 0.1)
else:
pass
browser.find_element(By.NAME,'docdt').send_keys(dELIVERYDATE)
browser.find_element(By.ID, 'btn_send' ).click()
time.sleep(10)
browser.close()
