无法在缺少硬编码延迟的情况下单击网格

2024-10-03 11:26:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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()

How can I click on that grid shaking off hardcoded delay?


Tags: fromimporturlsupport编码bytimedriver
2条回答

按钮不可点击或不可见这一事实没有问题。 问题是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()

您的定位策略非常完美。然而,有两件事:

  • 网站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)
    

相关问题 更多 >