При использовании Selenium, вставляется часть текста в поле

Рейтинг: 0Ответов: 2Опубликовано: 14.03.2023

Использую БД 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 выводит полный).

Ответы

▲ 0Принят

в продолжение диалога так сказать, 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)

он медленно, но аккуратно, всё-таки заполняет поле

▲ 1

Благодаря ответу @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()