簡體   English   中英

Python Selenium。 如何使“Keys”屬性起作用? 如何在網站頁面上查找純文本? 如何自動將頁面ID更改為下一個?

[英]Python Selenium. How to make the “Keys” attribute work? How to find plain text on a site page? How to change page id to next automatically?

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()

一切都在一定程度上起作用。

瀏覽器打開,展開。 我傳遞到必要的站點。 我 go 到登錄選項卡,輸入登錄名和密碼。 如果我沒有登錄,我將轉到另一個我無法訪問的頁面。我在那里打開一個帶有隱藏文本的劇透。

之后我想通過 Ctrl + F 調用“查找”,但由於某種原因,它不起作用,沒有任何反應。 總的來說,據我了解,密鑰本身不起作用。 好像它們沒有添加,雖然它似乎是寫在代碼的開頭。

如果找到了必要的文字,則截圖並 go 到 https: // site / 2,如果沒有,則立即 go 並搜索到 site / 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 到下一個 id 頁面。 如果有任何幫助,我將不勝感激。

首先,selenium 不允許您方便地模擬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 執行相同的操作,到目前為止,最好的方法是將操作封裝在 function 中,並在循環中調用 function,傳遞所有 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

現在你可以調用這個 function 並傳入 urls-

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

您可能需要根據 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM