【问题标题】:Python Selenium Wait not working / Java Selenium QuestionPython Selenium 等待不起作用/Java Selenium 问题
【发布时间】:2021-07-07 23:30:12
【问题描述】:

我遇到了一个问题,在我的一生中,我无法弄清楚为什么它不起作用,尤其是因为用法应该非常简单。我根本无法等待在 Selenium 中工作。隐式和显式等待都不起作用,我不知道为什么。

这是我的代码:

from os import times
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
import json
from dataclasses import dataclass, asdict
import time

USER_NAME = "username"
PASSWORD = "password"


options = webdriver.ChromeOptions()

options.add_argument('--igcognito')
#options.add_argument('--headless')

driver = webdriver.Chrome('c:\\path\\to\\chromedriver.exe',options=options)


driver.get("URL")



driver.find_element_by_name("username").send_keys(USER_NAME)

driver.find_element_by_name("password").send_keys(PASSWORD)

driver.find_element_by_xpath("/html/body/div/div/div/div[2]/div[2]/form/button").click()

driver.get("URL")

driver.implicitly_wait(30)


expansion_buttons = driver.find_elements_by_class_name("class-control")

print(len(expansion_buttons))

for x in range(len(expansion_buttons)):
    driver.execute_script("arguments[0].click();", expansion_buttons[x])

#time.sleep(120)
#driver.implicitly_wait(60)
try:

    wait = WebDriverWait(driver, 120)
    wait.until(expected_conditions.visibility_of_all_elements_located((By.CLASS_NAME, "stuff")))
finally:
   # driver.quit()
    pass

vehicles_classes = driver.find_elements_by_class_name("stuff")

print(len(vehicles_classes))

【问题讨论】:

  • 您的问题是关于 Java 还是 Python?它应该是其中之一,而不是两者,否则问题可能会结束。
  • Python 真的和显式和隐式等待的问题。
  • 你从哪里得到异常?
  • 我想我真的想通了。我误解了等待是如何实现的。此外,如果元素未在 DOM 中列出,则显式等待似乎不起作用。基本上,我有单击和展开的按钮,然后附加数据填充页面。但是我相信在实际单击按钮之前,包含这些数据的元素是不存在的。现在,如果我只能找出为什么我的 xPath 在 Python 中有效,而在 Java 中无效。
  • 您的问题得到解答了吗?如果是,请接受。

标签: python selenium


【解决方案1】:

1 尽量不要混合隐式和显式等待。它可能导致不可预测的等待期。在这里查看更多信息

2 如果您选择使用严格隐式等待,则在开头声明它。像这样:

from os import times
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
import json
from dataclasses import dataclass, asdict
import time

USER_NAME = "username"
PASSWORD = "password"
options = webdriver.ChromeOptions()

options.add_argument('--igcognito')
#options.add_argument('--headless')

driver = webdriver.Chrome('c:\\path\\to\\chromedriver.exe',options=options)
driver.implicitly_wait(30)  # Declare here!    
driver.get("URL")


driver.find_element_by_name("username").send_keys(USER_NAME)
driver.find_element_by_name("password").send_keys(PASSWORD)

3 你的明确等待:

wait = WebDriverWait(driver, 120)
wait.until(expected_conditions.visibility_of_all_elements_located((By.CLASS_NAME, "stuff")))

它看起来是正确的,但是不清楚你为什么在这里使用 try/finally。在等待的情况下,您实际上并不需要它,除非有某些确切的原因。 120 - 太长了。减少等待时间。

4 driver.find_element_by_xpath("/html/body/div/div/div/div[2]/div[2]/form/button").click() 似乎是一个非常不稳定的 XPath。我建议你了解XPathcss 选择器。如果您使用的是单个元素,它们应该是唯一的。

5 我强烈建议只使用显式等待。在这里查看如何正确使用它们https://selenium-python.readthedocs.io/waits.html#explicit-waits

一般建议:从一点开始。打开一个站点,然后逐步检查每个操作。不要试图一次自动化所有事情。对于初学者来说,这将是非常困难的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多