【问题标题】:unable to click on a div with selenium (ng-click) Python无法使用 selenium(ng-click)Python 单击 div
【发布时间】:2022-02-09 22:36:45
【问题描述】:

大家好,请见谅,我觉得我不能真正解释我的问题,我会再试一次,如果他们不能很好地理解我是,有时我的英文写得很失败很抱歉

我想尝试的是自动访问我离开并链接到这里的网站 RUNT

我解决的第一部分是将数据输入到表单中并在发送时将 im 解析为不发送给机器人

我将在python中发布所有代码

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

import pandas as pd
import threading
import time
import csv
import os


# options = webdriver.ChromeOptions()
# options.add_argument(
#    r'user-data-dir=C:\Users\RADEON\AppData\Local\Google\Chrome\user Data\default')
#
# options.add_extension(r"C:\Users\RADEON\Documents\Web Driver\Selenium\exs.crx")

# driver = webdriver.Chrome(
#    executable_path="C:\\Users\\RADEON\\Documents\\Web Driver\\chrome Driver\\chromedriver.exe",
#    chrome_options=options
# )
#
# driver = webdriver.Firefox()
#
# driver.get("https://www.runt.com.co/consultaCiudadana/#/consultaVehiculo")
# assert "Consulta Ciudadano - RUNT" in driver.title
#
# wait = WebDriverWait(driver, 2)
# wait.until(EC.presence_of_element_located((By.ID, "noPlaca")))
#
#
# wait.until(EC.presence_of_element_located((By.ID, "noPlaca")))


class Runt:

    def __init__(self, placa, nit, time):
        self.placa = placa
        self.nit = nit
        self.options = webdriver.ChromeOptions()
        self.options.add_extension(
            r"C:\Users\RADEON\Documents\Web Driver\cp.crx")

        self.driver = webdriver.Chrome(
            chrome_options=self.options)

        self.wait = WebDriverWait(self.driver, time)
        self.wait_API = WebDriverWait(self.driver, 150)

    def closeBrowser(self):
        self.driver.close()

    def run(self):

        driver = self.driver
        wait = self.wait
        wait_api = self.wait_API
        driver.get("https://www.runt.com.co/consultaCiudadana/#/consultaVehiculo")

        wait.until(EC.presence_of_element_located((By.ID, "noPlaca")))
        placa = driver.find_element_by_id('noPlaca')
        placa.clear()
        placa.send_keys(self.placa)

        wait.until(EC.presence_of_element_located((By.NAME, "noDocumento")))
        owner = driver.find_element_by_name('noDocumento')
        owner.clear()
        owner.send_keys(self.nit)

        # /html/body/div[1]/div/div[1]/div[2]/div[1]/div[2]/div[7]/div[1]

        wait_api.until(EC.presence_of_element_located((
            By.XPATH, "//*[@id='captcha']/div/div[2]/a[1]")))

        while (driver.find_element_by_xpath("//*[@id='captcha']/div/div[2]/a[1]").get_attribute("innerText") != "Solved"):
            print("Search Solution....")
        print("solution found...")

        if(driver.find_element_by_xpath("//*[@id='captcha']/div/div[2]/a[1]").get_attribute("innerText") == "Solved"):
            driver.find_element_by_xpath(
                "/html/body/div[1]/div/div[1]/div[2]/div[1]/div[2]/div[1]/div[3]/div[2]/div/div/form/div[8]/button").click()

        WebDriverWait(driver, 20).until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, "div.panel.panel-default>div.panel-heading>h4.panel-title a"))).click()

        vigente = driver.find_element_by_xpath(
            "//*[@id='pnlRevisionTecnicoMecanicaNacional']/div/div/div/table/tbody/tr[1]/td[5]")

        print(vigente.get_attribute("innerText"))


runt2 = Runt("aqd470", 63364079, 2)
# runt1 = Runt("aqd470", 45884847, 2)
#
# thread1 = threading.Thread(target=runt1.run)
thread2 = threading.Thread(target=runt2.run)
#
# thread1.start()
thread2.start()
# r'C:\Users\RADEON\Documents\Web Driver\csv.csv'

忽略线程正在做一些测试。

在上述网页上运行此程序等待解决我不是机器人并发送表单时,出现我要获取信息的代码

但是在点击下面的div之前,信息不会出现在html中

<div class="panel-heading" ng-click="togglePanel('pnlRevisionTecnicoMecanicaNacional');
                        consultarDetalle('RevisionTecnicoMecanicaNacional')">
                        <h4 class="panel-title">
                            <i class="i_hoja s_25_o1 ib"></i>
                            <a> Certificado de revisión técnico mécanica y de gases (RTM)</a>
                        </h4>
                    </div>

您可以使用此示例数据为 Nplaca 输入“AFD329”,为 Documento 输入“6656954”

其他字段可以保持默认 我需要单击该元素以加载查询的其余部分,如果您能帮助我,将不胜感激

【问题讨论】:

  • driver.find_element_by_xpath("/html/body/div[1]/div/div[1]/div[2]/div[1]/div[2]/div[7]/ div[1]/h4/a").click()
  • 可以是动态的html,可以发一下页面的url吗?
  • 你想和哪个元素交互?
  • 大家好,请见谅,我觉得我不能真正解释我的问题,我会再试一次,如果他们不能很好地理解我是有时我的英文写失败了很多对不起link
  • @ArKaDiA 使用您尝试自动化手动步骤和错误堆栈跟踪(如果有)更新问题

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

根据您的 xpath,您可以在 &lt;h4&gt; 下找到 &lt;a&gt;

元素可能需要一些时间才能可见,为此请尝试 explicitwait 直到元素可见。

导入以下包:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

试试下面的代码:

element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((CSS_SELECTOR, ".panel-title a")))
element.click()

使用绝对 xpath 是不好的做法,请改用相对 xpath。或者在 xpath 上尝试 CSS 选择器。

【讨论】:

    【解决方案2】:

    @NarendraR 的回答是正确的。

    根据您的问题和您提供的 HTML,属性 ng-click 应用于通常不可点击的&lt;div&gt; 节点。因此,您需要在其后代节点之一(即&lt;a&gt; 节点)上调用click(),而不是尝试单击祖先节点&lt;div&gt;

    再次因为元素是Angular 元素,您需要诱导WebDriverWait,您可以使用以下任一解决方案:

    • 使用PARTIAL_LINK_TEXT

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, "Certificado de revisión técnico mécanica y de gases"))).click()
      
    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.panel.panel-default>div.panel-heading>h4.panel-title a"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='panel-heading']/h4[@class='panel-title']//a[contains(.,'Certificado de revisión técnico mécanica y de gases')]"))).click()
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

    【讨论】:

    • DebanjanB 感谢您的帮助,但它不起作用我理解您对我提到的内容,感谢您的帮助扩展问题以提供更多信息
    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2021-09-11
    相关资源
    最近更新 更多