python - 蟒蛇硒。如何使“键”属性起作用?如何在网站页面上查找纯文本?如何自动将页面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 页面的方法。如果有任何帮助,我将不胜感激。
解决方案
首先,硒不允许您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()
推荐阅读
- typescript - 易趣网络 API 调用
- android - 如何创建半弯曲形状的图像?
- docker - Traefik HTTPS 入口点配置无法通过让加密工作
- sql - 在 MAC 上安装和运行 Oracle SQL
- json - 如何使用 JSONDecoder 解码未知类型的 JSON?
- c++ - 迭代 STL 集时的奇怪问题
在 C++ 中 - ionic-framework - 离子部署我们应该删除插件 rm cordova-plugin-console
- javascript - vuejs动态组件为v-bind抛出错误:is,错误是属性或方法...未在实例上定义但在渲染期间引用
- python - 我如何将 Python 中的应用程序转换为在 Android 中运行
- bash - Bash将变量值从for循环传递到嵌套for循环