最近,我一直在用Selenium在Python中尝试一些东西。我想浏览FIFA Web App,它是一个交互式应用程序。为了浏览菜单,我创建了一些功能。我首先尝试了此方法,但是ElementClickInterceptedException不断出现。
def Move_Watchlist(driver)
time.sleep(random.randint(6,7))
#Navigate to transfer menu
driver.find_element_by_xpath('/html/body/main/section/nav/button[3]').click()
time.sleep(random.randint(6,7))
#Navigate to certain page in transfer menu
driver.find_element_by_xpath('/html/body/main/section/section/div[2]/div/div/div[4]').click()
因此,在查看堆栈溢出后,我将代码更改为此,但是没有成功;
def Move_Watchlist(driver):
time.sleep(random.randint(6,7))
#Navigate to transfer menu
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '/html/body/main/section/nav/button[3]'))).click()
time.sleep(random.randint(6,7))
#Navigate to certain page in transfer menu
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH,'/html/body/main/section/section/div[2]/div/div/div[4]'))).click()
之所以发生错误,是因为在页面之间切换时会出现一个加载屏幕,但是WebDriverWait语句不等待加载屏幕消失,而只是单击,从而导致错误。至少我认为这正在发生。这是完整的错误:
<ipython-input-13-85a4f66a2b0a> in Move_Watchlist(driver)
18
19 time.sleep(random.randint(6,7))
---> 20 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH,'/html/body/main/section/section/div[2]/div/div/div[4]' ))).click()
21 #driver.find_element_by_xpath('/html/body/main/section/section/div[2]/div/div/div[4]').click()
22
...
ElementClickInterceptedException: Message: element click intercepted: Element <div class="tile has-separator col-1-2 ut-tile-transfer-targets">...</div> is not clickable at point (588, 574). Other element would receive the click: <div class="ut-click-shield showing">...</div>
<div class="ut-click-shield showing">...</div>
是加载屏幕元素。
关于如何解决此问题的任何想法?
添加WebDriverWait
是一个好的开始,但它并不总是能解决问题。您可以尝试使用Javascript单击以解决ClickIntercepted
错误:
element_to_click = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH,'/html/body/main/section/section/div[2]/div/div/div[4]')))
# execute JS to click
driver.execute_script("arguments[0].click();", element_to_click)
过去,我已经成功地多次使用了此替代方法。