GVKun编程网logo

如何使用Selenium和Java提取表元素的id属性的动态值(selenium获取动态元素)

11

在本文中,您将会了解到关于如何使用Selenium和Java提取表元素的id属性的动态值的新资讯,同时我们还将为您解释selenium获取动态元素的相关在本文中,我们将带你探索如何使用Selenium

在本文中,您将会了解到关于如何使用Selenium和Java提取表元素的id属性的动态值的新资讯,同时我们还将为您解释selenium获取动态元素的相关在本文中,我们将带你探索如何使用Selenium和Java提取表元素的id属性的动态值的奥秘,分析selenium获取动态元素的特点,并给出一些关于Java Selenium如何使用sendkeys上传文件、javascript – 如何使用Selenium WebDriver访问动态添加的iframe?、javascript – 如何使用selenium获取CSS选择器的所有元素的直接子代?、RSelenium和Javascript的实用技巧。

本文目录一览:

如何使用Selenium和Java提取表元素的id属性的动态值(selenium获取动态元素)

如何使用Selenium和Java提取表元素的id属性的动态值(selenium获取动态元素)

我有一张表,其中每一行都会有一个下载链接,其中包含(部分)自动生成的id元素。原因是实际的href元素始终为“#”,因此ID分开了下载。

我需要在td中找到该id元素的名称。那就是:我知道表行有一个id元素,并且我知道部分名称,并且我需要获得确切的名称。

我一次访问每一行,因此我一次只需要查看一次即可。无需浏览整个表格。

我知道名称后如何查找元素。但是在我只知道类型的时候找到元素是另一回事。

...<tr> <td<ahref="#" id="downloadJournalPost-345">Download</a> </td></tr><tr> <td<ahref="#" id="downloadJournalPost-346">Download</a> </td></tr>...

我在网络驱动程序中找不到任何可以按类型查找元素的方法。

由于ID的名称为“ downloadJournalPost-
xxx”,因此仅更改xxx即可使用部分名称。但是链接文本是唯一可以找到的值,它使我可以搜索部分匹配项。

编辑:更完整的标记。

<td> <span>In <!----><est-ikon>  <div aria-hidden="true">   <svg focusable="false">    <use xlink:href="#ikon-pil3-inn"></use>   </svg>  </div></est-ikon><!----></span> <span> Application and attachments</span> <ahref="#" id="lastNedJournalPost-2892">Download journal post</a></td>

答案1

小编典典

要打印该元素的 id* 属性List ,您需要为引入 WebDriverWait ,并且可以使用 Java8
和,并且可以使用以下任一Locator
Strategies:
*____visibilityOfAllElementsLocatedBy()
__stream()map()

  • cssSelector

    List<String> myID = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("td.journalTable-journalPost>a.htext-small"))).stream().map(element->element.getAttribute("id")).collect(Collectors.toList());

    System.out.println(myIDs);

  • xpath

    List<String> myIDs = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//td[@journalTable-journalPost'']/a[@htext-small'' and text()=''Download'']"))).stream().map(element->element.getAttribute("id")).collect(Collectors.toList());

    System.out.println(myIDs);

Java Selenium如何使用sendkeys上传文件

Java Selenium如何使用sendkeys上传文件

下载和安装AutoIt

文件上传是自动化中棘手的部分,目前selenium并没有提供上传的实现api,所以知道借助外力来完成,如autoit、sikuli。

AutoIt , 这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)的自动化操作,利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务;

1.打开AutoIt的官网下载

Java selenium上传文件怎么实现

两种下载方法都可以,这里我想下载的是zip,解压出来如下图所示:

Java selenium上传文件怎么实现

立即学习“Java免费学习笔记(深入)”;

点击SciTe文件夹,我们打开脚本编辑器。

Java selenium上传文件怎么实现

打开百度图片上传窗口,打开AutoIt Windows Info 工具,鼠标移动到Finder Tool,按住鼠标左键拖动到需要识别的windows控件上。拖动元素定位器上那个靶点形状按钮到文件上传弹窗,能够捕获到一些元素信息。用鼠标拖住工具上的Finder Tool的图标(即图中蓝色圈圈部分)到要识别的控件上,控件的唯一标识信息会显示在工具的左侧部分(图中红框标出的部分)。从显示的结果得知,此控件的Title=“打开”,Class为Edit,Instance=1。我们就是利用控件的这些信息,定位控件,编写脚本。

Java selenium上传文件怎么实现

打开编辑器,根据控件Finder Tool识别到的信息来调用函数编写脚本;在AutoIt脚本编辑器里输入如下脚本,不要下面我写的备注哈。

我们这里需要知道有以下信息:

1.操作页面的title,用于固定操作的页面。
2.需要填入的信息,在输入框中填入“上传文件的路径及文件名”(windows操作)
3.点击“打开”按钮,实现文件上传。

根据以上所识别的控件信息,利用编辑器SciTE Script Editor,根据AutoIT的语法编写脚本。

实现文件上传需要的几个方法:

ControlFocus ( "窗口标题", "窗口文本", 控件ID)
---->设置输入焦点到指定窗口的某个控件上(即:控件ID“文件名”输入框的id)
WinWait ( "窗口标题" [, "窗口文本" [, 超时时间]] )
---->暂停脚本的执行直至指定窗口存在(出现)为止
ControlSetText ( "窗口标题", "窗口文本", 控件ID, "新文本" )
---->修改指定控件的文本(即:控件ID“文件名”输入框的id)
Sleep ( 延迟 )
---->使脚本暂停指定时间段
ControlClick ( "窗口标题", "窗口文本", 控件ID [, 按钮] [, 点击次数]] )
---->向指定控件发送鼠标点击命令(即:控件ID“打开”按钮的id)
登录后复制

其中,title即AutoIt Window Info识别出的Title字段,controlID即AutoIt Window Info识别出的Class和Instance的拼接,如上图拼接后的结果应为:Button1(即classnameNN)

Java selenium上传文件怎么实现

ControlFocus(("title","text",controllD)用于识别windows文件上传窗口
ControlFocus("打开","","")向文件名输入框输入本地要上传文件的路径
ControlSetText("打开","","Edit1","C:\Users\DELL\Desktop\test\upload\北京宏哥.jpeg")
Sleep(2000)点击上传窗口中的“打开“按钮
ControlClick("打开","","Button1")
登录后复制

保存脚本文件为ChromFileUpload.au3格式,然后在AutoIt脚本编辑器中点击Tools菜单,tools=>go,执行脚本验证(前提是windows窗口必须是打开状态),验证成功,如下图所示:
为了这个脚本能被java 程序调用,需要通过Compile Script to .exe (x64)工具生成exe文件(这个是通过.exe安装包安装的AutoIt)

AutoIt脚本编辑器中点击Tools菜单,选择compile,会在同路径下生成一个.exe的文件(这个是通过解压包安装的AutoIt)

Java selenium上传文件怎么实现

提示Conversion complete转化完成:将ChromeFileUpload.exe拷贝到项目下,待会在Selenium脚本要使用。
java代码

//实现文件上传。通过Runtime的静态方法获取Runtime对象
Runtime runtime = Runtime.getRuntime();
//通过Runtime对象调用exe方法
runtime.exec("C:\Users\DELL\Desktop\test\upload\ChromeFileUpload.exe");
登录后复制

以上就是Java Selenium如何使用sendkeys上传文件的详细内容,更多请关注php中文网其它相关文章!

javascript – 如何使用Selenium WebDriver访问动态添加的iframe?

javascript – 如何使用Selenium WebDriver访问动态添加的iframe?

我有一个没有iframe的页面,然后通过 JavaScript在点击一个锚点后添加一个iframe.

我遇到的问题是,当使用driver.switch_to_frame(x)切换到帧时,我仍然可以找到我的任何内容.

我已经尝试循环遍历使用driver.find_elements_by_tag_name(‘iframe’)找到的帧,并检查每个帧我期望找到的类,但没有这样的运气.

driver.switch_to_active_element()也没有给我正确的iframe.

我不确定iframe内容是否只是无法访问,因为JS DOM更改未反映在Selenium从驱动程序中看到的内容中.我已经为其他iframe完成了同样的过程而没有任何问题,但是这个只是不合作.以下是我正在处理的简化版本.

在JS之前:

<html>
    <body>
      <a onclick="jsmagic">load iframe</a>
    </body>
</html>

JS之后:

<html>
    <body>
      <iframe><div>Message</div></iframe>
      <a onclick="jsmagic">load iframe</a>
    </body>
</html>

Python WebDriver尝试:

driver.switch_to_frame(0)
driver.find_elements_by_class_name('modal')
driver.switch_to_default_content()

我也尝试了类似的变体:

frame = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to_frame(frame)
driver.find_elements_by_class_name('modal')

我曾尝试使用driver.execute_script来访问该对象,但获取内容超出了我的范围. Firefox控制台命令无法通过Selenium运行.

解决方法

这似乎是一个时间问题,我最终得到了以下几点:
def modal_must_show(self,string):
  for _ in range(12):
    for frame in self.driver.find_elements_by_tag_name('iframe'):
      try:
        if not frame.is_displayed():
          continue
        if frame.parent.page_source.find(string):
          return
      except:
        pass
  assert False,'Modal missing string'

javascript – 如何使用selenium获取CSS选择器的所有元素的直接子代?

javascript – 如何使用selenium获取CSS选择器的所有元素的直接子代?

我已经尝试使用“>”语法但硒不接受它,我知道有一种方法可以使用Xpath,但我们整个项目是使用CSS选择器编写的.

我正在尝试存储一个列表,它将包含元素的所有直接子代,但不包含其子(后代),当我使用“*”语法时,我得到所有元素的后代.

解决方法

你应该指定一个标签从…开始,如果你想要“所有元素的直接的孩子”,你只需要得到所有的元素,这不是真正的你想要的.

为了得到“所有直接的元素的孩子,而不是他们的孩子”的身体,使用身体> *.

或者另一个例子,为了得到< div id ='question'>的所有直接后代,使用div#question> *.

RSelenium和Javascript

RSelenium和Javascript

我对R相当精通,但是对javaScript和其他语言一无所知。我想访问有关此公开可用数据集的信息(http://fyed.elections.on.ca/fyed/zh-
CN/form_page_en.jsp)。尤其是,我在数据框中列出了几千个(A1A1A1)形式的邮政编码。我想将这些邮政编码中的每一个都提交到此网站,然后提取返回的选举区的名称。RSelenium似乎很理想,但是我无法弄清楚如何使JavaScript正常工作。我正在使用R
3.0.3和RSelenium_1.3的Mac OS 10.9.5。Firefox是第33版,Selenium是2.44。以下脚本有效。

require(RSelenium)
checkForServer()
startServer()
remDr<-remoteDriver()
remDr$open()
remDr$getStatus()
remDr$navigate("http://fyed.elections.on.ca/fyed/en/form_page_en.jsp")

#After inspecting the source code,you can see the input box has the id 'pcode',for postal code
webElem<-remDr$findElement(using = 'id',value = "pcode")
webElem$getElementAttribute('id')

#This is where I am stuck
remDr$executeScript(script='arguments[0].click(m1p4v4)',list(webElem))

#Utlimately,I have a list of several thousand postal codes,so I would like to create a loop     through to extract all the district names that are stored on the pages that are returned with a successful javascript (see previous command). Three real postal codes that return results are as follows:  
p.codes<-c('m1p4v4','n3t2y3','n2h3v1')

我觉得我只是不了解使这项工作所需的javascript命令或executeScript的语法。我将不胜感激。

今天的关于如何使用Selenium和Java提取表元素的id属性的动态值selenium获取动态元素的分享已经结束,谢谢您的关注,如果想了解更多关于Java Selenium如何使用sendkeys上传文件、javascript – 如何使用Selenium WebDriver访问动态添加的iframe?、javascript – 如何使用selenium获取CSS选择器的所有元素的直接子代?、RSelenium和Javascript的相关知识,请在本站进行查询。

本文标签: