Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Подскажите какой есть аналог str.find() в Python??

python
webdriver
Теги: #<Tag:0x00007f7b61b598a0> #<Tag:0x00007f7b61b59760>

(Jeyson X) #1

Всем привет.
Подскажите, можно ли как то иначе переписать кусок кода с поиском текста на странице?
Я только изучаю питон и не все ньюансы знаю. Буду благодарен за помощь.

bb = u'АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЭЮЯ'
buk1 = random.choice(bb)
buk2 = random.choice(bb)
prob = ' '
num = random.randint(000000, 999999)
passp = '' + buk1 + buk2 + ' ' + `num`

PageText = driver.find_element_by_tag_name("body").text
isSuccsses = PageText.find(passp)

while isSuccsses == -1:

#-----------заполнить поля с номером телефона----------
        driver.get("https://172.18.200.83/frsdealergate/chooseAction.do")
        mss = driver.execute_script("var result = prompt('Input the telephone number'); return result")
        srch = driver.find_element_by_id("simsimPhone")
        srch.clear()
        srch.click()
        srch.send_keys(mss)
        srch = driver.find_element_by_name("simsimPhoneConfirm")
        srch.clear()
        srch.click()
        srch.send_keys(mss)
#----------клик по линку Дальше
        srch = driver.find_element_by_link_text("Дальше")
        srch.click()
        PageText = driver.find_element_by_tag_name("body").text
        isSuccsses = PageText.find(passp)

print("Good")

Вкратце о содержимом кода:
грузится страница с формой заполнения поля номера телефона и его подтверждения
нажимается линк “Дальше” и проверяется наличие текста из passp на следующей странице, если его нет то цикл по новой заполнять номер телефона

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

Как можно по другому описать данную проверку наличия текста на странице ?


(Ray Romanov) #2

Походу грабит весь видимый текст на сторону теста (клиента), поэтому и долго, много данных передается и процесс граба тоже трудоемкий по всем веткам видимый текст повыкусывать…
Используй поиск по XPath.


(Jeyson X) #3

Я просто не знаю как добраться до этого элемента:

<tr bgcolor="#EFEFEF">
    <td class="content">Паспортні дані:<!--Паспорт--> </td>
    <td colspan="3" class="content">ВЗ 441666 
</tr>

Вот этот номер ВЗ 441666 как раз то, что ищется на странице.


(Yury) #4

Если номер паспорта заранее известен, то используй XPATH:

//td[@class = "content"][contains(text(), "ВЗ 441666")]

(Jeyson X) #5

дело в том, что этот номер постоянно меняется
можно ли как то в это выражение

[contains(text(), "ВЗ 441666")]

вместо номера всунуть переменную из которой оно будет считывать какой текст искать?
я так уже пробовал, но в силу еще не полного освоения синтаксиса не мог правильно составить данную конструкцию …


(Yury) #6

Можно сделать так, если я правильно понял вашу задачу:

pass_num = "AA123456"
driver.find_element_by_xpath('//td[@class = "content"][contains(text(), "{}")]'.format(pass_num))

(Jeyson X) #7

пытаюсь посмотреть, что же он нашел

PageText = driver.find_element_by_xpath('//td[@class = "content"][contains(text(), "{}")]'.format(passp))
print(PageText)

выдает такую ошибку
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)


(Ray Romanov) #8
PageText = driver.find_element_by_xpath('//td[@class = "content"][contains(text(), "{}")]'.format(passp))
print(PageText.text)

(Jeyson X) #9

все так же ((

PageText = driver.find_element_by_xpath('//td[@class = "content"][contains(text(), "{}")]'.format(passp))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

(Yury) #10

Попробуй в заголовке файла написать:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

(Jeyson X) #11

это есть …
т.е. я так понял по другому как то достучаться до того тега td в котором находится значение из переменной passp нет ?


(Виталий Коряков) #13

как вариант попробуйте регуляркой искпать нужный формат паспорта.


(Jeyson X) #14

пробовал уже все подвыверты с этим способом … и все никак

PageText = driver.find_element_by_xpath("//td[@class = 'content'][contains(text(),'{}')]")

selenium.common.exceptions.NoSuchElementException: Message: u"Unable to find element with xpath == //td[@class = 'content'][contains(text(),'{}')]"


(Виталий Коряков) #15

потмоу что у вас нету локатора с текстом “{}”. Видимо RayRom что то другое имел в виду.
Попробуйте убрать скобки, и искать просто пустую строку.


(Ray Romanov) #16

Вообще то я эту строку указывал…


(Виталий Коряков) #17

Вот есть подобная тема


(Yury) #18

Очевидно же, что вы где-то с кодировкой намудрили. И скорее всего здесь:

passp = '' + buk1 + buk2 + ' ' + `num`

Проверь, что возвращает переменная passp


(Jeyson X) #19

Все, нашел решение.
Виталий. помогла Ваша ссылка.

driver.find_element_by_xpath('//td[@class = "content"][contains(text(), "' + passp + '")]')

и потом проверка найденного текста

print(PageText.text)

Всем спасибо за помощь, все советы были к месту.


(ex3me0) #20

А что делать когда номер паспорта неизвестен?)

//td[@class="content" and contains(text(), 'Паспортні дані')]/following-sibling::td[1]

(Jeyson X) #21

Номер паспорта известен всегда, потому, что он заполняется в поле на предыдущей странице.

Но все равно как оказалось это решение все равно для меня не совсем подходит т.к. это ломает цикл while, он не выполняется если на странице нет элемента как в моем случае passp или в Вашем 'Паспортні дані’