GVKun编程网logo

使用Python和JavaScript通过Selenium使WebElement可见(python selenium javascript)

9

对于想了解使用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)

使用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的正则表达式找到一个元素吗?

javascript – 我可以使用Python和Selenium的正则表达式找到一个元素吗?

我需要单击下拉列表并单击其中的隐藏元素. html将由javascript生成,我不会知道id或类名,但我知道它会有一个短语.我可以通过正则表达式查找和元素然后用硒点击它吗?

最佳答案
您不能简单地使用内置的selenium webdriver定位器进行基于正则表达式的搜索,但是您可以使用多种方法来帮助您:

> contains()starts-with() XPath函数:

//div[contains(.,"Desired text")]
//div[starts-with(.,"Desired text")]

> preceding,preceding-sibling,followingfollowing-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

如何解决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单击复选框时,元素当前不可见

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

如何解决Python selenium 获取由 javascript?

我使用了一个名为“网易云音乐”的在线音乐播放器,我的帐户中有多个播放列表,它们包含数千首曲目,并且组织和分类非常糟糕,并且保存了重复条目,因此我想将它们导出为sql 表来组织它们。

我找到了一种不用客户端软件查看播放列表的方法,就是点击播放列表页面顶部的分享按钮,然后点击“复制链接”。

但在客户端以外的任何浏览器中打开链接,播放列表将限制为 1000 首曲目。

但我找到了克服它的方法,我安装了 Tampermonkey,然后安装了 this script。

现在我可以在浏览器中查看完整的播放列表。

这是一个 sample playlist。

播放列表如下所示:

enter image description here

第一列是歌曲名,第二列是时长,第三列是艺术家,最后一列是专辑。

第一列、第三列和第四列的文字分别是歌曲、艺术家和专辑页面的超链接。

我对 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">&nbsp;</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的相关知识,请在本站进行查询。

本文标签: