我有这个代码:
driver.switch_to.window(window_after)
try:
myElem = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.NAME, '_eventId_confirmed')))
print ("Page 2 is ready!")
except TimeoutException:
print ("Loading took too much time!")
btn = driver.find_element_by_name('_eventId_confirmed')
btn.click()
你可以看到我先切换窗口,然后检查一个元素,获取该元素(一个按钮),最后尝试点击所述按钮。这可能是3次中的2次,但是经常会因此错误消息而失败
selenium.common.exceptions.ElementNotInteractableException: Message: Element <button class="btn" name="_eventId_confirmed"> could not be scrolled into view
当它在执行时直观地查看流程一切似乎都很好(我的第一个猜测是窗口开关没有按预期工作)并且浏览器最终处于预期状态,我可以手动单击此按钮。有趣的是,当发生此错误时,没有超时或类似情况,它会在执行期间立即发生。
有什么想法在这里发生了什么?
当您尝试单击的元素出现在页面上但它不完全可见并且selenium尝试单击的点不可见时,通常会出现此问题。 在这种情况下,您可以使用javascript单击该元素,该元素实际上直接在页面的html结构上运行。 您可以像以下一样使用它:
element = driver.find_element_by_name("_eventId_confirmed")
driver.execute_script("arguments[0].click();", element)
以下是2个选项。
使用硒location_once_scrolled_into_view
方法:
btn.location_once_scrolled_into_view
使用Javascript:
driver.execute_script("arguments[0].scrollIntoView();",btn)
示例代码:
url = "https://stackoverflow.com/questions/55228646/python-selenium-cant-sometimes-scroll-element-into-view/55228932? noredirect=1#comment97192621_55228932"
driver.get(url)
element = driver.find_element_by_xpath("//a[.='Contact Us']")
element.location_once_scrolled_into_view
time.sleep(1)
driver.find_element_by_xpath("//p[.='active']").location_once_scrolled_into_view
driver.execute_script("arguments[0].scrollIntoView();",element)
因为你的最后一步是在所需的元素上调用click()
,所以不需要使用expected_conditions作为presence_of_element_located()
,你需要使用element_to_be_clickable()
如下:
try:
myElem = WebDriverWait(driver, delay).until(EC.element_to_be_clickable((By.NAME, '_eventId_confirmed')))