如何通过页面上的位置获取元素?

时间:2016-08-28 00:32:28

标签: java selenium

问题:我想从页面中提取电话号码。每个号码都隐藏在名为"显示联系信息"的按钮下。在单击按钮之前,在dom中找不到这些数字。单击该按钮时,该按钮将被电话号码替换。

是否有可靠的方法在页面上按位置查找元素?如果是,那么我可以获取按钮的位置,单击它,然后在按钮位置获取电话号码。

以下是页面https://sfbay.craigslist.org/pen/apa/5753779484.html 一段时间后,此页面将被删除。当发生这种情况时,我可以提供类似的页面。

感谢。

我也尝试过只使用xpath而且失败了:

1 - 获取"之前的第一个兄弟元素;显示联系信息"的按钮。

2 - 使用1中的元素,单击按钮。按钮被电话号码取代。

3 - 再次使用1中的元素,获取电话号码的文字。

代码:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.ArrayList;
import java.util.List;

public class Temp {

    private static WebDriver browser = new ChromeDriver();

    public static List<String> get_phone_numbers() {
        String url = "https://sfbay.craigslist.org/pen/apa/5753779484.html";
        browser.get(url);

        List<String> phones = new ArrayList<String>();
        String text;
        String phone;
        WebElement contact;

        String before_contact_buttons_xpath = "//*[@id='postingbody']/a[contains(., 'show contact info')]/" +
                "preceding-sibling::*[1]";

        //Get all the preceding sibling elements of "show contact info button."
        List<WebElement> pre_contacts = browser.findElements(By.xpath(before_contact_buttons_xpath));

        for (WebElement pre_contact : pre_contacts) {
            //Click the "show contact info" button. It disappears after click & is replaced by an phone number.
            WebElement temp_contact_btn = pre_contact.findElement(By.xpath("following-sibling::*[1]"));
            System.out.println(temp_contact_btn.getText());
            temp_contact_btn.click();

            //Now get the number from the replaced "show contact info" button.
            contact = pre_contact.findElement(By.xpath("following-sibling::*[1]"));

            text = contact.getText();
            System.out.println(text);

            phone = "000-111-2222";//extract_phone_number(text);

            phones.add(phone);
        }
        return phones;
    }

    public static void main(String[] args) {
        List<String> phones = get_phone_numbers();
    }
}

输出:

show contact info
show contact info

1 个答案:

答案 0 :(得分:1)

在该页面上,单击按钮(实际上是<a>)会触发XMLHttpRequest,重新加载描述部分的全部内容。它似乎只是对<a>的{​​{1}}:https://sfbay.craigslist.org/fb/sfo/apa/5753779484做了GET请求。尝试转到该链接或右键单击“按钮”并在新选项卡中打开链接。

获得href元素之后,我建议在<a>请求页面,然后以某种方式解析内容以获取电话号码。假设没有任何其他电话号码,这对正则表达式来说不会太难。