python - 谷歌联系人悬停无法与 python selenium webdriver 一起使用

标签 python selenium google-chrome webdriver selenium-chromedriver

我第一次与python selenium悬停效果交互并遇到问题。

我想选择悬停时可见的第一个联系人复选框。以下代码成功通过悬停部分行并且未显示任何错误,但是:

  • 悬停效果不可见
  • 发布悬停效果,点击不起作用并退出代码块

我在 try: block 中收到悬停交叉的打印消息,之后我收到 except: block 中的出现问题。非常感谢任何有关此处错误的建议。

注意: - 以下是我遇到错误的代码部分。

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

driver = webdriver.Chrome(webdriverpath)
driver.maximize_window()
driver.get('https://contacts.google.com')

wait20 = WebDriverWait(driver, 20)

def hover(browser, xpath):
    element = browser.find_element_by_xpath(xpath)
    hover = ActionChains(browser).move_to_element(element)
    hover.perform()
    time.sleep(1) 

try:
    print('Entered in try block')
    time.sleep(1)
    clink = wait20.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.ncJ6qe a')))
    clink.click()
    print('contact link clicked')

    time.sleep(3)
    cimg = driver.find_elements_by_xpath('//div[@class="XXcuqd" and contains(@style,"transform: translateY(0px)")]/div/div/div')
    print('cimg crossed')

    hover(driver, '//div[@class="XXcuqd" and contains(@style,"transform: translateY(0px)")]')
    print('hover crossed')

    cimg.click()
    print('contact image clicked successfully')

except:
    print('Semething went wrong.')

最佳答案

首先尝试不使用广泛的 try/except。
为了能够对代码进行更多故障排除,您至少应该记录原始错误。

try:
    ..some code..
except Exception as e:
    print('Semething went wrong.')
    print("Caught Exception type {} with err.msg: {}".format(type(e), e))

通过查看您正在使用的代码:

find_element**s**_by_xpath

哪个 selenium 会返回一个元素列表。

更改代码以使用单个元素:

find_element_by_xpath

或者在尝试点击时传递您需要的索引

例如在您的代码中:

cimg = driver.find_elements_by_xpath('//div[@class="XXcuqd" and contains(@style,"transform: translateY(0px)")]/div/div/div')
print('cimg crossed')

hover(driver, '//div[@class="XXcuqd" and contains(@style,"transform: translateY(0px)")]')
print('hover crossed')

cimg[0].click()
print('contact image clicked successfully')

编辑:
我查看了您的 xpath,它们令人困惑并返回多个元素。从您的 print() 语句中,我假设您想要单击联系人图像以启用该复选框?

如果是这样,您实际上不需要在单击元素之前将鼠标悬停在该元素上。您只需使用 JS 脚本来单击它即可。

我已经用 css_selector 修改了你的 xpath 并亲自尝试过。

cimg = driver.find_elements_by_css_selector('.XXcuqd [role="checkbox"]')

由于此代码将返回一个列表,因此请不要忘记传递您要单击的联系人的索引。

在下面的情况下,我将使用 JS 脚本单击第一个:

driver.execute_script("arguments[0].click();", cimg[0])

那么你的代码可以如下所示:

print('Entered in try block')
time.sleep(1)
clink = wait20.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.ncJ6qe a')))
clink.click()
print('contact link clicked')
time.sleep(3)
cimg = driver.find_elements_by_css_selector('.XXcuqd [role="checkbox"]')

print('cimg crossed')
driver.execute_script("arguments[0].click();", cimg[0])
print('contact image clicked successfully')

可选
您可以通过验证属性来验证复选框是否确实被选中:

if cimg[0].get_attribute('aria-checked') == 'true':
    print('contact image clicked successfully')
else:
    raise AttributeError("Fail to select the contact image")

关于python - 谷歌联系人悬停无法与 python selenium webdriver 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54157116/

相关文章:

java - Selenium - 查找包含类的子项

java - 从网络浏览器录制用户语音

python - 实现与 TCP 服务器交互的基于 Web 的客户端

python - 在循环定义的字典上使用 `==` 运算符

python - 使用python与网页交互

css - Chrome 蓝色输入轮廓无论如何都不会消失

google-chrome - Chrome CSS 背景颜色问题

python - 如何从两个具有相同时间戳的 Pandas 中创建一个数据帧

html - 如何为不同 HTML 标记显示的相同文本编写通用 XPath?

ruby-on-rails - 是否可以在不修补 ActiveRecord 的情况下使用 Selenium/Capybara Webkit/Poltergeist?