为什么在我使用 time.sleep() 之前,Selenium 在页面上找不到任何元素?

Why Selenium couldn't find any element on page before I used time.sleep()?

我在使用 Selenium 自动执行任务时遇到了这个问题。

代码执行过程是怎样的?

所以首先 seleniumtest.py 中有两个函数: getGateway()restartRouter().

让我们关注 restartRouter() 函数,因为它包含与 selenium 相关的代码,而 getGateway() 函数只是我在 restartRouter() 中使用的函数,就像这样:driver.get(getGateway()) .

首先,发生的事情如下:

  1. 启动浏览器并打开提供的 url;

  2. 查找元素用户名和密码

  3. 输入用户名和密码;

  4. 查找登录元素

  5. 点击登录;

  6. 查找另一个按钮

  7. 点击另一个按钮

    ...

问题是什么?

所以,问题开始出现在第 6 步,就在单击“登录”按钮之后(参见代码执行过程,第 6 步)。

点击登录按钮后,它会加载新页面(它不会在新标签页中打开),之后它就不想工作了。

你尝试过什么来解决这个问题

我首先想到的是在点击登录后立即使用 driver.wait(5),但没有用。 我还尝试检查该页面上的任何其他元素是否会导致操作 .click()

在那之后,我尝试了 Waits - SELENIUM WAITS ;这也没有用。我尝试了两个可能的选项:driver.implicitly_wait(10)WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,"//*[@id=\"mmManagDiag\"]"))。当使用显式等待时,我的 USB 设备无法正常工作也给了我错误。

None 其中有效。

什么对我有用?

在变通后,我想到了尝试使用 time.sleep(3) 并且突然间成功了。

我的最后一个问题 所以,我想知道为什么在我使用 time.sleep()?

之前,Selenium 在该页面上找不到任何元素

selenium waits 和 time.sleep() 几乎是一回事吗?

代码

 driver = webdriver.Chrome('./chromedriver')
driver.get(getGateway())
#Frm_Username
username = driver.find_element(By.NAME,'Frm_Username')
username.clear()
username.send_keys("user")
#Frm_Password
passwrd = driver.find_element(By.NAME,"Frm_Password")
passwrd.clear()
passwrd.send_keys("user")
#passwrd.send_keys(Keys.RETURN)
driver.find_element(By.XPATH,"//*[@id=\"LoginId\"]").click()
time.sleep(3)
driver.find_element(By.XPATH,"//*[@id=\"mmManagDiag\"]").click()
time.sleep(3)
driver.find_element(By.XPATH,"//*[@id=\"mmManagDevice\"]").click()
time.sleep(3)
driver.find_element(By.XPATH,"//*[@id=\"Btn_restart\"]").click()
time.sleep(3)
driver.find_element(By.XPATH,"//*[@id=\"confirmOK\"]").click()
driver.quit()

等待元素出现可能不足以点击它。

尝试等待元素可点击。

WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "your xpath value"))
    ).click()