[英]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.