如何使用 Selenium 和 Python 在 Python 类中调用方法

Posted

技术标签:

【中文标题】如何使用 Selenium 和 Python 在 Python 类中调用方法【英文标题】:How to call a method within a Python class using Selenium and Python 【发布时间】:2022-01-05 13:14:05 【问题描述】:

我对编码很陌生,我需要解决一件实际的事情,只需从网站获取信息并将其写入 excel(我希望我可以通过指南进行管理),但主要问题是我无法进入网站(该网站是免费的) 你能看看我的代码吗?当我运行它时,我得到了

[] 进程以退出代码 0 结束

import requests
from bs4 import BeautifulSoup
import pytest
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

URL ='http://way2drug.com/passonline/'
HEADERS= 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/96.0.4664.45 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'


class Test1():
  def setup_method(self, method):
    self.driver = webdriver.Chrome()
    self.vars = 
  
  def teardown_method(self, method):
    self.driver.quit()
  
  def test_1(self):
    # Test name: 1
    # Step # | name | target | value | comment
    # 1 | open | /passonline/ |  | 
    self.driver.get("http://way2drug.com/passonline/")
    # 2 | setWindowSize | 1920x1030 |  | 
    self.driver.set_window_size(1920, 1030)
    # 3 | click | css=#registration img |  | 
    self.driver.find_element(By.CSS_SELECTOR, "#registration img").click()
    # 4 | click | name=user_login |  | 
    self.driver.find_element(By.NAME, "user_login").click()
    # 5 | type | name=user_login |  | 
    self.driver.find_element(By.NAME, "user_login").send_keys("MY USER")
    # 6 | click | id=page1 |  | 
    self.driver.find_element(By.ID, "page1").click()
    # 7 | type | name=user_password |  | 
    self.driver.find_element(By.NAME, "user_password").send_keys("MY PASS")
    # 8 | click | id=register |  | 
    self.driver.find_element(By.ID, "register").click()
    # 9 | click | id=myHeader1 |  | 
    self.driver.find_element(By.ID, "myHeader1").click()
    # 10 | click | id=smiles |  | 
    self.driver.find_element(By.ID, "smiles").click()
    self.driver.find_element(By.ID, "smi").click()
    self.driver.find_element(By.ID, "smi").send_keys("CC1(C)C(O)CC[C@@]2(C)C1CC[C@]3(C)C2CCC4[C@@]3(C)CC[C@]5(C(O)=O)C4[C@H](C)C(C)=CC5")
    self.driver.find_element(By.CSS_SELECTOR, "#myContent4 input:nth-child(4)").click()



def get_html(url, params=None):
  r = requests.get(url, headers=HEADERS, params=params)
  return r

def get_content(html):
  soup = BeautifulSoup(html, 'html.parser')
  items = soup.find_all('a', class_='Antineoplastic')

  print(items)

def parse():
  html = get_html(URL)
  if html.status_code == 200:
    get_content(html.text)
  else:
    print('ALL YOUR BASE ARE BELONG TO US')


parse()

【问题讨论】:

Process finished with exit code 0 - 这意味着您的代码没有错误。你已经完成了它,它没有任何问题。所以请关注并改进您的问题。谢谢 但是如果没问题,我应该在这一步的终端中获取一些数据 def get_content(html): soup = BeautifulSoup(html, 'html.parser') items = soup.find_all('a ', class_='抗肿瘤') print(items) 【参考方案1】:

请注意 - 永远不要提供凭据

会发生什么?

您提到您必须执行登录,而 selenium 是一个不错的选择,但您正在做的是调用 parse(),它只能通过 requests 执行调用。因此,如果您查看您的 soup,您将找不到您要查找的内容。

如何解决?

执行您的 selenium 操作并步行到您要抓取的网站。在下一步中,将您的 driver.page_source 推送到 BeautifulSoup 并找到您的元素:

soup = BeautifulSoup(driver.page_source,'html.parser')
items = soup.find_all('a', class_='Antineoplastic')

print(items)

如果你的选择是正确的,你就会得到你的结果。

编辑

关于你的 cmets 一个你可以在哪里结束的线索,对于调试步骤之间的调试,你应该用重点示例提出新问题:

import requests
from bs4 import BeautifulSoup
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

driver = webdriver.Chrome()
 
driver.get("http://way2drug.com/passonline/")
driver.set_window_size(1920, 1030)
driver.find_element(By.CSS_SELECTOR, "#registration img").click()
driver.find_element(By.NAME, "user_login").click()
driver.find_element(By.NAME, "user_login").send_keys("MY USER")
driver.find_element(By.ID, "page1").click()
driver.find_element(By.NAME, "user_password").send_keys("MY PASS")
driver.find_element(By.ID, "register").click()
driver.find_element(By.ID, "myHeader1").click()
driver.find_element(By.ID, "smiles").click()
driver.find_element(By.ID, "smi").click()
driver.find_element(By.ID, "smi").send_keys("CC1(C)C(O)CC[C@@]2(C)C1CC[C@]3(C)C2CCC4[C@@]3(C)CC[C@]5(C(O)=O)C4[C@H](C)C(C)=CC5")
driver.find_element(By.CSS_SELECTOR, "#myContent4 input:nth-child(4)").click()

soup = BeautifulSoup(driver.page_source,'html.parser')
items = soup.find_all('a', class_='Antineoplastic')

print(items)

driver.quit()

【讨论】:

感谢您的反馈!对不起,我很笨,以前从来没有搞过编程,也不能真正理解你在这里的意思:@执行你的硒操作,然后走到你想抓取的网站。在下一步中,将您的 driver.page_source 推入 BeautifulSoup 并找到您的元素:@ @... ,但您正在做的是调用 parse() ,它只能通过 requests@ 执行调用但我已经导入了库请求,或者它是使用多个库的问题?至少我明白 Selenium 生成的代码应该是好的......仍在尝试检查它 硒部分通过chromedriver确认!至少我可以登录 感谢您的代码,虽然它不起作用我相信是因为脚本延迟在我朋友的最大帮助下,它与 driver.implicitly_wait(10) ##【参考方案2】:

使用python-class 时,您必须注意以下几点:

一旦你定义了类方法,你必须在main中创建一个类的实例来调用方法,如下:

test1 = Test1()
test1.setup_method()

在定义方法时,参数需要与您作为参数从 main 传递的参数的数量/类型匹配。举个例子:

def test_1(self):

应该被称为:

test1.test_1()

这个用例

从您的整个代码块中,我提取了几个块并进行了一些修改,以演示 Classes 的实现/用法:

代码块:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

class Test1():
  def setup_method(self):
    print("Within setup_method")
    s = Service('C:\\BrowserDrivers\\chromedriver.exe')
    self.driver = webdriver.Chrome(service=s)


  def teardown_method(self):
    print("Within teardown_method")
    self.driver.quit()

  def test_1(self):
    print("Within test_1") 
    self.driver.get("http://way2drug.com/passonline/")


test1 = Test1()
test1.setup_method()
test1.test_1()
test1.teardown_method()

控制台输出:

Within setup_method
Within test_1
Within teardown_method

参考文献

您可以在以下位置找到一些相关的详细讨论:

How to execute testcases through Python Class using Selenium

【讨论】:

感谢您的回答和课程指南我承认我搞砸了课程,但因为它就像使用现代步枪跳过火药据我所知,这些课程在编码中是非常可扩展的选项跨度> @Gogi 再次阅读您的问题:我无法进入该网站的主要问题(该网站是免费的)您可以查看我的代码吗?当我运行它时,我得到...进程以退出代码 0 结束 我想先解决您的 Process finished with exit code 0 问题,以便为您提供一个良好的开端。祝你好运。

以上是关于如何使用 Selenium 和 Python 在 Python 类中调用方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]

如何使用Python和Selenium分页来抓取页面

如何使用 Selenium 和 Python 在 Python 类中调用方法

如何使用 Selenium 和 Python 在控制台中跳过调试日志

如何在使用 Selenium 和 Python 调用函数之前等待特定 URL 加载

如何使用 Selenium 和 Python 在元素中查找元素?