对于想了解使用Python和JavaScript通过Selenium使WebElement可见的读者,本文将是一篇不可错过的文章,我们将详细介绍pythonseleniumjavascript,并且为
对于想了解使用Python和JavaScript通过Selenium使WebElement可见的读者,本文将是一篇不可错过的文章,我们将详细介绍python selenium javascript,并且为您提供关于javascript – 我可以使用Python和Selenium的正则表达式找到一个元素吗?、Javascript 函数未定义:Python Selenium、org.openqa.selenium.ElementNotVisibleException:通过SeleniumWebDriver和Java单击复选框时,元素当前不可见、Python selenium 获取由 javascript的有价值信息。
本文目录一览:- 使用Python和JavaScript通过Selenium使WebElement可见(python selenium javascript)
- javascript – 我可以使用Python和Selenium的正则表达式找到一个元素吗?
- Javascript 函数未定义:Python Selenium
- org.openqa.selenium.ElementNotVisibleException:通过SeleniumWebDriver和Java单击复选框时,元素当前不可见
- Python selenium 获取由 javascript
使用Python和JavaScript通过Selenium使WebElement可见(python selenium javascript)
我正在尝试通过selenium上传png。我的问题是,我需要使用的输入对selenium不可见,但对用户不可见。在Selenium的FAQ中,他们告诉我像这样使用JavascriptExcecutor:
((JavascriptExecutor)driver).executeScript("arguments[0].style.visibility = ''visible''; arguments[0].style.height = ''1px''; arguments[0].style.width = ''1px''; arguments[0].style.opacity = 1", fileUploadElement);
过去我在C#中使用了它,并且可以正常工作,但是现在却很难将这种用法转换为python。我会使用该document.getElementByName()
函数,但是输入没有名称,并且页面上有多个。解决该问题的最佳方法是什么。我已经试过了
icon = element.find_element_by_css_selector("input")script_befehl = icon+".style.visibility = ''visible''; "+icon+".style.height = ''1px''; "+icon+".style.width = ''1px''; "+icon+".style.opacity = 1
但这也没用,我收到语法错误
答案1
小编典典execute_script()
驱动程序实例上有一个方法,参数以类似于C#的方式传递给它JavascriptExecutor
:
icon = element.find_element_by_css_selector("input")driver.execute_script("arguments[0].style.visibility = ''visible''; arguments[0].style.height = ''1px''; arguments[0].style.width = ''1px''; arguments[0].style.opacity = 1", icon)
javascript – 我可以使用Python和Selenium的正则表达式找到一个元素吗?
我需要单击下拉列表并单击其中的隐藏元素. html将由javascript生成,我不会知道id或类名,但我知道它会有一个短语.我可以通过正则表达式查找和元素然后用硒点击它吗?
> contains()
和starts-with()
XPath函数:
//div[contains(.,"Desired text")]
//div[starts-with(.,"Desired text")]
> preceding
,preceding-sibling
,following
和following-sibling
轴如果您知道新生成的元素块的相对位置,则可能会对您有所帮助
还有CSS选择器用于元素属性的部分匹配:
a[href*=desiredSubstring] # contains
a[href^=desiredSubstring] # starts-with
a[href$=desiredSubstring] # ends-with
而且你总能找到比需要更多的元素,稍后用Python过滤掉它们,例如:
import re
pattern = re.compile(r"^Some \w+ text.$")
elements = driver.find_elements_by_css_selector("div.some_class")
for element in elements:
match = pattern.match(element.text)
if match:
print(element.text)
Javascript 函数未定义:Python Selenium
如何解决Javascript 函数未定义:Python Selenium?
我正在通过以下代码导入打字稿 API。然后我通过带有硒的 Python 将其注入到 DOM 中。我已经通过 browserify 将其编译为 JS。
TS 代码如下:
import { App } from "api";
(window as any).api = new App();
然后通过以下python代码注入:
self.driver.get("website")
print("You have reached the page")
self.driver.execute_script("var s=window.document.createElement(''script'');\
s.src=''https://localhost:8000/injector.js'';\
window.document.head.appendChild(s);")
print("Script injected")
self.driver.execute_script("window.api.Function1();")
函数 1 成功执行,然后加载站点上的另一个页面。
当我尝试从该页面上的 API 运行另一个函数时,我收到“javascript 错误:函数 2 未定义”。其调用方式与前一个函数相同。
self.driver.execute_script("window.api.Function2();")
我已经尝试重新注入脚本,并检查加载此页面时它是否仍在 DOM 中,但是我无法让它调用此函数。 API 中的应用功能如下:
import { Items } from "./items/Items";
import { Login } from "./login/Login";
import { Market } from "./market/Market";
import { User } from "./user/User";
export class App {
private _market: Market;
private _items: Items;
private _login: Login;
private _user: User;
constructor() {
this._market = new Market();
this._items = new Items();
this._login = new Login();
this._user = new User();
}
/**
* Restores the console object
*/
restoreConsole(): void {
var i = document.createElement("iframe") as any;
i.style.display = "none";
document.body.appendChild(i);
window.console = i.contentwindow.console;
}
/**
* disables web app ability to track user''s actions.
*/
disableMonitoring(): void {
window.EASFCApp.prototype.onPause = (): any => {};
window.EASFCApp.prototype.onResume = (): any => {};
window.services.PIN.isEnabled = () => false;
window.services.PIN.isEnabledByUser = () => false;
window.services.PIN.isEnabledByConfig = () => false;
window.services.PIN.enabled = false;
window.TelemetryManager.trackEvent = () => {};
window.TelemetryManager.trackPage = () => {};
}
/**
* Sleep during specified time.
* @param ms time to sleep in milliseconds
*/
async sleep(ms: number) {
await new Promise((resolve) => {
setTimeout(() => resolve(undefined),ms);
});
}
/**
* Gets the Market module
* @returns market instance
*/
get market(): Market {
return this._market;
}
/**
* Gets the Items module
* @returns items instance
*/
get items(): Items {
return this._items;
}
/**
* Gets the Login module
* @returns login instance
*/
get login(): Login {
return this._login;
}
/**
* Gets the user module
* @returns user instance
*/
get user(): User {
return this._user;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
org.openqa.selenium.ElementNotVisibleException:通过SeleniumWebDriver和Java单击复选框时,元素当前不可见
我必须选中以下HTML代码段中包含的复选框。该复选框包含在输入标签中
<div formarrayname="entityTypes" fxlayout="" fxlayoutgap="10px">
<divfxlayout="row" fxlayoutgap="10px">
<app-checkbox formcontrolname="isSelected" _nghost-c26=""><div _ngcontent-c26="">
<span _ngcontent-c26=""fxlayout="row" fxlayoutalign="start center">
<!---->
<input _ngcontent-c26="" type="checkbox" name="undefined"xpath="1">
Funder
<label _ngcontent-c26=""></label>
</span>
<!---->
<!---->
</div>
</app-checkbox>
</div>
</div>
我已经尝试过各种方法来识别并选择它,但是它从来都不可见。我已将复选框标签的文本打印到控制台,因此无法理解为什么复选框本身不可见。以下Java代码成功打印了标签,但未能单击复选框,并抛出错误元素不可见。
//print text of input box
WebElement labelFunder = driver.findElement(By.xpath("//div[@fxflex='50']//div[3]//div[1]//app-checkbox[1]//div[1]//span[1]//input[1]"));
String textFunderLabel2 = labelFunder.getAttribute("innerText").toString();
System.out.println(textFunderLabel);
labelFunder.click();
我尝试了不同的等待,但均未成功。
//select the funder checkbox
//driver.findElement(By.xpath("//div[@fxflex='50']//div[3]//div[1]//app-checkbox[1]//div[1]//span[1]//input[@type='checkbox']")).click();
//WebDriverWait wait = new WebDriverWait(driver,30);
//WebElement checkbox = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html[1]/body[1]/app-root[1]/main[1]/section[1]/div[2]/app-company-detail[1]/div[2]/form[1]/md-tab-group[1]/div[1]/md-tab-body[1]/div[1]/div[1]/div[2]/div[1]/div[2]/div[3]/div[1]/app-checkbox[1]/div[1]/span[1]/input[1]")));
//checkbox.click();
任何人都可以在这里向我指出正确的方向
谢谢。
Python selenium 获取由 javascript
如何解决Python selenium 获取由 javascript?
我使用了一个名为“网易云音乐”的在线音乐播放器,我的帐户中有多个播放列表,它们包含数千首曲目,并且组织和分类非常糟糕,并且保存了重复条目,因此我想将它们导出为sql 表来组织它们。
我找到了一种不用客户端软件查看播放列表的方法,就是点击播放列表页面顶部的分享按钮,然后点击“复制链接”。
但在客户端以外的任何浏览器中打开链接,播放列表将限制为 1000 首曲目。
但我找到了克服它的方法,我安装了 Tampermonkey,然后安装了 this script。
现在我可以在浏览器中查看完整的播放列表。
这是一个 sample playlist。
播放列表如下所示:
第一列是歌曲名,第二列是时长,第三列是艺术家,最后一列是专辑。
第一列、第三列和第四列的文字分别是歌曲、艺术家和专辑页面的超链接。
我对 html 一无所知,但我设法获得了它的数据结构。
我们需要的是位于 xpath //table/tbody
的表,每一行都是名为 tr(xpath //table/tbody/tr
) 的表的子节点。
这是一个示例行:
<td>
<div><span data-res-id="5221710" data-res-type="18" data-res-action="play" data-res-from="13" data-res-data="158624364"> </span><span>1</span></div>
</td>
<td>
<div>
<div>
<div>
<span>
<a href="#/song?id=5221710"><b title="Axel F">Axel F</b></a>
</span>
</div>
</div>
</div>
</td>
<td>
<span>03:00</span>
<div>
<ahref="javascript:;" title="添加到播放列表" hidefocus="true" data-res-type="18" data-res-id="5221710" data-res-action="addto" data-res-from="13" data-res-data="158624364"></a>
<span data-res-id="5221710" data-res-type="18" data-res-action="fav"title="收藏"></span>
<span data-res-id="5221710" data-res-type="18" data-res-action="share" data-res-name="Greatest Hits Of The Millennium 80''s Vol.2" data-res-author="Harold Faltermeyer" data-res-pic="https://p2.music.126.net/tOa6Tizqy755OZE7ITsw_g==/775155697626111.jpg"title="分享">分享</span>
<span data-res-id="5221710" data-res-type="18" data-res-action="download"title="下载"></span>
<span data-res-id="5221710" data-res-type="18" data-res-from="13" data-res-data="158624364" data-res-action="delete"title="删除">删除</span>
</div>
</td>
<td>
<divtitle="Harold Faltermeyer">
<span title="Harold Faltermeyer">
<a href="#/artist?id=34854" hidefocus="true">Harold Faltermeyer</a>
</span>
</div>
</td>
<td>
<div>
<a href="#/album?id=509819" title="Greatest Hits Of The Millennium 80''s Vol.2">Greatest Hits Of The Millennium 80''s Vol.2</a>
</div>
</td>
列是元素的子节点。
我设法获得了与列对应的 xpath:
/td[2]/div/div/div/span/a/b --> title
/td[2]/div/div/div/span/a --> song link
/td[3]/span --> duration
/td[4]/div/span/a --> artist
/td[4]/div/span/a[''href''] --> artist link
/td[5]/div/a --> album
/td[5]/div/a[''href''] --> album link
我们应该在链接前添加地址 music.163.com/
以获得完整地址。
我正在考虑使用 selenium 来获取元素,更具体地说,通过 xpath 查找行,然后遍历行并通过行内的 xpath 获取列,然后将值添加到命名元组列表中。
>从这里开始,将元素添加到 sql 表中是微不足道的。
但我就是无法让它工作。
我设法打开了一个 Firefox selenium 窗口,安装了 tampermonkey 和访问完整播放列表的脚本(这两个安装是手动完成的),然后进入播放列表页面并尝试获取元素:
from selenium import webdriver
Firefox = webdriver.Firefox()
Firefox.get(''https://music.163.com/#/playlist?id=158624364&userid=126762751'')
Firefox.find_elements_by_xpath(''//table/tbody/tr'')
结果是一个空列表。
我不知道出了什么问题,我可以在开发人员工具中查看表格元素就好了,然后我查看了它的源代码并意识到表格不在其源代码中。
我什至设法使用开发者工具获得了完整表格,并上传了 here。
但是硒是看不见的。显然浏览器有办法显示不在原始 html 源代码中的内容,而 selenium 不能。那时我才意识到浏览器可以执行javascript,原始源代码中没有的附加内容可能是某个地方的javascript添加的,而我使用的代码不涉及javascript 并且只能获取原始源代码,没有附加内容。
我试过谷歌搜索 python selenium get contents of a webpage added by javascript,但没有帮助。
所以我有两个问题,第一,在短期内,如何使用一些html解析库来解析本地存储在txt文件中的一段HTML代码?
第二,从长远来看,我如何使用 selenium 或任何其他 Python html 库来获取包含由 javascript 添加的附加内容的网页的完整源代码,而不仅仅是没有附加内容的原始源代码,以便不需要每次都手动导出元素?
解决方法
最简单的答案是,您必须在使用 Firefox.get(''https://music.163.com/#/playlist?id=158624364&userid=126762751'')
打开页面后添加一些延迟,然后才能使用 Firefox.find_elements_by_xpath(''//table/tbody/tr'')
获取元素以让页面上的元素加载。这需要几分钟。
所以,你可以简单地在那里添加一种 time.sleep(5)
。
更好的方法是使用预期条件。
像这样:
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
Firefox = webdriver.Firefox()
# Wait for initialize,in seconds
wait = WebDriverWait(Firefox,20)
Firefox.get(''https://music.163.com/#/playlist?id=158624364&userid=126762751'')
wait.until(EC.visibility_of_element_located((By.XPATH,''//table/tbody/tr'')))
Firefox.find_elements_by_xpath(''//table/tbody/tr'')
UPD
那里有一个 iframe,因此您需要按如下方式切换到该 iframe:
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
Firefox = webdriver.Firefox()
# Wait for initialize,20)
Firefox.get(''https://music.163.com/#/playlist?id=158624364&userid=126762751'')
iframe = driver.find_element_by_xpath(''//iframe[@id="g_iframe"]'')
driver.switch_to.frame(iframe)
wait.until(EC.visibility_of_element_located((By.XPATH,''//table/tbody/tr'')))
Firefox.find_elements_by_xpath(''//table/tbody/tr'')
今天的关于使用Python和JavaScript通过Selenium使WebElement可见和python selenium javascript的分享已经结束,谢谢您的关注,如果想了解更多关于javascript – 我可以使用Python和Selenium的正则表达式找到一个元素吗?、Javascript 函数未定义:Python Selenium、org.openqa.selenium.ElementNotVisibleException:通过SeleniumWebDriver和Java单击复选框时,元素当前不可见、Python selenium 获取由 javascript的相关知识,请在本站进行查询。
本文标签: