使用Python Selenium调用类内方法及抓取站点数据返回空问题咨询
代码问题排查
- 核心业务逻辑未执行
你定义的Test1类是pytest框架的测试用例结构,直接运行当前脚本时这部分代码完全不会触发,实际生效的只有末尾的parse()函数:该函数仅用requests请求了站点首页,拿到的是未登录、未执行SMILES查询的初始静态HTML,自然找不到你需要的目标元素。 - 静态请求无法获取动态内容
你要定位的class="Antineoplastic"的a标签属于登录后提交查询才会异步渲染的动态内容,静态HTTP请求根本拿不到这部分数据,就算你给requests加了登录态,也需要单独抓查询接口的请求参数才能拿到返回结果,直接解析首页HTML不可行。 - 缺少元素等待逻辑
就算你正确触发了Selenium的执行流程,提交查询后结果需要加载时间,没有显式等待直接提取元素也会出现返回空的问题。
修复后的参考逻辑
直接调用Selenium执行全流程即可,不需要混用requests和pytest测试结构:
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait def crawl_passonline(username, password, smi_value): driver = webdriver.Chrome() try: # 打开站点并登录 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").send_keys(username) driver.find_element(By.NAME, "user_password").send_keys(password) driver.find_element(By.ID, "register").click() # 等待登录完成跳转 WebDriverWait(driver, 10).until( expected_conditions.element_to_be_clickable((By.ID, "myHeader1")) ) # 提交SMILES查询 driver.find_element(By.ID, "myHeader1").click() driver.find_element(By.ID, "smiles").click() smi_input = driver.find_element(By.ID, "smi") smi_input.clear() smi_input.send_keys(smi_value) driver.find_element(By.CSS_SELECTOR, "#myContent4 input:nth-child(4)").click() # 等待查询结果加载完成 WebDriverWait(driver, 15).until( expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "a.Antineoplastic")) ) # 提取目标元素 items = driver.find_elements(By.CSS_SELECTOR, "a.Antineoplastic") result = [item.text.strip() for item in items] print(result) return result finally: driver.quit() if __name__ == "__main__": # 替换为你自己的账号密码 crawl_passonline( "MY USER", "MY PASS", "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" )
内容的提问来源于stack exchange,提问作者Gogi
相关产品推荐
相关产品推荐

