硒move_to_element并不总是鼠标悬停 [英] selenium move_to_element does not always mouse-hover

查看:418
本文介绍了硒move_to_element并不总是鼠标悬停的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用python 2.7。在试图将鼠标悬停在菜单项上时,硒并未在Chrome中始终将鼠标移至该项目。因此,当点击一个子菜单时,它最终会点击其他的东西。但是,相同的代码会在Firefox驱动程序中抛出异常。



我在SO上读了几篇文章,这表明硒有时会变得古怪。但我无法弄清楚我是否做错了。



以下是代码:

  from selenium import webdriver 
from time import sleep $ b $ from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
#driver = webdriver.Firefox()
driver.get(http://www.flipkart.com/watches/pr?p%5B%5D=facets.ideal_for%255B%255D%3DMen& (10)
$ b $ d
$ driver_maximize_window()

$ d $ $ b elm_Men_Menu = driver.find_element_by_xpath(// li [@ class ='menu-l0'] / a [@ data-tracking-id ='men'])
elm_FastTrack_Menu = driver.find_element_by_xpath(/ / li [@ class ='menu-item'] / a [@ data-tracking- id ='0_Fastrack'])

builder = ActionChains(driver)
builder.move_to_element elm_Menu).click(elm_FastTrack_Menu).perform()


您需要一步一步地检查要与之交互的元素的可见性 显式等待 ,请勿使用时间。 sleep() - 它不可靠且容易出错:

  from selenium import webdriver $ b $ se from selenium.webdriver.common.action_chains import ActionChains 
from selenium.webdriver.common.by import通过
from selenium.webdriver.support.ui从selenium.webdriver.support中导入WebDriverWait
import expected_conditions as EC

driver = webdriver.Chrome()

driver.get(http://www.flipkart.com/watches/pr?p%5B% 5D = facets.ideal_for%255B%255D%3DMen& p%5B%5D = sort%3Dpopularity& sid = r18& facetOrder%5BD 5D = ideal_for& otracker = ch_vn_watches_men_nav_catergorylinks_0_AllBrands)
driver.maximize_window()

#等待Men菜单出现,然后将其悬停
men_menu = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,// a [@ data-tracking-id ='men'])))
ActionChains(driver).move_to_element(men_menu).perform()

#等待Fastrack菜单项出现,然后点击
fastrack = WebDriverWait(driver,10)。直到(EC.visibility_of_element_located((By.XPATH,// a [@ data-tracking-id ='0_Fastrack'])))
fastrack.click()


I am using python 2.7. While trying to hover the mouse on a menu item, selenium does not move the mouse to the item consistently in Chrome. Hence while clicking on a sub menu, it ends up clicking something else. However the same code throws exception in Firefox driver.

I read few posts on SO which indicates that selenium can be sometimes quirky. But I can't figure out whether I am doing something wrong.

Here is the code:

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
#driver = webdriver.Firefox()
driver.get("http://www.flipkart.com/watches/pr?p%5B%5D=facets.ideal_for%255B%255D%3DMen&p%5B%5D=sort%3Dpopularity&sid=r18&facetOrder%5B%5D=ideal_for&otracker=ch_vn_watches_men_nav_catergorylinks_0_AllBrands")
driver.maximize_window()
sleep(10)

elm_Men_Menu = driver.find_element_by_xpath("//li[@class='menu-l0 ']/a[@data-tracking-id='men']")
elm_FastTrack_Menu = driver.find_element_by_xpath("//li[@class='menu-item']/a[@data-tracking- id='0_Fastrack']")

builder = ActionChains(driver)
builder.move_to_element(elm_Men_Menu).click(elm_FastTrack_Menu).perform()

解决方案

You need to do this step by step checking the visibility of the elements you are going to interact with using Explicit Waits, do not use time.sleep() - it is not reliable and error-prone:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()

driver.get("http://www.flipkart.com/watches/pr?p%5B%5D=facets.ideal_for%255B%255D%3DMen&p%5B%5D=sort%3Dpopularity&sid=r18&facetOrder%5B%5D=ideal_for&otracker=ch_vn_watches_men_nav_catergorylinks_0_AllBrands")
driver.maximize_window()

# wait for Men menu to appear, then hover it
men_menu = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//a[@data-tracking-id='men']")))
ActionChains(driver).move_to_element(men_menu).perform()

# wait for Fastrack menu item to appear, then click it
fastrack = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//a[@data-tracking-id='0_Fastrack']")))
fastrack.click()

这篇关于硒move_to_element并不总是鼠标悬停的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆