mycpas 2024-07-04 12:42 采纳率: 0%
浏览 12

python+selenium中使用循环定位网页元素为什么不起作用?

python+selenium中使用循环定位网页元素为什么不起作用?在工作中经常对大量数据在网站上进行查询工作,所以想弄了一个自动查询的,这是代码,写得很烂,在循环里,为什么只有第一次的定位查询起作用?第二次就不行了?

这两行dr.find_element(By.NAME, 'page_psn_input').send_keys(cmid)#这两行代码只在第一次运行时起作用,第二次循环就没反应了,也不报错,在网上查了各种原因也没有弄清楚,试过dr.back()还有refresh等等方法都不起作用

这两行 dr.find_element(By.NAME, 'page_rycx_button').click()#这些代码都是一样的问题,在第二次循环里完全没有任何反应,也没有报错

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import openpyxl

dr = webdriver.Chrome()

dr.get('http://ips.sd.hsip.gov.cn')
time.sleep(1)

dr.find_element(By.NAME, 'username').send_keys('xlalbs')
dr.find_element(By.NAME, 'password').send_keys('abc654321~')
ass=input('输入验证码后点击登陆:')
dr.find_element(By.NAME, 'verificationCode').send_keys(ass)
dr.find_element(By.CLASS_NAME, 'login-btn').click()
input('按下任意键开任务……。')

dr.switch_to.frame(dr.find_element(By.CLASS_NAME, 'iframe'))
workbook=openpyxl.load_workbook('aaa1.xlsx')
sheet=workbook['Sheet1']
row=1
while row < 3:    
    cmid=sheet.cell(row,1).value
    print(cmid)
    
    time.sleep(2)
   dr.find_element(By.NAME, 'page_psn_input').send_keys(cmid)#这两行代码只在第一次运行时起作用,第二次循环就没反应了,也不报错,在网上查了各种原因也没有弄清楚,试过dr.back()还有refresh等等方法都不起作用
  
    dr.find_element(By.NAME, 'page_rycx_button').click()#这些代码都是一样的问题,在第二次循环里完全没有任何反应,也没有报错
    
    time.sleep(3)
    try:
        auuu=dr.find_element(By.XPATH,"//div[@class='datagrid-view2']//table//tr/td[9]/div/div").text
    except Exception as e:
        auuu='未查到'          
    print(auuu)
    sheet.cell(row,3,auuu)
    row=row+1
    time.sleep(1)
workbook.save('bbb.xlsx')

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-04 12:42
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在使用 Python 和 Selenium 进行网页自动化时,你遇到的问题可能是由几个原因造成的。以下是一些可能的原因和相应的解决方案:

    1. 元素定位问题:在循环中,可能因为页面的某些元素在每次循环后发生了变化,导致无法正确定位。确保你的定位方法(如 ID、Name、XPath 等)在循环中仍然有效。

    2. 页面加载问题:可能页面在第一次查询后没有完全加载或更新,导致元素无法被找到。你可以使用 WebDriverWaitexpected_conditions 来等待特定元素出现。

    3. 验证码输入问题:如果验证码每次查询都需要更新,你需要在每次循环前重新输入验证码。

    4. iframe 切换问题:如果查询操作涉及到不同的 iframe,确保每次循环前都切换到了正确的 iframe。

    5. 异常处理:你的代码中使用了 try-except 来捕获异常,但没有看到具体的异常信息,这可能会隐藏一些重要的错误信息。

    6. 浏览器驱动问题:确保你的 Chrome 浏览器驱动与浏览器版本兼容。

    7. 网络延迟问题:网络延迟可能导致页面元素加载不及时,可以尝试增加 time.sleep() 的时间或使用更智能的等待方法。

    这里是一些改进你代码的建议:

    • 使用 WebDriverWaitexpected_conditions 来等待元素可交互:

      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      wait = WebDriverWait(dr, 10)  # 设置最长等待时间为10秒
      element = wait.until(EC.visibility_of_element_located((By.NAME, 'page_psn_input')))
      
    • 确保每次循环前都重新输入验证码:

      ass = input('输入验证码后点击登陆:')
      dr.find_element(By.NAME, 'verificationCode').send_keys(ass)
      
    • 每次循环前重新切换到正确的 iframe:

      dr.switch_to.frame(dr.find_element(By.CLASS_NAME, 'iframe'))
      
    • 打印异常信息以便于调试:

      try:
          auuu = dr.find_element(By.XPATH, "//div[@class='datagrid-view2']//table//tr/td[9]/div/div").text
      except Exception as e:
          print(e)  # 打印异常信息
          auuu = '未查到'
      
    • 确保你的 Excel 操作不会影响循环:

      sheet.cell(row, 3).value = auuu
      

    如果你需要进一步的帮助或者想要了解更多关于 Selenium 的信息,可以访问 Selenium 的官方文档:Selenium 文档

    希望这些建议能帮助你解决问题!如果还有其他问题,随时欢迎提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月4日
  • 创建了问题 7月4日