Python+Selenium 元素获取及使用心得

Python+Selenium 元素获取及使用心得,第1张

1、获取输入框再输入信息的时候,发现send_keys会把内容输入到所获取输入框的隔壁框框(比如下一个框),排查一大通后发现,是因为待输入的数据前面包含个空格(这空格在Excel里还看不出来),send_keys方法会连空格也输入进去,元素定位并没有不准,这空格就是输入“跳框”的元凶。

解决的办法是检查待输入的源数据,strip去掉前后的空格。

2、直接定位元素的方法,比如Xpath和CSS Selector虽然方便,但是用多了程序健壮性会变差。想想也是,比如新开的页面里,按钮多一个少一个,或者顺序位置发生变化,元素就选错了,后面肯定就不按剧本走了。

这时候最好按id、class name来获取,如果不唯一,那就遍历循环判断(比如先找到父元素再遍历各个子元素),虽然程序运行效率会降低一些,但是程序跑起来的时候不容易挂。

关于效率问题其实也不用太纠结,我都纯用Selenium了我还在乎啥效率啊(手动狗头)

3、循环判断筛选元素的时候,get_attribute是个好东东,常见的比如text,scr,甚至onclick事件里的字符串都可以用来做判断。但是切记最好放在try里,遍历虽好,找到个空值就直接挂了。

# 定位 UI 元素 (WebElements)

find_element_by_id

find_elements_by_name

find_elements_by_xpath

find_elements_by_link_text

find_elements_by_partial_link_text

find_elements_by_tag_name

find_elements_by_class_name

find_elements_by_css_selector

# 获取元素数据

eleget_attribute('href')

eletext

eleinner

eleget_attribute('outerHTML')

eleget_attribute('innerHTML')

# 导入 ActionChains 类

from seleniumwebdriver import ActionChains

# 鼠标移动到 ac 位置

ac = driverfind_element_by_xpath('element')

ActionChains(driver)move_to_element(ac)perform()

# 在 ac 位置单击

ac = driverfind_element_by_xpath("elementA")

ActionChains(driver)move_to_element(ac)click(ac)perform()

# 在 ac 位置双击

ac = driverfind_element_by_xpath("elementB")

ActionChains(driver)move_to_element(ac)double_click(ac)perform()

# 在 ac 位置右击

ac = driverfind_element_by_xpath("elementC")

ActionChains(driver)move_to_element(ac)context_click(ac)perform()

# 在 ac 位置左键单击 hold 住

ac = driverfind_element_by_xpath('elementF')

ActionChains(driver)move_to_element(ac)click_and_hold(ac)perform()

# 将 ac1 拖拽到 ac2 位置

ac1 = driverfind_element_by_xpath('elementD')

ac2 = driverfind_element_by_xpath('elementE')

ActionChains(driver)drag_and_drop(ac1, ac2)perform()

# 导入 Select 类

from seleniumwebdriversupportui import Select

select = Select(driverfind_element_by_name('status')

selectselect_by_visible_text("审核不通过")

# 页面切换

driverswitch_towindow("window name")

#  *** 作页面的前进和后退

driverforward()  

driverback()

# 页面等待

## 隐式等待

driverimplicitly_wait(10)

## 显示等待

try: # 页面一直循环,直到 id="myElement" 出现

element = WebDriverWait(driver, 10)until(ECpresence_of_element_located((ByID, "myElement")))

finally:

driverquit()

给你一个实现的方案:假设这个table的id为“table”

public void clickName(String name){

    //获取table的总行数

    //如果/table/tbody中的tr有class属性为"tr",且在tbody之外没有控件的class属性是这个

    int rowNum = driverfindElements(ByclassName("tr"))size();

    //如果没有上面那个条件,则使用tagName获取tbody内的行数

    int rowNum = driverfindElement(Byxpath("//table[@id = 'table']/tbody"))

                    findElements(BytagName("tr"))size();

    //循环获取每一行的姓名,和传入的Name比较,是的话勾选方括号

     for(int i = 1;i<=rowNum;i++){

         String rowName = driverfindElement(Byxpath("//table[@id='table']/tbody/tr["+i+"]")/td[3]))getText();

         if(nameequals(rowName)){

             driverfindElement("//table[@id='table']/tbody/tr["+i+"]")/td[1]))click();

             break;

         }

     } 

}

//大概的代码应该是这样,太久没写了,如果点击名字可以勾选到的话实现起来就更加简单。

1获取当前网页标题:String title=drivergetTitle();

2获取当前网页的URL:String url=drivergetCurrentUrl();

3获取元素的文本值,比如链接,纯文本等:String text=driverfindElement(By location)getText();

4获取元素指定属性的值:String attribute=driverfindElement(By location)getAttribute("属性"); //这里的参数可以是class、name等任意属性

5获取元素输入框内的文本值:String attribute=driverfindElement(By location)getAttribute("value");

6获取元素标签名称:String tagName=driverfindElement(By location)getTagName();

1是否显示:使用elementis_displayed()方法。

2是否存在:使用find_element_by_xxx()方法,捕获其抛出的异常, 如果存在异常的话则可以确定该元素不存在。

3是否被选中:一般判断表单元素,如radio或checkbox是否被选中,使用elementis_selected()方法( 返回true代表已被选中,返回false代表未被选中 )。

4是否有效:即是否为灰化状态,使用elementis_enabled()方法( 可用于判断button/checkbox/radio是否置灰 )。

AJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。

因为传统的网页在传输数据格式方面,使用的是 XML 语法,因此叫做 AJAX ,其实现在数据交互基本上都是使用 JSON 。使用AJAX加载的数据,即使使用了JS将数据渲染到了浏览器中,在 右键->查看网页源代码 还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。

法1:直接分析ajax调用的接口。然后通过代码请求这个接口。

法2:使用Selenium+chromedriver模拟浏览器行为获取数据。

Selenium 相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。 chromedriver 是一个驱动 Chrome 浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:

现在以一个简单的获取百度首页的例子来讲下 Selenium 和 chromedriver 如何快速入门:

参考:Selenium的使用

直接直接分析ajax调用的接口爬取

selenium结合lxml爬取

之前在自己电脑上写的代码测试运行非常完美,于是特别转移到了单独的一台笔记本上运行。

运行了几天之后发现有问题。selenium在抓取数据的时候莫名其妙的有一部分数据抓取不到。

分析代码呀什么的都没问题呀,奇了怪了。

三个td

前两个td里面的内容抓取的一点问题都没有,但是抓取第三个的时候就总是出错,用我自己的电脑测试就是好的。

我一度怀疑是不是我的笔记本电脑有什么驱动或者硬件导致的问题。

前两个能抓取到,shuliang抓取不到。如果我把shuliang里面的td[5]换成td[4]就是抓取他前面那一个元素,也是没问题的。但是我换成td[6]抓取他后面的元素就不行。

最后我发现有可能是selenium打开的chrome浏览器大小的问题,因为浏览器里面打开的页面正好只能显示到td[4],第5列显示不出来。

于是加一行代码

控制一下打开浏览器的大小,测试成功。shuliang成功抓取到了数据。

看来selenium真的是不是所见即所得的抓取模式,浏览器里面遮住的部分,他就抓不到了。

这可能也是很多selenium写好的代码换到别的电脑上执行就会出错的一个原因之一吧。

今天的分享记录就到这了。

第一种用jQuery的val方法:

js = "return $('input')val();"

driverexecute_script(js)

第二种用jQuery的attr方法:

js = "return $('input')attr('value');"

driverexecute_script(js)

第三种用selenium自带的方法:

driverfind_element_by_tag_name('input')get_attribute('value')

以上就是关于Python+Selenium 元素获取及使用心得全部的内容,包括:Python+Selenium 元素获取及使用心得、自动化selenium 基本 *** 作方法总结、selenium如何处理table 如何实现勾选红框标注的那条数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9328776.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存