首页 > 解决方案 > Python + Selenium)我怎样才能点击这个东西?

问题描述

问题。 我对 Python 很陌生,找不到单击此链接的方法。我的目标是一个一个地点击链接,但我在点击第一个链接时被卡住了。我搜索了几次,尝试了更多,但我什至找不到问题所在!链接指向一个新窗口(Survey),以下是 html 结构。

<div id="bb_deployment6" class="stream_item active_stream_item" role="listitem" x-aria-selected="true" tabindex="0" style="padding-left: 20px;"><span class="stream_datestamp">1 hour</span><div class="stream_context">Survey <a href="#" onclick="popup.launch('https://websitename', 'instrumentResponseWindow')">[Today] Survey A</a>: Click to submit survey </div><div class="stream_details"></div><div class="stream_context_bottom"></div></div>

<div id="bb_deployment5" class="stream_item" role="listitem" x-aria-selected="false" tabindex="-1" style="padding-left: 20px;"><span class="stream_datestamp">2 hour</span><div class="stream_context">Survey <a href="#" onclick="popup.launch('https://Websitename2', 'instrumentResponseWindow')">[Today] Survey B</a>: Click to submit survey </div><div class="stream_details"></div><div class="stream_context_bottom"></div></div>

这是我尝试过的

  1. 第一枪

from selenium import webdriver
browser =webdriver.Chrome("C:\Pii\selenium\chromedriver.exe")

#Open the Site
browser.get("https://that site")

#Find & Click!!
browser.find_element_by_partial_link_text("Survey").click()

第一个错误代码是

:消息:没有这样的元素:无法找到元素:{“方法”:“部分链接文本”,“选择器”:“调查”}

  1. Second Shot: OK 也许加载时间太短了?

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

browser =webdriver.Chrome("C:\Pii\selenium\chromedriver.exe")
browser.get("https://that site")

#Wait & Click
wait = WebDriverWait(browser, 10)
element = wait.until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Survey")))
browser.find_element_by_partial_link_text("Survey").click()

现在它说

:selenium.common.exceptions.TimeoutException:消息:

  1. Third Shot:可能是因为onclick导致点击部分的问题?

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

browser=webdriver.Chrome("C:\Pii\selenium\chromedriver.exe")

browser.get("https://that site")


wait = WebDriverWait(browser, 10)
element = wait.until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Survey")))


sample = browser.find_element_by_link_text("Survey")
browser.execute_script("arguments[0].click();",sample)

它说

:selenium.common.exceptions.TimeoutException:消息:

与上面相同的消息

  1. 第四枪:也许我应该使用 XPATH 而不是文本?

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

browser=webdriver.Chrome("C:\Pii\selenium\chromedriver.exe")


browser.get("https://that site")

wait = WebDriverWait(browser, 10)
element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="bb_deployment5"]/div[1]/a')))
sample = browser.find_element_by_xpath('//*[@id="bb_deployment5"]/div[1]/a')
browser.execute_script("arguments[0].click();",sample)

结果是一样的

我想我完全错了,但我不明白那是什么。任何答案都会有很大帮助。谢谢

标签: pythonseleniumautomationautomated-tests

解决方案


由于元素位于不同的iframe,您应该将焦点切换到iframe该元素,然后搜索该元素。这就是你的做法:

iframe = browser.find_element_by_class_name('cloud-iframe')
browser.switch_to.frame(iframe)

element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="bb_deployment5"]/div[1]/a')))
element.click()

这应该可行,但我不能 100% 确定,因为我自己还没有看过该网站。


推荐阅读