【问题标题】:Can't click on a grid with the absence of some hardcoded delay无法单击没有硬编码延迟的网格
【发布时间】:2020-05-18 17:10:18
【问题描述】:

我正在尝试使用 selenium 点击此 webpage 中可用的 Jetzt bewerben。如果我坚持硬编码延迟,我到目前为止编写的脚本可以单击该网格。我想在不使用任何硬编码延迟的情况下进行点击。

我试过了:

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

url = "https://jobs.deloitte.de/job/D%C3%BCsseldorf-Werkstudent-%28mwd%29-Administration-Business-Process-Solutions/522320501/"

driver = webdriver.Chrome()
driver.get(url)
wait = WebDriverWait(driver,10)

time.sleep(5)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,"a#bewerben_top > h1"))).click()

如何单击该网格以摆脱硬编码延迟?

【问题讨论】:

  • 不延迟会怎样?
  • 当我没有延迟时,脚本似乎没有点击该链接。它也不会抛出任何错误。
  • 你能检查是否有任何控制台错误?那么页面被加载时会发生什么,元素也被加载但元素没有绑定到javascript操作或相关的javascript仍在加载中。所以你的visibility_of_element_located 会看到元素但不会做任何事情。另一种方法可能是等待页面完全加载后您知道会出现的其他元素

标签: python python-3.x selenium selenium-webdriver web-scraping


【解决方案1】:

按钮不可点击或不可见这一事实没有问题。 问题是 Javascript 对按钮做了一些“魔术”。

您需要做的就是等到文档完成。

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

url = "https://jobs.deloitte.de/job/D%C3%BCsseldorf-Werkstudent-%28mwd%29-Administration-Business-Process-Solutions/522320501/"

driver = webdriver.Chrome()
driver.get(url)
wait = WebDriverWait(driver,10)

wait.until(lambda d: d.execute_script("return document.readyState")=='complete')
driver.find_element_by_css_selector("a#bewerben_top > h1").click()

【讨论】:

    【解决方案2】:

    您的定位器策略非常完美。但是,有几件事:

    • 似乎https://jobs.deloitte.de/job/D%C3%BCsseldorf-Werkstudent-%28mwd%29-Administration-Business-Process-Solutions/522320501/ 网站的浏览上下文 甚至在document.readyState 变为complete 之前就返回了控制权。
    • 理想情况下,您应该确认接受网站的 cookie 政策。
    • 根据最佳实践,在调用click() 时,您需要为element_to_be_clickable() 诱导WebDriverWait
    • 您可以使用以下Locator Strategies

      driver.get("https://jobs.deloitte.de/job/D%C3%BCsseldorf-Werkstudent-%28mwd%29-Administration-Business-Process-Solutions/522320501/")
      WebDriverWait(driver, 10).until(lambda driver: driver.execute_script('return document.readyState') == 'complete')
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#cookie-acknowledge"))).click()
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a#bewerben_top > h1"))).click()
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
    • PS:在这种情况下,您可能需要等待 jQuerycomplete,如下所示:

      WebDriverWait(driver, 20).until(lambda driver: driver.execute_script('return jQuery.active') == 0)
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多