为什么在我使用 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())
.
首先,发生的事情如下:
启动浏览器并打开提供的 url;
查找元素用户名和密码
输入用户名和密码;
查找登录元素
点击登录;
查找另一个按钮
点击另一个按钮
...
问题是什么?
所以,问题开始出现在第 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()
我在使用 Selenium 自动执行任务时遇到了这个问题。
代码执行过程是怎样的?
所以首先 seleniumtest.py
中有两个函数:
getGateway()
和 restartRouter()
.
让我们关注 restartRouter()
函数,因为它包含与 selenium 相关的代码,而 getGateway()
函数只是我在 restartRouter()
中使用的函数,就像这样:driver.get(getGateway())
.
首先,发生的事情如下:
启动浏览器并打开提供的 url;
查找元素用户名和密码
输入用户名和密码;
查找登录元素
点击登录;
查找另一个按钮
点击另一个按钮
...
问题是什么?
所以,问题开始出现在第 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()