Javascript 硒:如何在<;脚本src=";xx.js“&燃气轮机;[python]
我想在google colaboratory中使用selenium执行Javascript 硒:如何在<;脚本src=";xx.js“&燃气轮机;[python],javascript,python,selenium,google-colaboratory,Javascript,Python,Selenium,Google Colaboratory,我想在google colaboratory中使用selenium执行find_element_by_class_name 显示了以下错误 NoSuchElementException:消息:没有这样的元素:无法找到元素 我发现这个页面是在执行print(driver.page\u source)后由javascript生成的 虽然我尝试了通过xpath查找元素,但结果是一样的。很抱歉上次评论的回复太晚,我想在您上次评论之后我现在知道您的问题了 #执行此操作后,它将打开一个新选项卡 驱动程序。按
find_element_by_class_name
显示了以下错误
NoSuchElementException:消息:没有这样的元素:无法找到元素
我发现这个页面是在执行print(driver.page\u source)
后由javascript生成的
虽然我尝试了通过xpath查找元素,但结果是一样的。很抱歉上次评论的回复太晚,我想在您上次评论之后我现在知道您的问题了
#执行此操作后,它将打开一个新选项卡
驱动程序。按\u id(“openGraphPage”)查找\u元素。\u。单击()
让我们调用第一个选项卡tab0
和新选项卡tab1
单击打开新选项卡后,即使您看到当前选项卡是tab1
,Selenium驱动程序仍然关注tab0
!这就是为什么当您执行打印(driver.page\u source)
时,它不会显示您在选项卡1
中看到的任何元素,因此您无法找到您的元素
要在打开新选项卡后切换选项卡,您需要执行以下操作:
#首先获取所有窗口句柄(选项卡ID)
window\u list=driver.window\u句柄
tab0=窗口列表[0]
tab1=窗口列表[1]
#切换到新选项卡
驾驶员。切换到。车窗(表1)
#在这里做你的事
graph=驱动程序。通过类名称(“graph”)查找元素
# ...
#如果您需要返回主选项卡(即使关闭tab1,您仍然需要切换回主选项卡)
驱动程序。切换到。窗口(选项卡0)
注: 我不太清楚为什么当你做
driver.get(r'https://example.com/graph“)
,它找不到您的元素。因为即使您不切换选项卡,如果您切换了driver.get
,第一个选项卡也应该正常获取图形
由于我没有访问该网站的权限,我猜测:
- 直接执行
将不会加载图形。它需要单击“打开图形”按钮,它将包含一些参数以在新选项卡中加载图形。-->如果这是原因,你没有别的办法,只能点击按钮打开图表,然后切换到新标签页,在那里完成你的工作driver.get(r'https://example.com/graph“)
- 单击在新选项卡中打开页面后,您将直接在第一个选项卡中获得页面,但是如果页面没有聚焦,则页面不会正常加载(很多javascript站点都会出现这种情况)。这就是为什么你找不到你的元素。但是,如果您使用Chrome进行正常调试,则会聚焦页面,从而加载。-->如果这是原因,你可以简单地切换到这个标签页,聚焦它。它将加载图形,您可以获取您的元素
小贴士: 尽量不要使用时间。睡眠,而要使用明确的时间。当它找到您的元素时,它将停止等待,这样您就不会浪费时间。当达到超时时,它仍将引发NoTouchElement
从selenium导入webdriver
从selenium.webdriver.common.by导入
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为EC
元素=WebDriverWait(驱动程序,10)。直到(
EC.所处元素的可见性((By.CLASS\u名称,“图形”))
)
进一步文档:您是否添加了睡眠或显式等待并尝试了?@PDHide谢谢您的评论。是的,我添加了
time.sleep(3)
请添加html,看看元素是否在里面iframe@PDHide我添加了html。恐怕这个页面没有使用iframe。。。。我错过了什么?在html页面上找不到类“Graph”…感谢您的深入解释,@jackblk。虽然我不能做我想做的事,但我可以向前迈出一步。因为我被重定向到不支持浏览器的url。。。即使我使用chromedriver
作为Selenium,Selenium也可能无法作为Chrome工作。。。但我认为你的答案是有效的。谢谢!!你试过Firefox吗?将代码切换到firefox很容易。很高兴它帮助了你:)。
<body>
<script src="../public/vendor.bundle.js"></script>
<script src="../public/bundle.js"></script>
</body>
<!doctype html>
<html>
<head>
<title>xxx</title>
<link rel="shortcut icon" href="../public/favicon.ico" />
<link rel="stylesheet" type="text/css" href="../public/bundle.css">
<script type="text/javascript">
var contextPath = "/xxx";
if(location.pathname.match(/(.*)(\/\S*\/\S*)/)){
contextPath = RegExp.$1;
}
window.raise = window.raise || {};
window.raise.appInfo = {
"xxx" : 'xxx',
"xxx" : xxx,
.
.
.
};
</script>
</head>
<body>
<div id="app-progress" class="AppInitializing"></div>
<div id="root">
<noscript>
<p class="xxx">xxx</p>
</noscript>
</div>
<script src="../public/vendor.bundle.js"></script>
<script src="../public/bundle.js"></script>
</body>
</html>
.
.
<div class="main-body-wrapper">
<div class="main-body-area">
<div class="page-grid single GraphPage">
<h3 class="page-title">...</h3>
<div class="graph-container">
<div class="Graph">
<div class="loading">...</div>
<div>...</div>
.
.
.
.
driver.find_element_by_id("openGraphPage").click()
time.sleep(3)
driver.get(r'https://example.com/graph')
time.sleep(10)
print(driver.current_url)
print(driver.page_source)
graph = driver.find_element_by_class_name("Graph")
.
.