Selenium - 即使在验证后也无法找到元素
Selenium - Unable to Locate Element even after verifying
这几个月来一直运行良好,但现在会抛出错误。这是一个非常简单的代码:打开 Chrome 并拉出一个元素。它现在告诉我它无法找到该元素。
我已经检查了带有 Chrome window 的元素,打开并验证了 XPATH,它与代码中的内容完全匹配。我截取了 运行 所在页面的屏幕截图,看起来一切正常。
我错过了什么?
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import webbrowser
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time
site_lat = 34.29421
site_lon = -97.44667
def watershed_lookup(site_lat, site_lon):
op=webdriver.ChromeOptions()
#op.add_argument('--headless')
op.add_argument('window-size=1920x1080')
url_water = 'https://mywaterway.epa.gov/community/'+str(site_lon)+','+str(site_lat)+'/overview'
driver = webdriver.Chrome(ChromeDriverManager().install(), options = op)
driver.get(url_water)
time.sleep(3)
element = driver.find_element_by_xpath("//*[@id=\"root\"]/div/div[4]/div[2]/div[2]/div[1]/div[1]/div/p[2]")
start1 = 'WATERSHED: '
end1 = '('
end2 = ')'
s = element.text
watershed_name = s[s.find(start1)+len(start1):s.rfind(end1)]
watershed_id = s[s.find(end1)+len(end1):s.rfind(end2)]
print("Watershed Name: " + watershed_name)
print("Watershed ID: " + watershed_id)
driver.close()
watershed_lookup(site_lat, site_lon)
可能是因为您没有等待。
要么应用隐式等待:
driver = webdriver.Chrome(ChromeDriverManager().install(), options = op)
driver.implicitly_wait(20)
driver.get(url_water)
...
或应用显式等待:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
...
driver.get(url_water)
wait = WebDriverWait(driver,20)
ele = wait.until(EC.visibility_of_element_located((By.XPATH,"//*[@id=\"root\"]/div/div[4]/div[2]/div[2]/div[1]/div[1]/div/p[2]")))
print(ele.text)
您使用的 Xpath 是绝对 Xpath,请尝试使用相对 Xpath 查找该元素。我已经看到绝对 xpaths 使用开发工具工作并在 运行 时间内失败。
使用显式等待,直到该元素为 visible/interactable 然后验证。
这几个月来一直运行良好,但现在会抛出错误。这是一个非常简单的代码:打开 Chrome 并拉出一个元素。它现在告诉我它无法找到该元素。
我已经检查了带有 Chrome window 的元素,打开并验证了 XPATH,它与代码中的内容完全匹配。我截取了 运行 所在页面的屏幕截图,看起来一切正常。
我错过了什么?
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import webbrowser
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time
site_lat = 34.29421
site_lon = -97.44667
def watershed_lookup(site_lat, site_lon):
op=webdriver.ChromeOptions()
#op.add_argument('--headless')
op.add_argument('window-size=1920x1080')
url_water = 'https://mywaterway.epa.gov/community/'+str(site_lon)+','+str(site_lat)+'/overview'
driver = webdriver.Chrome(ChromeDriverManager().install(), options = op)
driver.get(url_water)
time.sleep(3)
element = driver.find_element_by_xpath("//*[@id=\"root\"]/div/div[4]/div[2]/div[2]/div[1]/div[1]/div/p[2]")
start1 = 'WATERSHED: '
end1 = '('
end2 = ')'
s = element.text
watershed_name = s[s.find(start1)+len(start1):s.rfind(end1)]
watershed_id = s[s.find(end1)+len(end1):s.rfind(end2)]
print("Watershed Name: " + watershed_name)
print("Watershed ID: " + watershed_id)
driver.close()
watershed_lookup(site_lat, site_lon)
可能是因为您没有等待。
要么应用隐式等待:
driver = webdriver.Chrome(ChromeDriverManager().install(), options = op)
driver.implicitly_wait(20)
driver.get(url_water)
...
或应用显式等待:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
...
driver.get(url_water)
wait = WebDriverWait(driver,20)
ele = wait.until(EC.visibility_of_element_located((By.XPATH,"//*[@id=\"root\"]/div/div[4]/div[2]/div[2]/div[1]/div[1]/div/p[2]")))
print(ele.text)
您使用的 Xpath 是绝对 Xpath,请尝试使用相对 Xpath 查找该元素。我已经看到绝对 xpaths 使用开发工具工作并在 运行 时间内失败。 使用显式等待,直到该元素为 visible/interactable 然后验证。