首页 > 解决方案 > 蟒蛇硒。如何使“键”属性起作用?如何在网站页面上查找纯文本?如何自动将页面ID更改为下一个?

问题描述

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

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

浏览器打开,展开。我传递到必要的站点。我转到登录选项卡,输入登录名和密码。如果我没有登录,我将转到另一个我无法访问的页面。我在那里打开一个带有隐藏文本的剧透。

之后我想通过 Ctrl + F 调用“查找”,但由于某种原因,它不起作用,没有任何反应。总的来说,据我了解,密钥本身不起作用。好像它们没有添加,虽然它似乎是写在代码的开头。

如果找到必要的文本,则截屏并转到 https://site/2,如果没有,则立即转到 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") (вот как это сделать?)

总体上还存在两个问题。这是如何找到文本以及如何使其进入下一个 id 页面的方法。如果有任何帮助,我将不胜感激。

标签: pythonselenium

解决方案


首先,硒不允许您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 上执行相同的操作,到目前为止,最好的方法是将操作封装在一个函数中并在循环中调用该函数,并传递所有 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

现在你可以调用这个函数并传入 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()

推荐阅读