Python Селен. Как заставить работать атрибут "Ключи"? Как найти простой текст на странице сайта? Как автоматически изменить идентификатор страницы на следующую? - PullRequest
0 голосов
/ 14 июля 2020
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time



def main():
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://site.ru/")
    btn_elem1 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/ul/li[2]")
    btn_elem1.click()
    btn_elem2 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[2]/div/p[1]/label/input")
    btn_elem2.click()
    btn_elem2.send_keys("login")
    btn_elem3 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[2]/div/p[2]/label/input")
    btn_elem3.click()
    btn_elem3.send_keys("pass")
    btn_elem4 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[2]/div/a")
    btn_elem4.click()
    time.sleep(1)
    driver.get("https://site/1")
    btn_elem5 = driver.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/fieldset/div[2]/img[1]")
    btn_elem5.click()

    action = ActionChains(driver)
    action.key_down(Keys.CONTROL).send_keys("f").key_up(Keys.CONTROL).perform()
    time.sleep(5)

if __name__ == "__main__":
    main()

Все работает до определенной степени.

Браузер открывается, раскрывается. Перехожу на нужный сайт. I go во вкладку Login вводим логин и пароль. Я перехожу на другую страницу, к которой у меня нет доступа, если я не авторизован. Я открываю там спойлер со скрытым текстом.

После чего я хочу вызвать «Найти» через Ctrl + F, но почему-то не работает, ничего не происходит. И вообще, как я понял, сами клавиши не работают. Как будто их не добавляли, хотя вроде бы написано в начале кода.

А если нужный текст найден, то сделайте скриншот и go на https: // site / 2 , если нет, то сразу go на сайт / 2 и ищи там. Всего там около десяти тысяч страниц, наверное адрес села надо как-то через переменную сделать? И что-то вроде через ++ как это сделать в PHP, вроде плюс один, чтобы он каждый раз добавлялся?

А может как-то иначе можно сделать? Ищите простой текст по всей странице. А если есть, то скриншот и переход дальше, если нет, то сразу идем дальше. (Звездочка вызывает скриншот)

sila = driver.find_element_by_xpath("/html")
if 'Селява' in sila.text:
   action.send_keys("*")
   action.key_down(Keys.CONTROL).send_keys("s").key_up(Keys.CONTROL).perform()
   driver.get("https://site/+1id") (вот как это сделать?)
else:
   driver.get("https://site/+1id") (вот как это сделать?)

В общем остаются две проблемы. Вот как найти текст и как сделать его go на следующую страницу идентификатора. Буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 14 июля 2020

Во-первых, селен не позволяет удобно моделировать ctrl + f. Если вы хотите найти текст на странице, вы можете попробовать одно из двух:

  • Найти указанный текст в .page_source. Однако имейте в виду, что .page_source содержит исходный код всей страницы. Таким образом, вы можете в конечном итоге найти здесь желаемый текст, даже если он не будет видим на веб-интерфейсе .
    if "my text" in driver.page_source:
        # "my text" is present in the source
        # do stuff
    
  • Найдите элемент , содержащий указанный текст. Вы также можете добавить дополнительные шаги, чтобы убедиться, что этот элемент действительно виден. Этот метод дает вам большую гибкость, и я оставлю детали на ваше усмотрение.
    # Make sure you've waited long enough for the page to be loaded
    # Find by XPATH
    try:
        elements = driver.find_elements_by_xpath('//*[contains(text(), "my text")]')
        # "my text" was found in page
        # do stuff
    except NoSuchElementException:
        # Text was not found in page
    
    Однако следует помнить, что contains(text(), 'text') чувствителен к регистру. Если вы хотите, чтобы он был нечувствительным к регистру, обратитесь к этот ответ (в частности, часть подготовки javascript, вы можете добиться того же с помощью python)

Теперь , если вы хотите, чтобы одни и те же операции выполнялись с несколькими URL-адресами, безусловно, лучшим подходом было бы инкапсулировать операции внутри функции и вызвать эту функцию в al oop, передавая все URL-адреса.

def automation_func(url):
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(url)
    btn_elem1 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/ul/li[2]")
    btn_elem1.click()
    btn_elem2 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[2]/div/p[1]/label/input")
    btn_elem2.click()
    btn_elem2.send_keys("login")
    btn_elem3 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[2]/div/p[2]/label/input")
    btn_elem3.click()
    btn_elem3.send_keys("pass")
    btn_elem4 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[2]/div/a")
    btn_elem4.click()
    time.sleep(1)
    driver.get("https://site/1")
    btn_elem5 = driver.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/fieldset/div[2]/img[1]")
    btn_elem5.click()

    # more code here

Теперь вы можете вызвать эту функцию и передать URL-

for i in range(1, 5):
    automation_func(f"https://site.ru/{i}")

Возможно, вам придется изменить это l oop в соответствии с тем, как выглядит URL-адрес, но это основная идея.

f"https://site.ru/{i}" оценивается как https://site.ru/1 в первой итерации, затем https://site.ru/2 и т. Д.

Изменить: вот как код должен быть совмещен -

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time

def automation_func(url, i):
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(url)
    btn_elem1 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/ul/li[2]")
    btn_elem1.click()
    btn_elem2 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[2]/div/p[1]/label/input")
    btn_elem2.click()
    btn_elem2.send_keys("login")
    btn_elem3 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[2]/div/p[2]/label/input")
    btn_elem3.click()
    btn_elem3.send_keys("pass")
    btn_elem4 = driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div/div[2]/div/a")
    btn_elem4.click()
    time.sleep(1)
    driver.get("https://site/1")
    btn_elem5 = driver.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/fieldset/div[2]/img[1]")
    btn_elem5.click()
    time.sleep(5)
    # Find the text using one of the methods here
    if "small" in driver.page_source:
        screenshot = driver.save_screenshot("{i}.png")


def main():
    for i in range(1, 5):
        automation_func(f"https://site.ru/{i}", i)

if __name__ == "__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...