python - 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>
这是我尝试过的
- 第一枪
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()
第一个错误代码是
:消息:没有这样的元素:无法找到元素:{“方法”:“部分链接文本”,“选择器”:“调查”}
- 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:消息:
- 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:消息:
与上面相同的消息
- 第四枪:也许我应该使用 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)
结果是一样的
我想我完全错了,但我不明白那是什么。任何答案都会有很大帮助。谢谢
解决方案
由于元素位于不同的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% 确定,因为我自己还没有看过该网站。
推荐阅读
- sql - SQL Server Pivot - 无法按列添加
- ios - hyperledger 用户如何通过 iOS 应用加入业务网络?
- ruby-on-rails - 如何在rails的同一个表中创建多对多
- mysql - 查询时间过长且未使用索引
- powershell - 使用 -Filepath 参数通过 Powershell ScheduledJob 调用 $PSScriptRoot 时为空
- sql - 如何将尾随空格添加到长度不同的十进制值?
- mysql - SQL Order By via Junction 表
- python - Python:读取存储在远程服务器上的 .sas7bdat 文件
- node.js - SyntaxError:在严格模式下使用 const。在 PhusionPassenger 服务器上
- angular - Ionic 3 我无法使用提供程序从诊断插件返回值